langchain-ai/deepagents · error · RuntimeError

Cannot create an MCP session after cleanup

Error message

Cannot create an MCP session after cleanup

What it means

_create_entry (invoked lazily by get_session) raises RuntimeError if the manager was closed, since no new sessions can be created after cleanup.

Source

Thrown at libs/code/deepagents_code/mcp_tools.py:779

            self._locks[server_name] = lock
        return lock

    async def _create_entry(self, server_name: str) -> _MCPSessionEntry:
        """Create and initialize a new cached session entry.

        Args:
            server_name: MCP server name.

        Returns:
            A cached session entry containing the live session and close stack.

        Raises:
            RuntimeError: If the manager has already been cleaned up.
            ValueError: If `server_name` is not configured in the manager.
        """
        if self._closed:
            msg = "Cannot create an MCP session after cleanup"
            raise RuntimeError(msg)

        try:
            connection = self._connections[server_name]
        except KeyError as exc:
            msg = (
                f"Couldn't find an MCP server named '{server_name}', "
                f"expected one of {sorted(self._connections)}"
            )
            raise ValueError(msg) from exc

        exit_stack = AsyncExitStack()
        try:
            session = await exit_stack.enter_async_context(
                _create_mcp_session(connection, server_name=server_name)
            )
            await session.initialize()
        except BaseException:
            # Close the partially entered stack in *this* task before

View on GitHub (pinned to a1af029e6e)

Solutions

  1. Recreate the manager and reconfigure it before calling get_session
  2. Ensure all get_session calls complete before close()
  3. Guard get_session behind a manager-open check

Example fix

// before
await manager.close()
await manager.get_session('fs')  # raises
// after
await manager.close()
manager = MCPSessionManager()
await manager.configure(connections)
await manager.get_session('fs')
Defensive patterns

Strategy: try-catch

Try / catch

try:
    session = await manager.get_session(server)
except RuntimeError as e:
    if 'after cleanup' in str(e):
        manager = MCPSessionManager()
        await manager.configure(connections)
        session = await manager.get_session(server)
    else:
        raise

Prevention

When it happens

Trigger: Calling get_session(server_name) after close()/cleanup; holding a manager reference past app shutdown and reusing it.

Common situations: Background tasks or request handlers still using a manager that a shutdown hook already closed; tests tearing down fixtures while coroutines are pending.

Related errors


AI-assisted analysis of langchain-ai/deepagents@a1af029e6e (2026-08-29). Data as JSON: /api/errors/39f164ee720a7530. Report an issue: GitHub.