from fastapi import APIRouter, HTTPException from typing import Dict, Any from pydantic import BaseModel import httpx from app.core.config import settings router = APIRouter() class MCPToolRequest(BaseModel): tool_name: str parameters: Dict[str, Any] class MCPAnalysisRequest(BaseModel): analysis_type: str # "RULE_VALIDATION", "MARKET_ANALYSIS", "RISK_ASSESSMENT" data: Dict[str, Any] @router.get("/status") async def get_mcp_status(): """MCP 서버 상태 확인""" try: async with httpx.AsyncClient() as client: response = await client.get(f"{settings.MCP_SERVER_URL}/health", timeout=5.0) if response.status_code == 200: health_data = response.json() return { "status": "connected", "mcp_server_url": settings.MCP_SERVER_URL, "claude_configured": health_data.get("claude_configured", False), "ai_provider": health_data.get("ai_provider", "unknown"), "details": health_data } else: return { "status": "error", "message": "MCP server responded with error" } except Exception as e: return { "status": "disconnected", "message": str(e) } @router.post("/tools/call") async def call_mcp_tool(request: MCPToolRequest): """MCP 도구 호출""" try: async with httpx.AsyncClient() as client: response = await client.post( f"{settings.MCP_SERVER_URL}/tools/call", json={ "tool_name": request.tool_name, "parameters": request.parameters }, timeout=30.0 ) if response.status_code == 200: return response.json() else: raise HTTPException( status_code=response.status_code, detail=f"MCP tool call failed: {response.text}" ) except httpx.TimeoutException: raise HTTPException(status_code=504, detail="MCP server timeout") except Exception as e: raise HTTPException(status_code=500, detail=f"Failed to call MCP tool: {str(e)}") @router.post("/analyze") async def analyze_with_claude(request: MCPAnalysisRequest): """Claude AI를 통한 분석 요청""" try: async with httpx.AsyncClient() as client: response = await client.post( f"{settings.MCP_SERVER_URL}/analyze", json={ "analysis_type": request.analysis_type, "data": request.data }, timeout=60.0 ) if response.status_code == 200: return response.json() else: raise HTTPException( status_code=response.status_code, detail=f"Claude analysis failed: {response.text}" ) except httpx.TimeoutException: raise HTTPException(status_code=504, detail="Analysis timeout") except Exception as e: raise HTTPException(status_code=500, detail=f"Failed to analyze: {str(e)}") @router.get("/tools") async def list_mcp_tools(): """사용 가능한 MCP 도구 목록""" try: async with httpx.AsyncClient() as client: response = await client.get(f"{settings.MCP_SERVER_URL}/tools", timeout=10.0) if response.status_code == 200: return response.json() else: raise HTTPException( status_code=response.status_code, detail="Failed to fetch tools list" ) except Exception as e: raise HTTPException(status_code=500, detail=f"Failed to list tools: {str(e)}")