Skip to content

Commit 9977407

Browse files
authored
feat(fathom): add list meeting types tool and missing list-meetings filters (#5359)
* feat(fathom): add list meeting types tool and missing list-meetings filters - Add fathom_list_meeting_types tool (GET /meeting_types) - Add missing list-meetings params: includeHighlights, meetingType, calendarInviteesDomains, calendarInviteesDomainsType - Add missing meeting response fields: meeting_type, meeting_url, shared_with, highlights - Wire new operation and filters into the Fathom block * fix(fathom): expose meeting_url/highlights in outputs, stop force-sending domain type default - Add meeting_url and highlights to list_meetings outputs schema so they're addressable from downstream blocks (Greptile P1) - Drop the forced 'all' default on calendarInviteesDomainsType so the filter is only sent when a user explicitly picks a value (Greptile P2) * fix(fathom): never send calendar_invitees_domains_type=all to the API Match the existing Fathom connector's guard (meetingType !== 'all') so the request omits the param entirely when the value is the API's own default, regardless of what the dropdown shows selected in the UI. * fix(fathom): fully expose list_meetings meeting fields in outputs schema transformResponse already returned meeting_title, scheduled/recording times, recorded_by, calendar_invitees, default_summary, transcript, action_items, and crm_matches, but outputs.meetings.items.properties only documented a curated subset, leaving these fields unaddressable from downstream workflow blocks. Complete the schema to match the full Meeting object Fathom's API returns. * fix(fathom): mark recording_id optional in list_meetings outputs transformResponse maps recording_id as meeting.recording_id ?? null and the response type already types it number | null; the outputs schema now reflects that nullability. * fix(fathom): mark calendar_invitees email optional in list_meetings outputs Fathom's docs mark Invitee.email as nullable; the outputs schema now reflects that instead of declaring it as always-present.
1 parent 3d1e8c4 commit 9977407

8 files changed

Lines changed: 519 additions & 3 deletions

File tree

apps/docs/content/docs/en/integrations/fathom.mdx

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,14 @@ List recent meetings recorded by the user or shared to their team.
4646
| `includeTranscript` | string | No | Include meeting transcript \(true/false\) |
4747
| `includeActionItems` | string | No | Include action items \(true/false\) |
4848
| `includeCrmMatches` | string | No | Include linked CRM matches \(true/false\) |
49+
| `includeHighlights` | string | No | Include meeting highlights \(true/false\) |
4950
| `createdAfter` | string | No | Filter meetings created after this ISO 8601 timestamp |
5051
| `createdBefore` | string | No | Filter meetings created before this ISO 8601 timestamp |
5152
| `recordedBy` | string | No | Filter by recorder email address |
5253
| `teams` | string | No | Filter by team name |
54+
| `meetingType` | string | No | Filter by meeting type name |
55+
| `calendarInviteesDomains` | string | No | Filter by calendar invitee company domain \(exact match\) |
56+
| `calendarInviteesDomainsType` | string | No | Filter by invitee domain type: all, only_internal, or one_or_more_external |
5357
| `cursor` | string | No | Pagination cursor from a previous response |
5458

5559
#### Output
@@ -58,11 +62,90 @@ List recent meetings recorded by the user or shared to their team.
5862
| --------- | ---- | ----------- |
5963
| `meetings` | array | List of meetings |
6064
|`title` | string | Meeting title |
65+
|`meeting_title` | string | Calendar event title |
66+
|`meeting_type` | string | Meeting type name |
6167
|`recording_id` | number | Unique recording ID |
6268
|`url` | string | URL to view the meeting |
69+
|`meeting_url` | string | URL of the underlying video call \(Zoom, Meet, Teams, etc.\) |
6370
|`share_url` | string | Shareable URL |
6471
|`created_at` | string | Creation timestamp |
72+
|`scheduled_start_time` | string | Scheduled start time |
73+
|`scheduled_end_time` | string | Scheduled end time |
74+
|`recording_start_time` | string | Recording start time |
75+
|`recording_end_time` | string | Recording end time |
6576
|`transcript_language` | string | Transcript language |
77+
|`calendar_invitees_domains_type` | string | Invitee domain type: only_internal or one_or_more_external |
78+
|`shared_with` | string | Sharing scope: no_teams, single_team, multiple_teams, or all_teams |
79+
|`recorded_by` | object | Recorder details |
80+
|`name` | string | Name of the recorder |
81+
|`email` | string | Email of the recorder |
82+
|`email_domain` | string | Email domain of the recorder |
83+
|`team` | string | Recorder team name |
84+
|`calendar_invitees` | array | Calendar invitees for the meeting |
85+
|`name` | string | Invitee name |
86+
|`email` | string | Invitee email |
87+
|`email_domain` | string | Invitee email domain |
88+
|`is_external` | boolean | Whether the invitee is external |
89+
|`matched_speaker_display_name` | string | Matched transcript speaker display name |
90+
|`default_summary` | object | Meeting summary |
91+
|`template_name` | string | Summary template name |
92+
|`markdown_formatted` | string | Markdown-formatted summary |
93+
|`transcript` | array | Transcript entries with speaker, text, and timestamp |
94+
|`speaker` | object | Speaker information |
95+
|`display_name` | string | Speaker display name |
96+
|`matched_calendar_invitee_email` | string | Matched calendar invitee email |
97+
|`text` | string | Transcript text |
98+
|`timestamp` | string | Timestamp \(HH:MM:SS\) |
99+
|`action_items` | array | Action items extracted from the meeting |
100+
|`description` | string | Action item description |
101+
|`user_generated` | boolean | Whether the action item was user-generated |
102+
|`completed` | boolean | Whether the action item is completed |
103+
|`recording_timestamp` | string | Timestamp in the recording \(HH:MM:SS\) |
104+
|`recording_playback_url` | string | Playback URL for the action item moment |
105+
|`assignee` | object | Assignee details |
106+
|`name` | string | Assignee name |
107+
|`email` | string | Assignee email |
108+
|`team` | string | Assignee team |
109+
|`highlights` | array | Meeting highlights with type, summary, text, and start/end time |
110+
|`type` | string | Highlight type |
111+
|`summary` | string | Highlight summary |
112+
|`text` | string | Highlight text |
113+
|`start_time` | number | Start time in seconds |
114+
|`end_time` | number | End time in seconds |
115+
|`crm_matches` | object | Matched CRM contacts, companies, and deals |
116+
|`contacts` | array | Matched CRM contacts |
117+
|`name` | string | Contact name |
118+
|`email` | string | Contact email |
119+
|`record_url` | string | CRM record URL |
120+
|`companies` | array | Matched CRM companies |
121+
|`name` | string | Company name |
122+
|`record_url` | string | CRM record URL |
123+
|`deals` | array | Matched CRM deals |
124+
|`name` | string | Deal name |
125+
|`amount` | number | Deal amount |
126+
|`record_url` | string | CRM record URL |
127+
|`error` | string | CRM match error, if any |
128+
| `next_cursor` | string | Pagination cursor for next page |
129+
130+
### `fathom_list_meeting_types`
131+
132+
List meeting types configured in your Fathom organization.
133+
134+
#### Input
135+
136+
| Parameter | Type | Required | Description |
137+
| --------- | ---- | -------- | ----------- |
138+
| `apiKey` | string | Yes | Fathom API Key |
139+
| `cursor` | string | No | Pagination cursor from a previous response |
140+
141+
#### Output
142+
143+
| Parameter | Type | Description |
144+
| --------- | ---- | ----------- |
145+
| `meetingTypes` | array | List of meeting types |
146+
|`name` | string | Meeting type name |
147+
|`status` | string | Meeting type status: active or inactive |
148+
|`created_at` | string | Date the meeting type was created |
66149
| `next_cursor` | string | Pagination cursor for next page |
67150

68151
### `fathom_get_summary`

apps/sim/blocks/blocks/fathom.ts

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ export const FathomBlock: BlockConfig<FathomResponse> = {
2424
type: 'dropdown',
2525
options: [
2626
{ label: 'List Meetings', id: 'fathom_list_meetings' },
27+
{ label: 'List Meeting Types', id: 'fathom_list_meeting_types' },
2728
{ label: 'Get Summary', id: 'fathom_get_summary' },
2829
{ label: 'Get Transcript', id: 'fathom_get_transcript' },
2930
{ label: 'List Team Members', id: 'fathom_list_team_members' },
@@ -83,6 +84,17 @@ export const FathomBlock: BlockConfig<FathomResponse> = {
8384
value: () => 'false',
8485
condition: { field: 'operation', value: 'fathom_list_meetings' },
8586
},
87+
{
88+
id: 'includeHighlights',
89+
title: 'Include Highlights',
90+
type: 'dropdown',
91+
options: [
92+
{ label: 'No', id: 'false' },
93+
{ label: 'Yes', id: 'true' },
94+
],
95+
value: () => 'false',
96+
condition: { field: 'operation', value: 'fathom_list_meetings' },
97+
},
8698
{
8799
id: 'createdAfter',
88100
title: 'Created After',
@@ -128,14 +140,47 @@ export const FathomBlock: BlockConfig<FathomResponse> = {
128140
},
129141
mode: 'advanced',
130142
},
143+
{
144+
id: 'meetingType',
145+
title: 'Meeting Type',
146+
type: 'short-input',
147+
placeholder: 'Filter by meeting type name',
148+
condition: { field: 'operation', value: 'fathom_list_meetings' },
149+
mode: 'advanced',
150+
},
151+
{
152+
id: 'calendarInviteesDomains',
153+
title: 'Invitee Domain',
154+
type: 'short-input',
155+
placeholder: 'Filter by calendar invitee company domain',
156+
condition: { field: 'operation', value: 'fathom_list_meetings' },
157+
mode: 'advanced',
158+
},
159+
{
160+
id: 'calendarInviteesDomainsType',
161+
title: 'Invitee Domain Type',
162+
type: 'dropdown',
163+
options: [
164+
{ label: 'All', id: 'all' },
165+
{ label: 'Only Internal', id: 'only_internal' },
166+
{ label: 'One or More External', id: 'one_or_more_external' },
167+
],
168+
condition: { field: 'operation', value: 'fathom_list_meetings' },
169+
mode: 'advanced',
170+
},
131171
{
132172
id: 'cursor',
133173
title: 'Pagination Cursor',
134174
type: 'short-input',
135175
placeholder: 'Cursor from a previous response',
136176
condition: {
137177
field: 'operation',
138-
value: ['fathom_list_meetings', 'fathom_list_team_members', 'fathom_list_teams'],
178+
value: [
179+
'fathom_list_meetings',
180+
'fathom_list_meeting_types',
181+
'fathom_list_team_members',
182+
'fathom_list_teams',
183+
],
139184
},
140185
mode: 'advanced',
141186
},
@@ -162,6 +207,7 @@ export const FathomBlock: BlockConfig<FathomResponse> = {
162207
tools: {
163208
access: [
164209
'fathom_list_meetings',
210+
'fathom_list_meeting_types',
165211
'fathom_get_summary',
166212
'fathom_get_transcript',
167213
'fathom_list_team_members',
@@ -187,17 +233,31 @@ export const FathomBlock: BlockConfig<FathomResponse> = {
187233
type: 'string',
188234
description: 'Include linked CRM matches in meetings response',
189235
},
236+
includeHighlights: {
237+
type: 'string',
238+
description: 'Include highlights in meetings response',
239+
},
190240
createdAfter: { type: 'string', description: 'Filter meetings created after this timestamp' },
191241
createdBefore: {
192242
type: 'string',
193243
description: 'Filter meetings created before this timestamp',
194244
},
195245
recordedBy: { type: 'string', description: 'Filter by recorder email' },
196246
teams: { type: 'string', description: 'Filter by team name' },
247+
meetingType: { type: 'string', description: 'Filter by meeting type name' },
248+
calendarInviteesDomains: {
249+
type: 'string',
250+
description: 'Filter by calendar invitee company domain',
251+
},
252+
calendarInviteesDomainsType: {
253+
type: 'string',
254+
description: 'Filter by invitee domain type',
255+
},
197256
cursor: { type: 'string', description: 'Pagination cursor for next page' },
198257
},
199258
outputs: {
200259
meetings: { type: 'json', description: 'List of meetings' },
260+
meetingTypes: { type: 'json', description: 'List of meeting types' },
201261
template_name: { type: 'string', description: 'Summary template name' },
202262
markdown_formatted: { type: 'string', description: 'Markdown-formatted summary' },
203263
transcript: { type: 'json', description: 'Meeting transcript entries' },

apps/sim/lib/integrations/integrations.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5086,6 +5086,10 @@
50865086
"name": "List Meetings",
50875087
"description": "List recent meetings recorded by the user or shared to their team."
50885088
},
5089+
{
5090+
"name": "List Meeting Types",
5091+
"description": "List meeting types configured in your Fathom organization."
5092+
},
50895093
{
50905094
"name": "Get Summary",
50915095
"description": "Get the call summary for a specific meeting recording."
@@ -5103,7 +5107,7 @@
51035107
"description": "List teams in your Fathom organization."
51045108
}
51055109
],
5106-
"operationCount": 5,
5110+
"operationCount": 6,
51075111
"triggers": [
51085112
{
51095113
"id": "fathom_new_meeting",

apps/sim/tools/fathom/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
import { getSummaryTool } from '@/tools/fathom/get_summary'
22
import { getTranscriptTool } from '@/tools/fathom/get_transcript'
3+
import { listMeetingTypesTool } from '@/tools/fathom/list_meeting_types'
34
import { listMeetingsTool } from '@/tools/fathom/list_meetings'
45
import { listTeamMembersTool } from '@/tools/fathom/list_team_members'
56
import { listTeamsTool } from '@/tools/fathom/list_teams'
67

78
export const fathomGetSummaryTool = getSummaryTool
89
export const fathomGetTranscriptTool = getTranscriptTool
910
export const fathomListMeetingsTool = listMeetingsTool
11+
export const fathomListMeetingTypesTool = listMeetingTypesTool
1012
export const fathomListTeamMembersTool = listTeamMembersTool
1113
export const fathomListTeamsTool = listTeamsTool
1214

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
import type {
2+
FathomListMeetingTypesParams,
3+
FathomListMeetingTypesResponse,
4+
} from '@/tools/fathom/types'
5+
import type { ToolConfig } from '@/tools/types'
6+
7+
export const listMeetingTypesTool: ToolConfig<
8+
FathomListMeetingTypesParams,
9+
FathomListMeetingTypesResponse
10+
> = {
11+
id: 'fathom_list_meeting_types',
12+
name: 'Fathom List Meeting Types',
13+
description: 'List meeting types configured in your Fathom organization.',
14+
version: '1.0.0',
15+
16+
params: {
17+
apiKey: {
18+
type: 'string',
19+
required: true,
20+
visibility: 'user-only',
21+
description: 'Fathom API Key',
22+
},
23+
cursor: {
24+
type: 'string',
25+
required: false,
26+
visibility: 'user-or-llm',
27+
description: 'Pagination cursor from a previous response',
28+
},
29+
},
30+
31+
request: {
32+
url: (params) => {
33+
const url = new URL('https://api.fathom.ai/external/v1/meeting_types')
34+
if (params.cursor) url.searchParams.append('cursor', params.cursor)
35+
return url.toString()
36+
},
37+
method: 'GET',
38+
headers: (params) => ({
39+
'X-Api-Key': params.apiKey,
40+
'Content-Type': 'application/json',
41+
}),
42+
},
43+
44+
transformResponse: async (response: Response) => {
45+
if (!response.ok) {
46+
const errorData = await response.json().catch(() => ({}))
47+
return {
48+
success: false,
49+
error:
50+
(errorData as Record<string, string>).message ||
51+
`Fathom API error: ${response.status} ${response.statusText}`,
52+
output: {
53+
meetingTypes: [],
54+
next_cursor: null,
55+
},
56+
}
57+
}
58+
59+
const data = await response.json()
60+
const meetingTypes = (data.items ?? []).map(
61+
(meetingType: { name?: string; status?: string; created_at?: string }) => ({
62+
name: meetingType.name ?? '',
63+
status: meetingType.status ?? '',
64+
created_at: meetingType.created_at ?? '',
65+
})
66+
)
67+
68+
return {
69+
success: true,
70+
output: {
71+
meetingTypes,
72+
next_cursor: data.next_cursor ?? null,
73+
},
74+
}
75+
},
76+
77+
outputs: {
78+
meetingTypes: {
79+
type: 'array',
80+
description: 'List of meeting types',
81+
items: {
82+
type: 'object',
83+
properties: {
84+
name: { type: 'string', description: 'Meeting type name' },
85+
status: { type: 'string', description: 'Meeting type status: active or inactive' },
86+
created_at: { type: 'string', description: 'Date the meeting type was created' },
87+
},
88+
},
89+
},
90+
next_cursor: {
91+
type: 'string',
92+
description: 'Pagination cursor for next page',
93+
optional: true,
94+
},
95+
},
96+
}

0 commit comments

Comments
 (0)