Skip to content

Commit dd6c8ea

Browse files
ergunshNTaylorMullen
authored andcommitted
fix(mcp): ensure MCP servers are gracefully shut down on CLI exit
This commit introduces a cleanup mechanism for MCP servers to prevent them from being orphaned or terminated abruptly when the Gemini CLI exits. - Added a `dispose()` method to the `Config` class in `packages/core` that triggers `McpClientManager.stop()`. - Registered `config.dispose()` as a cleanup handler in the main CLI entry point (`packages/cli/src/gemini.tsx`). This ensures that the `stop()` method of `McpClientManager` is invoked, allowing for the proper closing of transport connections (sending SIGTERM/closing streams) to downstream MCP servers.
1 parent 53f5443 commit dd6c8ea

File tree

2 files changed

+12
-0
lines changed

2 files changed

+12
-0
lines changed

packages/cli/src/gemini.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -477,6 +477,9 @@ export async function main() {
477477
// This ensures telemetry (including SessionEnd hooks) is properly flushed on exit
478478
registerTelemetryConfig(config);
479479

480+
// Ensure MCP servers are stopped on exit
481+
registerCleanup(() => config.dispose());
482+
480483
const policyEngine = config.getPolicyEngine();
481484
const messageBus = config.getMessageBus();
482485
createPolicyUpdater(policyEngine, messageBus);

packages/core/src/config/config.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -824,6 +824,15 @@ export class Config {
824824
await this.geminiClient.initialize();
825825
}
826826

827+
/**
828+
* Disposes of resources held by the config.
829+
*/
830+
async dispose(): Promise<void> {
831+
if (this.mcpClientManager) {
832+
await this.mcpClientManager.stop();
833+
}
834+
}
835+
827836
getContentGenerator(): ContentGenerator {
828837
return this.contentGenerator;
829838
}

0 commit comments

Comments
 (0)