Skip to main content
Glama

close_debug_session

Terminates an active debugging session in the MCP Debugger server to release resources and end program analysis.

Instructions

Close a debugging session

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
sessionIdYes

Implementation Reference

  • MCP tool handler for close_debug_session: validates sessionId, delegates to closeDebugSession method, logs closure, returns success JSON.
    case 'close_debug_session': {
      if (!args.sessionId) {
        throw new McpError(McpErrorCode.InvalidParams, 'Missing required sessionId');
      }
      
      const sessionName = this.getSessionName(args.sessionId);
      const sessionCreatedAt = Date.now(); // In real implementation, would track creation time
      const closed = await this.closeDebugSession(args.sessionId);
      
      if (closed) {
        // Log session closure
        this.logger.info('session:closed', {
          sessionId: args.sessionId,
          sessionName: sessionName,
          duration: Date.now() - sessionCreatedAt,
          timestamp: Date.now()
        });
      }
      
      result = { content: [{ type: 'text', text: JSON.stringify({ success: closed, message: closed ? `Closed debug session: ${args.sessionId}` : `Failed to close debug session: ${args.sessionId}` }) }] };
      break;
    }
  • src/server.ts:472-472 (registration)
    Tool registration entry in listTools response, including schema definition.
    { name: 'close_debug_session', description: 'Close a debugging session', inputSchema: { type: 'object', properties: { sessionId: { type: 'string' } }, required: ['sessionId'] } },
  • Public wrapper method on DebugMcpServer that delegates to SessionManager.closeSession.
    public async closeDebugSession(sessionId: string): Promise<boolean> {
      return this.sessionManager.closeSession(sessionId);
    }
  • Core implementation of closeSession: retrieves session, cleans up and stops proxyManager if present, updates state to STOPPED/TERMINATED, returns true on success.
    async closeSession(sessionId: string): Promise<boolean> {
      const session = this.sessionStore.get(sessionId); 
      if (!session) {
        this.logger.warn(`[SESSION_CLOSE_FAIL] Session not found: ${sessionId}`);
        return false;
      }
      this.logger.info(`Closing debug session: ${sessionId}. Active proxy: ${session.proxyManager ? 'yes' : 'no'}`);
      
      if (session.proxyManager) {
        // Always cleanup listeners first
        try {
          this.cleanupProxyEventHandlers(session, session.proxyManager);
        } catch (cleanupError) {
          this.logger.error(`[SessionManager] Critical error during listener cleanup for session ${sessionId}:`, cleanupError);
          // Continue with session closure despite cleanup errors
        }
        
        // Then stop the proxy
        try {
          await session.proxyManager.stop();
        } catch (error: unknown) { 
          const message = error instanceof Error ? error.message : String(error);
          this.logger.error(`[SessionManager] Error stopping proxy for session ${sessionId}:`, message);
        } finally {
          session.proxyManager = undefined;
        }
      }
      
      this._updateSessionState(session, SessionState.STOPPED);
      
      // Also update session lifecycle to TERMINATED
      this.sessionStore.update(sessionId, {
        sessionLifecycle: SessionLifecycleState.TERMINATED
      });
      
      this.logger.info(`Session ${sessionId} marked as STOPPED/TERMINATED.`);
      return true;
    }
  • Helper method to clean up event handlers from proxyManager before stopping it.
    protected cleanupProxyEventHandlers(session: ManagedSession, proxyManager: IProxyManager): void {
      // Safety check to prevent double cleanup
      if (!this.sessionEventHandlers.has(session)) {
        this.logger.debug(`[SessionManager] Cleanup already performed for session ${session.id}`);
        return;
      }
    
      const handlers = this.sessionEventHandlers.get(session);
      if (!handlers) {
        this.logger.debug(`[SessionManager] No handlers found for session ${session.id}`);
        return;
      }
      
      let removedCount = 0;
      let failedCount = 0;
      
      handlers.forEach((handler, eventName) => {
        try {
          this.logger.debug(`[SessionManager] Removing ${eventName} listener for session ${session.id}`);
          proxyManager.removeListener(eventName, handler);
          removedCount++;
        } catch (error) {
          this.logger.error(`[SessionManager] Failed to remove ${eventName} listener for session ${session.id}:`, error);
          failedCount++;
          // Continue cleanup despite errors
        }
      });
      
      this.logger.info(`[SessionManager] Cleanup complete for session ${session.id}: ${removedCount} removed, ${failedCount} failed`);
      this.sessionEventHandlers.delete(session);
    }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/debugmcpdev/mcp-debugger'

If you have feedback or need assistance with the MCP directory API, please join our Discord server