get_meeting
Retrieve meeting recordings from Fathom with AI-generated transcripts, summaries, action items, and CRM matches for comprehensive meeting analysis.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| recording_id | Yes | The recording ID of the meeting to retrieve | |
| include_transcript | No | Include the full transcript (default: true) | |
| include_summary | No | Include the AI summary (default: true) | |
| include_action_items | No | Include action items (default: true) | |
| include_crm_matches | No | Include CRM matches (default: true) |
Implementation Reference
- src/index.ts:97-122 (handler)Handler function for 'get_meeting' tool. Fetches meetings using FathomClient.listMeetings, finds the specific meeting by recording_id, formats it to markdown using formatMeetingToMarkdown, and returns as text content.async ({ recording_id, include_transcript, include_summary, include_action_items, include_crm_matches }) => { console.error(`Fetching meeting ${recording_id}...`); const response = await fathom.listMeetings({ include_transcript: include_transcript !== false, include_summary: include_summary !== false, include_action_items: include_action_items !== false, include_crm_matches: include_crm_matches !== false, }); const meeting = response.items.find(m => m.recording_id === recording_id); if (!meeting) { return { content: [{ type: 'text', text: `Meeting with recording ID ${recording_id} not found.` }], isError: true, }; } console.error(`Found meeting: ${meeting.title}`); const markdown = formatMeetingToMarkdown(meeting); return { content: [{ type: 'text', text: markdown }], }; } );
- src/index.ts:90-96 (schema)Zod schema defining input parameters for the get_meeting tool: required recording_id and optional flags for including transcript, summary, action items, and CRM matches.{ recording_id: z.number().describe('The recording ID of the meeting to retrieve'), include_transcript: z.boolean().optional().describe('Include the full transcript (default: true)'), include_summary: z.boolean().optional().describe('Include the AI summary (default: true)'), include_action_items: z.boolean().optional().describe('Include action items (default: true)'), include_crm_matches: z.boolean().optional().describe('Include CRM matches (default: true)'), },
- src/index.ts:88-122 (registration)Registration of the 'get_meeting' tool on the MCP server using server.tool(), specifying name, input schema, and handler function.server.tool( 'get_meeting', { recording_id: z.number().describe('The recording ID of the meeting to retrieve'), include_transcript: z.boolean().optional().describe('Include the full transcript (default: true)'), include_summary: z.boolean().optional().describe('Include the AI summary (default: true)'), include_action_items: z.boolean().optional().describe('Include action items (default: true)'), include_crm_matches: z.boolean().optional().describe('Include CRM matches (default: true)'), }, async ({ recording_id, include_transcript, include_summary, include_action_items, include_crm_matches }) => { console.error(`Fetching meeting ${recording_id}...`); const response = await fathom.listMeetings({ include_transcript: include_transcript !== false, include_summary: include_summary !== false, include_action_items: include_action_items !== false, include_crm_matches: include_crm_matches !== false, }); const meeting = response.items.find(m => m.recording_id === recording_id); if (!meeting) { return { content: [{ type: 'text', text: `Meeting with recording ID ${recording_id} not found.` }], isError: true, }; } console.error(`Found meeting: ${meeting.title}`); const markdown = formatMeetingToMarkdown(meeting); return { content: [{ type: 'text', text: markdown }], }; } );
- src/formatters.ts:172-234 (helper)Helper function formatMeetingToMarkdown used in the get_meeting handler to convert meeting data into a formatted Markdown document including details, participants, summary, actions, CRM matches, and transcript.export function formatMeetingToMarkdown(meeting: Meeting): string { const sections: string[] = []; // Header const title = meeting.title || meeting.meeting_title || `Meeting ${meeting.recording_id}`; sections.push(`# ${title}`); sections.push(''); // Metadata sections.push('## Meeting Details'); sections.push(''); sections.push(`| Field | Value |`); sections.push(`|-------|-------|`); sections.push(`| **Date** | ${formatDate(meeting.recording_start_time)} |`); sections.push(`| **Duration** | ${formatDuration(meeting.recording_start_time, meeting.recording_end_time)} |`); sections.push(`| **Recorded by** | ${meeting.recorded_by.name} <${meeting.recorded_by.email}> |`); sections.push(`| **Recording ID** | ${meeting.recording_id} |`); sections.push(`| **Fathom URL** | [View Recording](${meeting.url}) |`); sections.push(`| **Share URL** | [Share Link](${meeting.share_url}) |`); sections.push(''); // Participants sections.push('## Participants'); sections.push(''); sections.push(formatParticipants(meeting.calendar_invitees)); sections.push(''); // Summary (if available) if (meeting.default_summary) { sections.push('## Summary'); sections.push(''); sections.push(meeting.default_summary.markdown_formatted); sections.push(''); } // Action Items (if available) if (meeting.action_items && meeting.action_items.length > 0) { sections.push('## Action Items'); sections.push(''); sections.push(formatActionItems(meeting.action_items)); sections.push(''); } // CRM Matches (if available) if (meeting.crm_matches) { sections.push('## CRM Matches'); sections.push(''); sections.push(formatCRMMatches(meeting.crm_matches)); sections.push(''); } // Transcript sections.push('## Transcript'); sections.push(''); sections.push(formatTranscriptToMarkdown(meeting.transcript || [])); sections.push(''); // Footer sections.push('---'); sections.push(`_Exported from Fathom.video on ${new Date().toISOString()}_`); return sections.join('\n'); }