get_transcript
Extract meeting transcripts from recordings, with options to retrieve full content or specific time segments for efficient analysis.
Instructions
Get the transcript for a meeting recording. Returns plaintext lines.
For long meetings, use start_time/end_time to fetch a specific window. First call without time params to get metadata (duration, line count), then request specific chunks as needed.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| recording_id | Yes | The recording ID (from list_meetings). | |
| start_time | No | Start of time window in HH:MM:SS format (e.g. "00:10:00"). | |
| end_time | No | End of time window in HH:MM:SS format (e.g. "00:20:00"). |
Implementation Reference
- src/fathom-client.ts:119-121 (handler)The actual client method that fetches transcript data from the Fathom API.
async getTranscript(recordingId: number): Promise<Record<string, unknown>> { return this._get(`/recordings/${recordingId}/transcript`); } - src/server.ts:365-388 (registration)MCP tool registration for get_transcript, including schema definition and description.
server.registerTool( 'get_transcript', { description: `Get the transcript for a meeting recording. Returns plaintext lines. For long meetings, use start_time/end_time to fetch a specific window. First call without time params to get metadata (duration, line count), then request specific chunks as needed.`, inputSchema: { recording_id: z .number() .int() .positive() .describe('The recording ID (from list_meetings).'), start_time: z .string() .optional() .describe('Start of time window in HH:MM:SS format (e.g. "00:10:00").'), end_time: z .string() .optional() .describe('End of time window in HH:MM:SS format (e.g. "00:20:00").'), }, }, - src/server.ts:389-408 (handler)The MCP tool handler in src/server.ts, which includes caching logic and calls the fathom client.
async args => { const client = getClient(); const cached = _transcriptCache.get(args.recording_id); const isExpired = cached !== undefined && Date.now() - cached.fetchedAt > CACHE_TTL_MS; if (!cached || isExpired) { try { const result = await client.getTranscript(args.recording_id); const transcript = (result.transcript as Record<string, unknown>[]) ?? []; _transcriptCache.set(args.recording_id, { items: transcript, fetchedAt: Date.now() }); } catch (err) { const msg = err instanceof Error ? err.message : String(err); return { content: [{ type: 'text', text: `Error fetching transcript: ${msg}` }] }; } } let items = [..._transcriptCache.get(args.recording_id)!.items]; if (items.length === 0) { return { content: [{ type: 'text', text: 'No transcript available.' }] }; }