0.167.51
Fixed
- stdio MCP-серверы убивались сразу после коннекта — регрессия #308 ( — P1; инцидент продакшена 192.168.2.104:
giteaMCP в бесконечном циклеtransport closed→ reconnect, ~1 мёртвый child-процесс в минуту + накопление зомби[gitea-mcp] <defunct>, вызовы тулов падалиMCP tool error: mcp call "issue_read" on "gitea": transport error: transport closed).connectBoundedиз #308 выполняетsess.ConnectподattemptCtx = context.WithTimeout(ctx, 60s); этот же ctx уходил вclient.Start(ctx), а mcp-go порождает subprocess черезexec.CommandContext(attemptCtx, …)— deferredcancel()сразу после успешного коннекта SIGKILL-ил только что подключённый stdio-сервер (GowatchCtxубивает по ctx.Done даже доWait); следующий ping/вызов получал EOF → «transport closed», health-loop реконнектил — цикл замыкался навсегда. Тесты #308 покрывали только streamable_http. Фикс:client.Start(context.WithoutCancel(ctx))— время жизни subprocess отвязано от attempt-дедлайна, завершается только штатно черезClose()(SIGTERM → SIGKILL); bounded ctx сохранён на handshake (Initialize/SetLevel/ListTools/ListResources/ListPrompts) — гарантия #308 не тронута: зависший stdio-сервер по-прежнему фейлится за bound, failure-путь убивает child черезclient.Close(). Проверено: привязка ctx к процессу не изменилась в mcp-go вплоть до v1.0.0-beta.1 — фикс необходим на нашей стороне в любой версии. Попутно: апгрейдmark3labs/mcp-gov0.52.0 → v0.58.0 (последняя стабильная; накопленные фиксы Close/zombie/FD-leak в транспортах). Тесты (+2, re-exec паттерн с реальным stdio MCP-сервером): сессия жива и отвечает на Ping ПОСЛЕ cancel и истечения attempt-дедлайна (красный на pre-fix с точной продовой ошибкой «transport closed»); нереагирующий на Initialize stdio-сервер фейлится в пределах bound с DeadlineExceeded в цепочке.