Files
chat-bot/api/mcp.py
lychang 64ce30fdfd init
2025-08-26 09:35:29 +08:00

114 lines
3.8 KiB
Python

from typing import Dict
from fastapi import HTTPException
from api.base import app
from extension.mcp import mcp_manager
# manager
@app.get("/api/mcp/services", response_model=Dict)
async def get_mcp_services():
"""获取所有MCP服务器状态"""
return {
'services': [dict(service) for service in mcp_manager.list_services()],
'status': mcp_manager.get_status()
}
@app.post("/api/mcp/services", response_model=Dict)
async def create_mcp_service(data: Dict):
"""创建新的MCP服务"""
name = data.get('name')
endpoint = data.get('endpoint')
protocol = data.get('protocol')
if not name or not endpoint or not protocol:
raise HTTPException(status_code=400, detail='服务器名称、端点和协议不能为空')
try:
result = mcp_manager.create_service(name, endpoint, protocol, data.get('config'))
return result
except ValueError as e:
raise HTTPException(status_code=400, detail=str(e)) from e
@app.delete("/api/mcp/services/{service_id}", response_model=Dict)
async def delete_mcp_service(service_id: str):
"""删除MCP服务"""
try:
result = mcp_manager.delete_service(service_id)
return result
except ValueError as e:
raise HTTPException(status_code=404, detail=str(e)) from e
@app.get("/api/mcp/services/{service_id}/start", response_model=Dict)
async def start_mcp_service(service_id: str):
"""启动MCP服务"""
try:
result = mcp_manager.start_service(service_id)
return result
except ValueError as e:
raise HTTPException(status_code=400, detail=str(e)) from e
except Exception as e:
raise HTTPException(status_code=500, detail=f'启动失败: {str(e)}') from e
@app.get("/api/mcp/services/{service_id}/stop", response_model=Dict)
async def stop_mcp_service(service_id: str):
"""停止MCP服务"""
try:
result = mcp_manager.stop_service(service_id)
return result
except ValueError as e:
raise HTTPException(status_code=404, detail=str(e)) from e
except Exception as e:
raise HTTPException(status_code=500, detail=f'停止失败: {str(e)}') from e
@app.get("/api/mcp/services/{service_id}/restart", response_model=Dict)
async def restart_mcp_service(service_id: str):
"""重启MCP服务"""
try:
result = mcp_manager.restart_service(service_id)
return result
except ValueError as e:
raise HTTPException(status_code=400, detail=str(e)) from e
except Exception as e:
raise HTTPException(status_code=500, detail=f'重启失败: {str(e)}') from e
@app.get("/api/mcp/services/{service_id}/status", response_model=Dict)
async def get_mcp_service_status(service_id: str):
"""获取指定MCP服务的状态"""
try:
# Find service by ID
service = next((s for s in mcp_manager.services.values() if str(s.id) == service_id), None)
if not service:
raise HTTPException(status_code=404, detail=f'Service {service_id} not found')
return {
'id': service.id,
'name': service.name,
"instance": service.instance_name,
'endpoint': service.endpoint,
'protocol': service.protocol.name,
'status': service.status,
'config': service.config if service.config else {}
}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e)) from e
@app.put("/api/mcp/services/{service_id}", response_model=Dict)
async def update_mcp_service(service_id: str, data: Dict):
"""更新MCP服务配置"""
try:
result = mcp_manager.update_service(service_id, **data)
return result
except ValueError as e:
raise HTTPException(status_code=404, detail=str(e)) from e
except Exception as e:
raise HTTPException(status_code=500, detail=str(e)) from e