{"record":{"id":"a015bdd2c0f32a0d","repo":"FoundationAgents/OpenManus","slug":"session-not-initialized-for-server-server-id","errorCode":null,"errorMessage":"Session not initialized for server {server_id}","messagePattern":"Session not initialized for server (.+?)","errorType":"exception","errorClass":"RuntimeError","httpStatus":null,"severity":"error","filePath":"app/tool/mcp.py","lineNumber":101,"sourceCode":"\n        exit_stack = AsyncExitStack()\n        self.exit_stacks[server_id] = exit_stack\n\n        server_params = StdioServerParameters(command=command, args=args)\n        stdio_transport = await exit_stack.enter_async_context(\n            stdio_client(server_params)\n        )\n        read, write = stdio_transport\n        session = await exit_stack.enter_async_context(ClientSession(read, write))\n        self.sessions[server_id] = session\n\n        await self._initialize_and_list_tools(server_id)\n\n    async def _initialize_and_list_tools(self, server_id: str) -> None:\n        \"\"\"Initialize session and populate tool map.\"\"\"\n        session = self.sessions.get(server_id)\n        if not session:\n            raise RuntimeError(f\"Session not initialized for server {server_id}\")\n\n        await session.initialize()\n        response = await session.list_tools()\n\n        # Create proper tool objects for each server tool\n        for tool in response.tools:\n            original_name = tool.name\n            tool_name = f\"mcp_{server_id}_{original_name}\"\n            tool_name = self._sanitize_tool_name(tool_name)\n\n            server_tool = MCPClientTool(\n                name=tool_name,\n                description=tool.description,\n                parameters=tool.inputSchema,\n                session=session,\n                server_id=server_id,\n                original_name=original_name,\n            )","sourceCodeStart":83,"sourceCodeEnd":119,"githubUrl":"https://github.com/FoundationAgents/OpenManus/blob/52a13f2a57d8c7f6737eefb02ccf569594d44273/app/tool/mcp.py#L83-L119","documentation":"Raised by MCPClient._initialize_and_list_tools (app/tool/mcp.py:101) when the given server_id has no entry in self.sessions. It is a RuntimeError indicating an internal ordering bug: the helper is supposed to be called immediately after a session is registered by connect_sse/connect_stdio, so reaching it without a session means the key never matched (e.g. server_id normalization mismatch) or the session was concurrently removed.","triggerScenarios":"Calling _initialize_and_list_tools directly without a prior successful connect; a race where disconnect(server_id) ran between registration and initialization; server_id differing between the connect call and the lookup (e.g. one used a URL-derived id, the other a custom id, or a sanitization step changed the key).","commonSituations":"Custom integrations that reuse the private helper instead of the public connect methods; concurrent reconnect logic that disconnects while another task initializes; server_id values containing characters that get sanitized in tool names but not consistently in session keys.","solutions":["Do not call _initialize_and_list_tools directly; use connect_sse/connect_stdio, which register the session first.","Use the exact same server_id for connect/disconnect/initialize — derive it once and pass it everywhere.","Guard concurrent access: serialize connect/disconnect per server_id (e.g. an asyncio.Lock keyed by server_id) so a disconnect cannot interleave with initialization.","If invoking manually, check membership first: `if server_id not in mcp.sessions: await mcp.connect_*(...)`."],"exampleFix":"// before\nawait mcp._initialize_and_list_tools('fs')  # RuntimeError if never connected\n\n// after\nif 'fs' not in mcp.sessions:\n    await mcp.connect_stdio('npx', ['-y', '@modelcontextprotocol/server-filesystem'], server_id='fs')\n# session is initialized and tools listed by connect itself","handlingStrategy":"validation","validationCode":"if server_id not in mcp.sessions:\n    await mcp.connect_stdio(cmd, args, server_id=server_id)  # connect initializes+lists\n# session is now guaranteed initialized","typeGuard":"def session_ready(mcp, server_id: str) -> bool:\n    return server_id in mcp.sessions and mcp.sessions[server_id] is not None","tryCatchPattern":"try:\n    await call_tool(f'mcp_{server_id}_{tool_name}', args)\nexcept RuntimeError as e:\n    if 'Session not initialized' in str(e):\n        await mcp.connect_stdio(cmd, args, server_id=server_id)  # reconnect once\n        await call_tool(f'mcp_{server_id}_{tool_name}', args)\n    else:\n        raise","preventionTips":["Never call private helpers (_initialize_and_list_tools); use connect_sse/connect_stdio.","Derive server_id once and reuse it for connect, calls, and disconnect.","Serialize connect/disconnect per server_id with an asyncio.Lock to avoid racing initialization."],"tags":["mcp","session","internal-api","async"],"backgroundTag":null,"analyzedSha":"52a13f2a57d8c7f6737eefb02ccf569594d44273","analyzedAt":"2026-08-15T02:33:49.993Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}