Skip to main content
Glama
matthewbergvinson

Fathom MCP Server

get_meeting

Retrieve meeting recordings from Fathom with AI-generated transcripts, summaries, action items, and CRM matches for comprehensive review and analysis.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
recording_idYesThe recording ID of the meeting to retrieve
include_transcriptNoInclude the full transcript (default: true)
include_summaryNoInclude the AI summary (default: true)
include_action_itemsNoInclude action items (default: true)
include_crm_matchesNoInclude CRM matches (default: true)

Implementation Reference

  • The handler function that implements the core logic of the 'get_meeting' tool. It retrieves the meeting list from Fathom API (filtered by include flags), finds the specific meeting by recording_id, formats it to markdown using formatMeetingToMarkdown, and returns the 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 }],
        };
      }
    );
  • Zod schema defining the input parameters for the get_meeting tool, including required recording_id and optional flags for including various meeting data.
    {
      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)
    The registration of the 'get_meeting' tool using McpServer.tool(), including the tool 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 }],
        };
      }
    );
  • Helper function that formats a Meeting object into a comprehensive Markdown document, including details, participants, summary, action items, CRM matches, and transcript. Called by the get_meeting handler.
    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');
    }

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/matthewbergvinson/fathom-mcp'

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