from fastapi import APIRouter, Request, HTTPException, Depends
from typing import Optional
import logging
from ..schemas import ExecuteRequest, TokenData
from ..core.services import delegate_to_service
logger = logging.getLogger(__name__)
router = APIRouter(prefix="/mcp", tags=["mcp"])
@router.post("/execute")
async def execute_mcp_request(
request: ExecuteRequest,
http_request: Request
) -> dict:
"""
Execute MCP request for a specific service
Args:
request: ExecuteRequest containing service_name and payload
http_request: FastAPI request object containing user_id in state
Returns:
dict: Response from the service delegate
Raises:
HTTPException: If user_id is not found in request state
"""
try:
# Extract user_id from request state (set by AuthMiddleware)
user_id = getattr(http_request.state, 'user_id', None)
if user_id is None:
logger.error("User ID not found in request state")
raise HTTPException(
status_code=401,
detail="Authentication required"
)
logger.info(f"Processing MCP request for service: {request.service_name}, user_id: {user_id}")
# Delegate to service handler
result = await delegate_to_service(
service_name=request.service_name,
payload=request.payload,
user_id=user_id
)
logger.info(f"MCP request completed for service: {request.service_name}")
return result
except HTTPException:
raise
except Exception as e:
logger.error(f"Error processing MCP request: {e}")
raise HTTPException(
status_code=500,
detail=f"Internal server error: {str(e)}"
)
@router.get("/services")
async def list_available_services():
"""
List available services for MCP integration
Returns:
dict: List of available services
"""
available_services = [
"github",
"vercel",
"linear",
"notion",
"slack",
"discord",
"google_workspace"
]
return {
"services": available_services,
"count": len(available_services)
}
@router.get("/status")
async def mcp_status():
"""
Get MCP service status
Returns:
dict: Status information
"""
return {
"status": "active",
"version": "1.0.0",
"services_count": 7,
"uptime": "active"
}