122 lines
3.9 KiB
Python
122 lines
3.9 KiB
Python
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=2.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)}")
|