myrmidon / python /src /mcp_server /features /infra_tools.py
tek Atrust
chore(deploy): build monolithic server for Hugging Face
d5ef46f
Raw
History Blame Contribute Delete
3.64 kB
"""
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()})