← Files NGS Analysis WorkbenchARCHIVED FILE

mcp/rosalind_logging/mcp.py

1.54 KB · Oct 8, 2026 · 00:04 UTC

↓ Download file

See the change to this file →

"""Log server lifecycle and MCP failures without exporting request content."""

from __future__ import annotations

from collections.abc import Iterable, Sequence
from typing import Any

from mcp.server.fastmcp import FastMCP
from mcp.server.fastmcp.server import ReadResourceContents
from mcp.types import ContentBlock
from pydantic import AnyUrl

from . import get_server_logger


class LoggedFastMCP(FastMCP):
    def __init__(self, name: str, **settings: Any) -> None:
        super().__init__(name, **settings)
        self.server_logger = get_server_logger(name)

    async def call_tool(
        self, name: str, arguments: dict[str, Any]
    ) -> Sequence[ContentBlock] | dict[str, Any]:
        try:
            return await super().call_tool(name, arguments)
        except Exception:
            self.server_logger.error("MCP tool request failed", {"errorCode": "TOOL_FAILED"})
            raise

    async def read_resource(self, uri: AnyUrl | str) -> Iterable[ReadResourceContents]:
        try:
            return await super().read_resource(uri)
        except Exception:
            self.server_logger.error(
                "MCP resource request failed", {"errorCode": "RESOURCE_FAILED"}
            )
            raise

    def run_logged(self) -> None:
        try:
            self.server_logger.info("MCP server started")
            self.run(transport="stdio")
        except Exception:
            self.server_logger.error("MCP server failed", {"errorCode": "SERVER_FAILED"})
            raise
        finally:
            self.server_logger.close()

SHA-256: e5c1aa204021a1e1ce7b7e4384c3493d3b91b584e7371cfd8fd3c7b9ddf8798b