{"status":"pass","category":"SDK","severity":"high","evidence":["src/swiss_environment_mcp/server.py:331-348 — @asynccontextmanager lifespan(server), ruft api.startup() vor yield und api.shutdown() im finally.","src/swiss_environment_mcp/server.py:351-363 — FastMCP('swiss_environment_mcp', lifespan=lifespan, ...).","src/swiss_environment_mcp/api_client.py:192-226 — einzelner geteilter httpx.AsyncClient (_client global, lazy via get_client()), startup() initialisiert, shutdown() schliesst via aclose().","Kein httpx.AsyncClient() pro Tool-Call — alle Fetcher nutzen get_client()."],"gaps":[],"evaluator_notes":"Lifespan-Pattern korrekt: Ressource (HTTP-Client mit DNS-Pinning-Transport) einmalig erzeugt, Cleanup im finally. Single-Server-Setup, daher kein AsyncExitStack noetig."}
