83 lines
2.7 KiB
Python
83 lines
2.7 KiB
Python
|
|
import json
|
||
|
|
import uuid
|
||
|
|
from typing import List, Optional
|
||
|
|
from pathlib import Path
|
||
|
|
|
||
|
|
from fastapi import APIRouter, HTTPException, Depends
|
||
|
|
from pydantic import BaseModel
|
||
|
|
|
||
|
|
from app.schemas.mcp import MCPServer, MCPServerCreate, MCPServerUpdate
|
||
|
|
from app.core.data_root import get_data_root
|
||
|
|
|
||
|
|
router = APIRouter()
|
||
|
|
|
||
|
|
def get_mcp_servers_file() -> Path:
|
||
|
|
return get_data_root() / "mcp_servers.json"
|
||
|
|
|
||
|
|
def read_mcp_servers() -> List[dict]:
|
||
|
|
file_path = get_mcp_servers_file()
|
||
|
|
if not file_path.exists():
|
||
|
|
return []
|
||
|
|
try:
|
||
|
|
with open(file_path, "r", encoding="utf-8") as f:
|
||
|
|
return json.load(f)
|
||
|
|
except json.JSONDecodeError:
|
||
|
|
return []
|
||
|
|
|
||
|
|
def write_mcp_servers(servers: List[dict]) -> None:
|
||
|
|
file_path = get_mcp_servers_file()
|
||
|
|
with open(file_path, "w", encoding="utf-8") as f:
|
||
|
|
json.dump(servers, f, indent=2, ensure_ascii=False)
|
||
|
|
|
||
|
|
@router.get("/mcp", response_model=List[MCPServer])
|
||
|
|
def list_mcp_servers(project_id: Optional[int] = None):
|
||
|
|
servers = read_mcp_servers()
|
||
|
|
if project_id is not None:
|
||
|
|
servers = [s for s in servers if s.get("project_id") == project_id]
|
||
|
|
return servers
|
||
|
|
|
||
|
|
@router.post("/mcp", response_model=MCPServer)
|
||
|
|
def create_mcp_server(server_in: MCPServerCreate):
|
||
|
|
servers = read_mcp_servers()
|
||
|
|
|
||
|
|
server_data = server_in.dict()
|
||
|
|
server_data["id"] = str(uuid.uuid4())
|
||
|
|
if "status" not in server_data or not server_data["status"]:
|
||
|
|
server_data["status"] = "disconnected"
|
||
|
|
|
||
|
|
servers.append(server_data)
|
||
|
|
write_mcp_servers(servers)
|
||
|
|
return server_data
|
||
|
|
|
||
|
|
@router.get("/mcp/{server_id}", response_model=MCPServer)
|
||
|
|
def get_mcp_server(server_id: str):
|
||
|
|
servers = read_mcp_servers()
|
||
|
|
for server in servers:
|
||
|
|
if server.get("id") == server_id:
|
||
|
|
return server
|
||
|
|
raise HTTPException(status_code=404, detail="MCP Server not found")
|
||
|
|
|
||
|
|
@router.put("/mcp/{server_id}", response_model=MCPServer)
|
||
|
|
def update_mcp_server(server_id: str, server_in: MCPServerUpdate):
|
||
|
|
servers = read_mcp_servers()
|
||
|
|
for i, server in enumerate(servers):
|
||
|
|
if server.get("id") == server_id:
|
||
|
|
update_data = server_in.dict(exclude_unset=True)
|
||
|
|
for key, value in update_data.items():
|
||
|
|
server[key] = value
|
||
|
|
servers[i] = server
|
||
|
|
write_mcp_servers(servers)
|
||
|
|
return server
|
||
|
|
raise HTTPException(status_code=404, detail="MCP Server not found")
|
||
|
|
|
||
|
|
@router.delete("/mcp/{server_id}")
|
||
|
|
def delete_mcp_server(server_id: str):
|
||
|
|
servers = read_mcp_servers()
|
||
|
|
filtered_servers = [s for s in servers if s.get("id") != server_id]
|
||
|
|
|
||
|
|
if len(servers) == len(filtered_servers):
|
||
|
|
raise HTTPException(status_code=404, detail="MCP Server not found")
|
||
|
|
|
||
|
|
write_mcp_servers(filtered_servers)
|
||
|
|
return {"status": "success"}
|