| """ |
| Infrastructure and Monitoring tools for Archon MCP Server. |
| """ |
|
|
| import json |
| import logging |
| import time |
| from datetime import datetime |
|
|
| from mcp.server.fastmcp import Context, FastMCP |
| from starlette.requests import Request |
| from starlette.responses import JSONResponse, Response |
|
|
| from src.server.services.mcp_session_manager import get_session_manager |
|
|
| from ..core import perform_health_checks |
|
|
| logger = logging.getLogger(__name__) |
|
|
|
|
| def register_infra_tools(mcp: FastMCP): |
| """Register infrastructure tools with the MCP server.""" |
|
|
| @mcp.custom_route("/sessions", methods=["GET"]) |
| async def get_sessions(request: Request) -> Response: |
| """Get active session count from FastMCP internal state.""" |
| active_sessions = 0 |
| try: |
| if hasattr(mcp, "session_manager"): |
| if hasattr(mcp.session_manager, "_server_instances"): |
| active_sessions = len(mcp.session_manager._server_instances) |
| except Exception as e: |
| logger.error(f"Failed to get active sessions: {e}") |
|
|
| return JSONResponse({"active_sessions": active_sessions}) |
|
|
| @mcp.tool() |
| async def health_check(ctx: Context) -> str: |
| """Check health status of MCP server and dependencies.""" |
| try: |
| context = getattr(ctx.request_context, "lifespan_context", None) |
| if context is None: |
| return json.dumps( |
| { |
| "success": True, |
| "status": "starting", |
| "message": "MCP server is initializing...", |
| "timestamp": datetime.now().isoformat(), |
| } |
| ) |
|
|
| if hasattr(context, "health_status") and context.health_status: |
| await perform_health_checks(context) |
| return json.dumps( |
| { |
| "success": True, |
| "health": context.health_status, |
| "uptime_seconds": time.time() - context.startup_time, |
| "timestamp": datetime.now().isoformat(), |
| } |
| ) |
| else: |
| return json.dumps( |
| { |
| "success": True, |
| "status": "ready", |
| "message": "MCP server is running", |
| "timestamp": datetime.now().isoformat(), |
| } |
| ) |
| except Exception as e: |
| logger.error(f"Health check failed: {e}") |
| return json.dumps({"success": False, "error": str(e), "timestamp": datetime.now().isoformat()}) |
|
|
| @mcp.tool() |
| async def session_info(ctx: Context) -> str: |
| """Get current and active session information.""" |
| try: |
| session_manager = get_session_manager() |
| session_info_data = { |
| "active_sessions": session_manager.get_active_session_count(), |
| "session_timeout": session_manager.timeout, |
| } |
| context = getattr(ctx.request_context, "lifespan_context", None) |
| if context and hasattr(context, "startup_time"): |
| session_info_data["server_uptime_seconds"] = time.time() - context.startup_time |
|
|
| return json.dumps( |
| {"success": True, "session_management": session_info_data, "timestamp": datetime.now().isoformat()} |
| ) |
| except Exception as e: |
| logger.error(f"Session info failed: {e}") |
| return json.dumps({"success": False, "error": str(e), "timestamp": datetime.now().isoformat()}) |
|
|