Skip to main content
Glama
199-mcp

Limitless MCP Server

by 199-mcp

limitless_get_daily_summary

Generate a daily summary of meetings, action items, participants, and topics from Limitless Pendant recordings with automatic truncation for token limits.

Instructions

Generate daily summary with auto-truncation for token limits. INCLUDES: meetings, action items, participants, topics. CONSTRAINTS: Large responses auto-truncated, use smaller date ranges if needed. ARGS: date (YYYY-MM-DD format, defaults today), timezone (optional). EXAMPLE: date='2025-07-14'.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
dateNoDate in YYYY-MM-DD format (defaults to today).
timezoneNoIANA timezone for date calculations.

Implementation Reference

  • src/server.ts:797-821 (registration)
    Registration of the 'limitless_get_daily_summary' tool, including description, schema, and wrapper handler that calls the core DailySummaryGenerator.
    server.tool("limitless_get_daily_summary",
        "Generate daily summary with auto-truncation for token limits. INCLUDES: meetings, action items, participants, topics. CONSTRAINTS: Large responses auto-truncated, use smaller date ranges if needed. ARGS: date (YYYY-MM-DD format, defaults today), timezone (optional). EXAMPLE: date='2025-07-14'.",
        DailySummaryArgsSchema,
        async (args, _extra) => {
            try {
                // Validate constraints
                const validation = validateApiConstraints(args);
                if (!validation.valid) {
                    return { content: [{ type: "text", text: validation.error! }], isError: true };
                }
                
                const date = args.date || new Date().toISOString().split('T')[0];
                const summary = await DailySummaryGenerator.generateDailySummary(
                    limitlessApiKey,
                    date,
                    args.timezone
                );
                
                return createSafeResponse(summary, `Daily summary for ${date}`);
            } catch (error) {
                const errorMessage = error instanceof Error ? error.message : String(error);
                return { content: [{ type: "text", text: `Error generating daily summary: ${errorMessage}` }], isError: true };
            }
        }
    );
  • Input schema validation using Zod for tool arguments: date (optional YYYY-MM-DD) and timezone.
    const DailySummaryArgsSchema = {
        date: z.string().optional().describe("Date in YYYY-MM-DD format (defaults to today)."),
        timezone: z.string().optional().describe("IANA timezone for date calculations."),
    };
  • Primary handler implementation in DailySummaryGenerator.generateDailySummary: fetches lifelogs for the date, detects meetings and action items using helpers, computes metrics (recording/speaking time, top participants, topics), generates insights, returns structured DailySummary.
    /**
     * Generate comprehensive daily summary with insights and analytics
     */
    static async generateDailySummary(
        apiKey: string,
        date: string,
        timezone?: string
    ): Promise<DailySummary> {
        
        // Get the full day range for the specified date
        const parser = new NaturalTimeParser({ timezone });
        const targetDate = new Date(date + 'T00:00:00');
        const timeRange = {
            start: date + ' 00:00:00',
            end: date + ' 23:59:59',
            timezone: timezone || parser['timezone']
        };
        
        // Fetch all lifelogs for the day
        const lifelogs = await getLifelogs(apiKey, {
            date,
            timezone,
            limit: 1000,
            includeMarkdown: true,
            includeHeadings: true,
            direction: 'asc'
        });
        
        if (lifelogs.length === 0) {
            return this.createEmptyDailySummary(date, timezone || 'UTC');
        }
        
        // Detect meetings
        const meetings = MeetingDetector.detectMeetings(lifelogs);
        
        // Extract all action items
        const allActionItems: ActionItem[] = [];
        for (const lifelog of lifelogs) {
            if (lifelog.contents) {
                const items = ActionItemExtractor.extractFromNodes(lifelog.contents, lifelog.id);
                allActionItems.push(...items);
            }
        }
        
        // Calculate metrics
        const totalRecordingTime = this.calculateTotalRecordingTime(lifelogs);
        const totalSpeakingTime = this.calculateTotalSpeakingTime(lifelogs);
        const topParticipants = this.getTopParticipants(meetings);
        const keyTopics = this.extractKeyTopics(lifelogs);
        
        // Generate insights
        const insights = this.generateInsights(lifelogs, meetings);
        
        return {
            date,
            timezone: timezone || 'UTC',
            meetings,
            totalRecordingTime,
            totalSpeakingTime,
            topParticipants,
            keyTopics,
            actionItems: allActionItems,
            insights
        };
    }
  • TypeScript interface defining the structure of the daily summary output returned by the tool.
    export interface DailySummary {
        date: string;
        timezone: string;
        meetings: Meeting[];
        totalRecordingTime: number;
        totalSpeakingTime: number;
        topParticipants: MeetingParticipant[];
        keyTopics: string[];
        actionItems: ActionItem[];
        insights: {
            mostProductiveHours: string[];
            longestMeeting: Meeting | null;
            mostFrequentParticipant: string | null;
            topicsDiscussed: number;
        };
    }
  • MeetingDetector.detectMeetings: helper used in daily summary to identify meetings from lifelogs based on time proximity, multiple speakers, and duration.
    static detectMeetings(lifelogs: Lifelog[]): Meeting[] {
        if (!lifelogs.length) return [];
        
        // Group lifelogs by continuous time periods
        const timeGroups = this.groupByTimeProximity(lifelogs);
        
        // Analyze each group for meeting characteristics
        const meetings: Meeting[] = [];
        
        for (const group of timeGroups) {
            const meeting = this.analyzePotentialMeeting(group);
            if (meeting) {
                meetings.push(meeting);
            }
        }
        
        return meetings.sort((a, b) => new Date(a.startTime).getTime() - new Date(b.startTime).getTime());
    }

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/199-mcp/mcp-limitless'

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