darkfire514's picture
Upload 160 files
399b80c verified
"""
Session manager for MCP connections.
This module provides a session manager for MCP connections,
which handles authentication, initialization, and tool discovery.
"""
from typing import Any, Dict
from openspace.grounding.backends.mcp.transport.connectors import MCPBaseConnector
from openspace.grounding.backends.mcp.tool_converter import convert_mcp_tool_to_base_tool
from openspace.grounding.core.session import BaseSession
from openspace.grounding.core.types import BackendType
from openspace.utils.logging import Logger
logger = Logger.get_logger(__name__)
class MCPSession(BaseSession):
"""Session manager for MCP connections.
This class manages the lifecycle of an MCP connection, including
authentication, initialization, and tool discovery.
"""
def __init__(
self,
connector: MCPBaseConnector,
*,
session_id: str = "",
auto_connect: bool = True,
auto_initialize: bool = True,
) -> None:
"""Initialize a new MCP session.
Args:
connector: The connector to use for communicating with the MCP implementation.
session_id: Unique identifier for this session
auto_connect: Whether to automatically connect to the MCP implementation.
auto_initialize: Whether to automatically initialize the session.
"""
super().__init__(
connector=connector,
session_id=session_id,
backend_type=BackendType.MCP,
auto_connect=auto_connect,
auto_initialize=auto_initialize,
)
async def initialize(self) -> Dict[str, Any]:
"""Initialize the MCP session and discover available tools.
Returns:
The session information returned by the MCP implementation.
"""
# Make sure we're connected
if not self.is_connected and self.auto_connect:
await self.connect()
# Initialize the session through connector
logger.debug(f"Initializing MCP session {self.session_id}")
session_info = await self.connector.initialize()
# List tools from MCP server and convert to BaseTool
mcp_tools = self.connector.tools # MCPBaseConnector caches tools after initialize
logger.debug(f"Converting {len(mcp_tools)} MCP tools to BaseTool")
self.tools = [
convert_mcp_tool_to_base_tool(mcp_tool, self.connector)
for mcp_tool in mcp_tools
]
logger.debug(f"MCP session {self.session_id} initialized with {len(self.tools)} tools")
return session_info