list_meetings
Retrieve and filter recorded meetings from Fathom.video with options for date ranges, participant types, and result limits to access transcripts and summaries.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of meetings to return (default: 10, use 0 for all) | |
| created_after | No | ISO 8601 timestamp - only return meetings after this date | |
| created_before | No | ISO 8601 timestamp - only return meetings before this date | |
| include_external_only | No | Only include meetings with external participants |
Implementation Reference
- src/index.ts:62-82 (handler)The main execution logic for the 'list_meetings' MCP tool. It maps tool parameters to FathomClient.listMeetings call, applies limit slicing, formats output using formatMeetingList, and returns markdown table as text content.async ({ limit, created_after, created_before, include_external_only }) => { console.error('Fetching meetings...'); const response = await fathom.listMeetings({ created_after, created_before, calendar_invitees_domains_type: include_external_only ? 'one_or_more_external' : undefined, }); let meetings = response.items; if (limit && limit > 0) { meetings = meetings.slice(0, limit); } console.error(`Found ${meetings.length} meetings`); const markdown = formatMeetingList(meetings); return { content: [{ type: 'text', text: markdown }], }; }
- src/index.ts:56-61 (schema)Zod input schema validation for the list_meetings tool parameters.{ limit: z.number().optional().describe('Maximum number of meetings to return (default: 10, use 0 for all)'), created_after: z.string().optional().describe('ISO 8601 timestamp - only return meetings after this date'), created_before: z.string().optional().describe('ISO 8601 timestamp - only return meetings before this date'), include_external_only: z.boolean().optional().describe('Only include meetings with external participants'), },
- src/index.ts:54-83 (registration)MCP server.tool registration of the 'list_meetings' tool, including schema and handler reference.server.tool( 'list_meetings', { limit: z.number().optional().describe('Maximum number of meetings to return (default: 10, use 0 for all)'), created_after: z.string().optional().describe('ISO 8601 timestamp - only return meetings after this date'), created_before: z.string().optional().describe('ISO 8601 timestamp - only return meetings before this date'), include_external_only: z.boolean().optional().describe('Only include meetings with external participants'), }, async ({ limit, created_after, created_before, include_external_only }) => { console.error('Fetching meetings...'); const response = await fathom.listMeetings({ created_after, created_before, calendar_invitees_domains_type: include_external_only ? 'one_or_more_external' : undefined, }); let meetings = response.items; if (limit && limit > 0) { meetings = meetings.slice(0, limit); } console.error(`Found ${meetings.length} meetings`); const markdown = formatMeetingList(meetings); return { content: [{ type: 'text', text: markdown }], }; } );
- src/fathom-client.ts:207-231 (helper)FathomClient.listMeetings method called by the tool handler to fetch meetings from Fathom API.async listMeetings(params: ListMeetingsParams = {}): Promise<MeetingsResponse> { const searchParams = new URLSearchParams(); if (params.include_transcript) searchParams.append('include_transcript', 'true'); if (params.include_summary) searchParams.append('include_summary', 'true'); if (params.include_action_items) searchParams.append('include_action_items', 'true'); if (params.include_crm_matches) searchParams.append('include_crm_matches', 'true'); if (params.created_after) searchParams.append('created_after', params.created_after); if (params.created_before) searchParams.append('created_before', params.created_before); if (params.cursor) searchParams.append('cursor', params.cursor); if (params.calendar_invitees_domains_type) { searchParams.append('calendar_invitees_domains_type', params.calendar_invitees_domains_type); } // Handle array params params.recorded_by?.forEach(email => searchParams.append('recorded_by[]', email)); params.teams?.forEach(team => searchParams.append('teams[]', team)); params.calendar_invitees?.forEach(email => searchParams.append('calendar_invitees[]', email)); params.calendar_invitees_domains?.forEach(domain => searchParams.append('calendar_invitees_domains[]', domain)); const queryString = searchParams.toString(); const endpoint = `/meetings${queryString ? `?${queryString}` : ''}`; return this.request<MeetingsResponse>(endpoint); }
- src/formatters.ts:239-259 (helper)Utility function used in handler to format the list of meetings as a markdown table.export function formatMeetingList(meetings: Meeting[]): string { if (meetings.length === 0) { return 'No meetings found.'; } const rows = meetings.map(m => { const title = m.title || m.meeting_title || `Meeting ${m.recording_id}`; const date = formatDate(m.recording_start_time); const duration = formatDuration(m.recording_start_time, m.recording_end_time); const recorder = m.recorded_by.name; const participants = m.calendar_invitees.length; return `| ${title} | ${date} | ${duration} | ${recorder} | ${participants} | ${m.recording_id} |`; }); return [ '| Title | Date | Duration | Recorded By | Participants | ID |', '|-------|------|----------|-------------|--------------|-----|', ...rows, ].join('\n'); }