/** * AsyncLocalStorage-based propagation del mcpSessionId a los handlers de las tools. * * En el transporte HTTP, el servidor MCP multiplexa muchas sesiones concurrentes * en un mismo proceso Node. Como los handlers de las tools no reciben el * `mcp-session-id` directamente (solo lo que el SDK les pase en `extra`), usamos * AsyncLocalStorage para propagar el identificador desde el handler HTTP * (`POST /mcp`, `GET /sse`, `POST /message`) hasta la tool, y de ahi a helpers * como `getCurrentProjectInfo` que resuelven `project_dir` desde las * credenciales de la sesion (no desde `process.env`). * * En modo stdio no hace falta: cada subprocess tiene su propio env. */ import { AsyncLocalStorage } from "node:async_hooks"; export const sessionContext = new AsyncLocalStorage(); /** * Envuelve la ejecucion de `fn` dentro del contexto de la sesion `mcpSessionId`. * Cualquier llamada a `getCurrentSessionId()` dentro de `fn` (incluidas las * callbacks async) devolvera ese id. */ export function runWithSession(mcpSessionId, fn) { return sessionContext.run({ mcpSessionId }, fn); } /** * Devuelve el mcpSessionId activo, o null si no estamos dentro de runWithSession. */ export function getCurrentSessionId() { return sessionContext.getStore()?.mcpSessionId || null; }