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
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Date in YYYY-MM-DD format (defaults to today). | |
| timezone | No | IANA 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 }; } } );
- src/server.ts:247-250 (schema)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."), };
- src/search-and-analytics.ts:223-287 (handler)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 }; }
- src/advanced-features.ts:68-83 (schema)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; }; }
- src/advanced-features.ts:723-740 (helper)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()); }