diff --git a/apps/docs/content/docs/en/integrations/fathom.mdx b/apps/docs/content/docs/en/integrations/fathom.mdx index 16270807b0e..75d2f2b1104 100644 --- a/apps/docs/content/docs/en/integrations/fathom.mdx +++ b/apps/docs/content/docs/en/integrations/fathom.mdx @@ -46,10 +46,14 @@ List recent meetings recorded by the user or shared to their team. | `includeTranscript` | string | No | Include meeting transcript \(true/false\) | | `includeActionItems` | string | No | Include action items \(true/false\) | | `includeCrmMatches` | string | No | Include linked CRM matches \(true/false\) | +| `includeHighlights` | string | No | Include meeting highlights \(true/false\) | | `createdAfter` | string | No | Filter meetings created after this ISO 8601 timestamp | | `createdBefore` | string | No | Filter meetings created before this ISO 8601 timestamp | | `recordedBy` | string | No | Filter by recorder email address | | `teams` | string | No | Filter by team name | +| `meetingType` | string | No | Filter by meeting type name | +| `calendarInviteesDomains` | string | No | Filter by calendar invitee company domain \(exact match\) | +| `calendarInviteesDomainsType` | string | No | Filter by invitee domain type: all, only_internal, or one_or_more_external | | `cursor` | string | No | Pagination cursor from a previous response | #### Output @@ -58,11 +62,90 @@ List recent meetings recorded by the user or shared to their team. | --------- | ---- | ----------- | | `meetings` | array | List of meetings | | ↳ `title` | string | Meeting title | +| ↳ `meeting_title` | string | Calendar event title | +| ↳ `meeting_type` | string | Meeting type name | | ↳ `recording_id` | number | Unique recording ID | | ↳ `url` | string | URL to view the meeting | +| ↳ `meeting_url` | string | URL of the underlying video call \(Zoom, Meet, Teams, etc.\) | | ↳ `share_url` | string | Shareable URL | | ↳ `created_at` | string | Creation timestamp | +| ↳ `scheduled_start_time` | string | Scheduled start time | +| ↳ `scheduled_end_time` | string | Scheduled end time | +| ↳ `recording_start_time` | string | Recording start time | +| ↳ `recording_end_time` | string | Recording end time | | ↳ `transcript_language` | string | Transcript language | +| ↳ `calendar_invitees_domains_type` | string | Invitee domain type: only_internal or one_or_more_external | +| ↳ `shared_with` | string | Sharing scope: no_teams, single_team, multiple_teams, or all_teams | +| ↳ `recorded_by` | object | Recorder details | +| ↳ `name` | string | Name of the recorder | +| ↳ `email` | string | Email of the recorder | +| ↳ `email_domain` | string | Email domain of the recorder | +| ↳ `team` | string | Recorder team name | +| ↳ `calendar_invitees` | array | Calendar invitees for the meeting | +| ↳ `name` | string | Invitee name | +| ↳ `email` | string | Invitee email | +| ↳ `email_domain` | string | Invitee email domain | +| ↳ `is_external` | boolean | Whether the invitee is external | +| ↳ `matched_speaker_display_name` | string | Matched transcript speaker display name | +| ↳ `default_summary` | object | Meeting summary | +| ↳ `template_name` | string | Summary template name | +| ↳ `markdown_formatted` | string | Markdown-formatted summary | +| ↳ `transcript` | array | Transcript entries with speaker, text, and timestamp | +| ↳ `speaker` | object | Speaker information | +| ↳ `display_name` | string | Speaker display name | +| ↳ `matched_calendar_invitee_email` | string | Matched calendar invitee email | +| ↳ `text` | string | Transcript text | +| ↳ `timestamp` | string | Timestamp \(HH:MM:SS\) | +| ↳ `action_items` | array | Action items extracted from the meeting | +| ↳ `description` | string | Action item description | +| ↳ `user_generated` | boolean | Whether the action item was user-generated | +| ↳ `completed` | boolean | Whether the action item is completed | +| ↳ `recording_timestamp` | string | Timestamp in the recording \(HH:MM:SS\) | +| ↳ `recording_playback_url` | string | Playback URL for the action item moment | +| ↳ `assignee` | object | Assignee details | +| ↳ `name` | string | Assignee name | +| ↳ `email` | string | Assignee email | +| ↳ `team` | string | Assignee team | +| ↳ `highlights` | array | Meeting highlights with type, summary, text, and start/end time | +| ↳ `type` | string | Highlight type | +| ↳ `summary` | string | Highlight summary | +| ↳ `text` | string | Highlight text | +| ↳ `start_time` | number | Start time in seconds | +| ↳ `end_time` | number | End time in seconds | +| ↳ `crm_matches` | object | Matched CRM contacts, companies, and deals | +| ↳ `contacts` | array | Matched CRM contacts | +| ↳ `name` | string | Contact name | +| ↳ `email` | string | Contact email | +| ↳ `record_url` | string | CRM record URL | +| ↳ `companies` | array | Matched CRM companies | +| ↳ `name` | string | Company name | +| ↳ `record_url` | string | CRM record URL | +| ↳ `deals` | array | Matched CRM deals | +| ↳ `name` | string | Deal name | +| ↳ `amount` | number | Deal amount | +| ↳ `record_url` | string | CRM record URL | +| ↳ `error` | string | CRM match error, if any | +| `next_cursor` | string | Pagination cursor for next page | + +### `fathom_list_meeting_types` + +List meeting types configured in your Fathom organization. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Fathom API Key | +| `cursor` | string | No | Pagination cursor from a previous response | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `meetingTypes` | array | List of meeting types | +| ↳ `name` | string | Meeting type name | +| ↳ `status` | string | Meeting type status: active or inactive | +| ↳ `created_at` | string | Date the meeting type was created | | `next_cursor` | string | Pagination cursor for next page | ### `fathom_get_summary` diff --git a/apps/sim/blocks/blocks/fathom.ts b/apps/sim/blocks/blocks/fathom.ts index 2bd604f6a28..ed14925a544 100644 --- a/apps/sim/blocks/blocks/fathom.ts +++ b/apps/sim/blocks/blocks/fathom.ts @@ -24,6 +24,7 @@ export const FathomBlock: BlockConfig = { type: 'dropdown', options: [ { label: 'List Meetings', id: 'fathom_list_meetings' }, + { label: 'List Meeting Types', id: 'fathom_list_meeting_types' }, { label: 'Get Summary', id: 'fathom_get_summary' }, { label: 'Get Transcript', id: 'fathom_get_transcript' }, { label: 'List Team Members', id: 'fathom_list_team_members' }, @@ -83,6 +84,17 @@ export const FathomBlock: BlockConfig = { value: () => 'false', condition: { field: 'operation', value: 'fathom_list_meetings' }, }, + { + id: 'includeHighlights', + title: 'Include Highlights', + type: 'dropdown', + options: [ + { label: 'No', id: 'false' }, + { label: 'Yes', id: 'true' }, + ], + value: () => 'false', + condition: { field: 'operation', value: 'fathom_list_meetings' }, + }, { id: 'createdAfter', title: 'Created After', @@ -128,6 +140,34 @@ export const FathomBlock: BlockConfig = { }, mode: 'advanced', }, + { + id: 'meetingType', + title: 'Meeting Type', + type: 'short-input', + placeholder: 'Filter by meeting type name', + condition: { field: 'operation', value: 'fathom_list_meetings' }, + mode: 'advanced', + }, + { + id: 'calendarInviteesDomains', + title: 'Invitee Domain', + type: 'short-input', + placeholder: 'Filter by calendar invitee company domain', + condition: { field: 'operation', value: 'fathom_list_meetings' }, + mode: 'advanced', + }, + { + id: 'calendarInviteesDomainsType', + title: 'Invitee Domain Type', + type: 'dropdown', + options: [ + { label: 'All', id: 'all' }, + { label: 'Only Internal', id: 'only_internal' }, + { label: 'One or More External', id: 'one_or_more_external' }, + ], + condition: { field: 'operation', value: 'fathom_list_meetings' }, + mode: 'advanced', + }, { id: 'cursor', title: 'Pagination Cursor', @@ -135,7 +175,12 @@ export const FathomBlock: BlockConfig = { placeholder: 'Cursor from a previous response', condition: { field: 'operation', - value: ['fathom_list_meetings', 'fathom_list_team_members', 'fathom_list_teams'], + value: [ + 'fathom_list_meetings', + 'fathom_list_meeting_types', + 'fathom_list_team_members', + 'fathom_list_teams', + ], }, mode: 'advanced', }, @@ -162,6 +207,7 @@ export const FathomBlock: BlockConfig = { tools: { access: [ 'fathom_list_meetings', + 'fathom_list_meeting_types', 'fathom_get_summary', 'fathom_get_transcript', 'fathom_list_team_members', @@ -187,6 +233,10 @@ export const FathomBlock: BlockConfig = { type: 'string', description: 'Include linked CRM matches in meetings response', }, + includeHighlights: { + type: 'string', + description: 'Include highlights in meetings response', + }, createdAfter: { type: 'string', description: 'Filter meetings created after this timestamp' }, createdBefore: { type: 'string', @@ -194,10 +244,20 @@ export const FathomBlock: BlockConfig = { }, recordedBy: { type: 'string', description: 'Filter by recorder email' }, teams: { type: 'string', description: 'Filter by team name' }, + meetingType: { type: 'string', description: 'Filter by meeting type name' }, + calendarInviteesDomains: { + type: 'string', + description: 'Filter by calendar invitee company domain', + }, + calendarInviteesDomainsType: { + type: 'string', + description: 'Filter by invitee domain type', + }, cursor: { type: 'string', description: 'Pagination cursor for next page' }, }, outputs: { meetings: { type: 'json', description: 'List of meetings' }, + meetingTypes: { type: 'json', description: 'List of meeting types' }, template_name: { type: 'string', description: 'Summary template name' }, markdown_formatted: { type: 'string', description: 'Markdown-formatted summary' }, transcript: { type: 'json', description: 'Meeting transcript entries' }, diff --git a/apps/sim/lib/integrations/integrations.json b/apps/sim/lib/integrations/integrations.json index 03f07029836..f542ae6daea 100644 --- a/apps/sim/lib/integrations/integrations.json +++ b/apps/sim/lib/integrations/integrations.json @@ -5086,6 +5086,10 @@ "name": "List Meetings", "description": "List recent meetings recorded by the user or shared to their team." }, + { + "name": "List Meeting Types", + "description": "List meeting types configured in your Fathom organization." + }, { "name": "Get Summary", "description": "Get the call summary for a specific meeting recording." @@ -5103,7 +5107,7 @@ "description": "List teams in your Fathom organization." } ], - "operationCount": 5, + "operationCount": 6, "triggers": [ { "id": "fathom_new_meeting", diff --git a/apps/sim/tools/fathom/index.ts b/apps/sim/tools/fathom/index.ts index ac140eb94e9..75c3097e6f5 100644 --- a/apps/sim/tools/fathom/index.ts +++ b/apps/sim/tools/fathom/index.ts @@ -1,5 +1,6 @@ import { getSummaryTool } from '@/tools/fathom/get_summary' import { getTranscriptTool } from '@/tools/fathom/get_transcript' +import { listMeetingTypesTool } from '@/tools/fathom/list_meeting_types' import { listMeetingsTool } from '@/tools/fathom/list_meetings' import { listTeamMembersTool } from '@/tools/fathom/list_team_members' import { listTeamsTool } from '@/tools/fathom/list_teams' @@ -7,6 +8,7 @@ import { listTeamsTool } from '@/tools/fathom/list_teams' export const fathomGetSummaryTool = getSummaryTool export const fathomGetTranscriptTool = getTranscriptTool export const fathomListMeetingsTool = listMeetingsTool +export const fathomListMeetingTypesTool = listMeetingTypesTool export const fathomListTeamMembersTool = listTeamMembersTool export const fathomListTeamsTool = listTeamsTool diff --git a/apps/sim/tools/fathom/list_meeting_types.ts b/apps/sim/tools/fathom/list_meeting_types.ts new file mode 100644 index 00000000000..6f77c8d7adc --- /dev/null +++ b/apps/sim/tools/fathom/list_meeting_types.ts @@ -0,0 +1,96 @@ +import type { + FathomListMeetingTypesParams, + FathomListMeetingTypesResponse, +} from '@/tools/fathom/types' +import type { ToolConfig } from '@/tools/types' + +export const listMeetingTypesTool: ToolConfig< + FathomListMeetingTypesParams, + FathomListMeetingTypesResponse +> = { + id: 'fathom_list_meeting_types', + name: 'Fathom List Meeting Types', + description: 'List meeting types configured in your Fathom organization.', + version: '1.0.0', + + params: { + apiKey: { + type: 'string', + required: true, + visibility: 'user-only', + description: 'Fathom API Key', + }, + cursor: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: 'Pagination cursor from a previous response', + }, + }, + + request: { + url: (params) => { + const url = new URL('https://api.fathom.ai/external/v1/meeting_types') + if (params.cursor) url.searchParams.append('cursor', params.cursor) + return url.toString() + }, + method: 'GET', + headers: (params) => ({ + 'X-Api-Key': params.apiKey, + 'Content-Type': 'application/json', + }), + }, + + transformResponse: async (response: Response) => { + if (!response.ok) { + const errorData = await response.json().catch(() => ({})) + return { + success: false, + error: + (errorData as Record).message || + `Fathom API error: ${response.status} ${response.statusText}`, + output: { + meetingTypes: [], + next_cursor: null, + }, + } + } + + const data = await response.json() + const meetingTypes = (data.items ?? []).map( + (meetingType: { name?: string; status?: string; created_at?: string }) => ({ + name: meetingType.name ?? '', + status: meetingType.status ?? '', + created_at: meetingType.created_at ?? '', + }) + ) + + return { + success: true, + output: { + meetingTypes, + next_cursor: data.next_cursor ?? null, + }, + } + }, + + outputs: { + meetingTypes: { + type: 'array', + description: 'List of meeting types', + items: { + type: 'object', + properties: { + name: { type: 'string', description: 'Meeting type name' }, + status: { type: 'string', description: 'Meeting type status: active or inactive' }, + created_at: { type: 'string', description: 'Date the meeting type was created' }, + }, + }, + }, + next_cursor: { + type: 'string', + description: 'Pagination cursor for next page', + optional: true, + }, + }, +} diff --git a/apps/sim/tools/fathom/list_meetings.ts b/apps/sim/tools/fathom/list_meetings.ts index 5fff960ea4f..c2e06b8f77c 100644 --- a/apps/sim/tools/fathom/list_meetings.ts +++ b/apps/sim/tools/fathom/list_meetings.ts @@ -38,6 +38,12 @@ export const listMeetingsTool: ToolConfig & { recorded_by?: Record }) => ({ title: meeting.title ?? '', meeting_title: meeting.meeting_title ?? null, + meeting_type: meeting.meeting_type ?? null, recording_id: meeting.recording_id ?? null, url: meeting.url ?? '', + meeting_url: meeting.meeting_url ?? null, share_url: meeting.share_url ?? '', created_at: meeting.created_at ?? '', scheduled_start_time: meeting.scheduled_start_time ?? null, @@ -124,6 +159,7 @@ export const listMeetingsTool: ToolConfig | null + highlights: Array<{ + type: string + summary: string | null + text: string + start_time: number + end_time: number + }> | null crm_matches: { contacts: Array<{ name: string; email: string; record_url: string }> companies: Array<{ name: string; record_url: string }> @@ -119,9 +133,25 @@ export interface FathomListTeamsResponse extends ToolResponse { } } +export interface FathomListMeetingTypesParams extends FathomBaseParams { + cursor?: string +} + +export interface FathomListMeetingTypesResponse extends ToolResponse { + output: { + meetingTypes: Array<{ + name: string + status: string + created_at: string + }> + next_cursor: string | null + } +} + export type FathomResponse = | FathomListMeetingsResponse | FathomGetSummaryResponse | FathomGetTranscriptResponse | FathomListTeamMembersResponse | FathomListTeamsResponse + | FathomListMeetingTypesResponse diff --git a/apps/sim/tools/registry.ts b/apps/sim/tools/registry.ts index 4adbd38fb46..b56d27ccb1c 100644 --- a/apps/sim/tools/registry.ts +++ b/apps/sim/tools/registry.ts @@ -893,6 +893,7 @@ import { fathomGetSummaryTool, fathomGetTranscriptTool, fathomListMeetingsTool, + fathomListMeetingTypesTool, fathomListTeamMembersTool, fathomListTeamsTool, } from '@/tools/fathom' @@ -6890,6 +6891,7 @@ export const tools: Record = { elevenlabs_speech_to_speech: elevenLabsSpeechToSpeechTool, elevenlabs_audio_isolation: elevenLabsAudioIsolationTool, fathom_list_meetings: fathomListMeetingsTool, + fathom_list_meeting_types: fathomListMeetingTypesTool, fathom_get_summary: fathomGetSummaryTool, fathom_get_transcript: fathomGetTranscriptTool, fathom_list_team_members: fathomListTeamMembersTool,