Skip to main content
Glama

extract_compact_summary

Generate concise summaries of conversation sessions to identify key insights, solutions, tools, and file changes from Claude Historian data.

Instructions

Get intelligent summary of a conversation session with key insights

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
session_idYesSession ID to summarize
max_messagesNoMaximum messages to analyze (default: 10)
focusNoFocus area: solutions, tools, files, or allall

Implementation Reference

  • src/index.ts:181-205 (registration)
    Registration and input schema definition for the 'extract_compact_summary' tool in the MCP ListTools response.
    {
      name: 'extract_compact_summary',
      description: 'Get intelligent summary of a conversation session with key insights',
      inputSchema: {
        type: 'object',
        properties: {
          session_id: {
            type: 'string',
            description: 'Session ID to summarize',
          },
          max_messages: {
            type: 'number',
            description: 'Maximum messages to analyze (default: 10)',
            default: 10,
          },
          focus: {
            type: 'string',
            description: 'Focus area: solutions, tools, files, or all',
            enum: ['solutions', 'tools', 'files', 'all'],
            default: 'all',
          },
        },
        required: ['session_id'],
      },
    },
  • MCP CallToolRequestSchema handler case for 'extract_compact_summary': delegates to UniversalHistorySearchEngine.generateCompactSummary and formats output using BeautifulFormatter.formatCompactSummary.
    case 'extract_compact_summary': {
      const sessionId = args?.session_id as string;
      const maxMessages = (args?.max_messages as number) || 10;
      const focus = (args?.focus as string) || 'all';
    
      const universalResult = await this.universalEngine.generateCompactSummary(
        sessionId,
        maxMessages,
        focus
      );
      const formattedResult = this.formatter.formatCompactSummary(
        [universalResult.results as any],
        sessionId
      );
    
      return {
        content: [{ type: 'text', text: formattedResult }],
      };
    }
  • Core implementation of compact summary generation: resolves session ID, fetches messages via HistorySearchEngine.getSessionMessages, extracts tools/files/accomplishments/decisions, returns structured summary data.
    async generateCompactSummary(
      sessionId: string,
      maxMessages?: number,
      focus?: string
    ): Promise<UniversalSearchResult> {
      await this.initialize();
    
      // Get session data from Claude Code
      const allSessions = await this.claudeCodeEngine.getRecentSessions(20);
    
      // Support "latest" keyword - resolve to most recent session
      let resolvedSessionId = sessionId;
      if (sessionId.toLowerCase() === 'latest') {
        if (allSessions.length > 0) {
          resolvedSessionId = allSessions[0].session_id;
        } else {
          return {
            source: 'claude-code',
            results: {
              session_id: 'latest',
              end_time: null,
              start_time: null,
              duration_minutes: 0,
              message_count: 0,
              project_path: null,
              tools_used: [],
              files_modified: [],
              accomplishments: [],
              key_decisions: [],
            } as any,
            enhanced: false,
          };
        }
      }
    
      const sessionData = allSessions.find(
        (s) =>
          s.session_id === resolvedSessionId ||
          s.session_id.startsWith(resolvedSessionId) ||
          resolvedSessionId.includes(s.session_id) ||
          s.session_id.includes(resolvedSessionId.replace(/^.*\//, ''))
      );
    
      if (!sessionData) {
        return {
          source: 'claude-code',
          results: {
            session_id: resolvedSessionId,
            end_time: null,
            start_time: null,
            duration_minutes: 0,
            message_count: 0,
            project_path: null,
            tools_used: [],
            files_modified: [],
            accomplishments: [],
            key_decisions: [],
          } as any,
          enhanced: false,
        };
      }
    
      const messages = await this.claudeCodeEngine.getSessionMessages(
        sessionData.project_dir,
        sessionData.session_id
      );
      const sessionMessages = messages.slice(0, maxMessages || 100); // Increased from 50 to 100 for better extraction
    
      // Return rich session object with extracted content
      const richSummary = {
        session_id: sessionData.session_id,
        end_time: sessionData.end_time,
        start_time: sessionData.start_time,
        duration_minutes: sessionData.duration_minutes || 0,
        message_count: sessionMessages.length,
        project_path: sessionData.project_path,
        tools_used: this.extractToolsFromMessages(sessionMessages),
        files_modified: this.extractFilesFromMessages(sessionMessages),
        accomplishments: this.extractAccomplishmentsFromMessages(sessionMessages),
        key_decisions: this.extractDecisionsFromMessages(sessionMessages),
      };
    
      return {
        source: 'claude-code',
        results: richSummary as any,
        enhanced: this.claudeDesktopAvailable === true,
      };
    }
  • Helper function to format the compact summary data into a readable string with robot emoji header and structured JSON containing session metrics, tools, files, accomplishments, and decisions.
    formatCompactSummary(sessions: any[], sessionId?: string): string {
      if (sessions.length === 0) {
        const filter = sessionId ? `"${sessionId}"` : 'latest';
        return `${robots.summary} ${filter}\n\n{"session":null}`;
      }
    
      const s = sessions[0];
      // Create a useful header with project name and session info
      const projectName = s.project_path?.split('/').pop() || 'unknown';
      const shortId = s.session_id?.substring(0, 8) || sessionId?.substring(0, 8) || 'latest';
      const header = `${robots.summary} extracting summary from ${projectName} (${shortId})`;
      const structured = {
        session: {
          id: s.session_id?.substring(0, 8) || null,
          ts: this.formatTimestamp(s.end_time || s.start_time),
          duration: s.duration_minutes || 0,
          messages: s.message_count || 0,
          project: s.project_path?.split('/').pop() || null,
          tools: s.tools_used || null,
          files: s.files_modified || null,
          accomplishments: s.accomplishments || null,
          decisions: s.key_decisions || null,
        },
      };
    
      return `${header}\n\n${JSON.stringify(structured, null, 2)}`;
    }

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/Vvkmnn/claude-historian'

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