Context managers in MCP servers
MCP allows you to control the lifecycle management of your resources. Let’s have a look at some code:
async def load_settings() -> dict:
    """Load settings from a configuration file."""
    # Simulate loading settings
    return {"setting1": "value1", "setting2": "value2"}
@asynccontextmanager
async def server_lifespan(server: Server) -> AsyncIterator[dict]:
    """Manage server startup and shutdown lifecycle."""
    # Initialize resources on startup
    db = await Database.connect()
    settings = await load_settings()
    try:
        yield {"db": db, "settings": settings}
    finally:
        # Clean up on shutdown
        await db.disconnect()
    Here, we’ve done several things:
- Defined an asynchronous context manager, 
server_lifespan, that manages the lifecycle of the server - Initialized...