Skip to content

Commit 97f78c6

Browse files
waleedlatif1claudelakeesivicecrasher321
authored
feat(tools): add Fathom AI Notetaker integration (#3531)
* feat(fathom): add Fathom AI Notetaker integration * fix(fathom): address PR review feedback - Add response.ok checks to all 5 tool transformResponse functions - Fix include_summary default to respect explicit false (check undefined) - Add externalId validation before URL interpolation in webhook deletion * fix(fathom): address second round PR review feedback - Remove redundant 204 status check in deleteFathomWebhook (204 is ok) - Use consistent undefined-guard pattern for all include flags - Add .catch() fallback on webhook creation JSON parse - Change recording_id default from 0 to null to avoid misleading sentinel * fix(fathom): add missing crm_matches to list_meetings transform and fix action_items type - Add crm_matches pass-through in list_meetings transform (was silently dropped) - Fix action_items type to match API schema (description, user_generated, completed, etc.) - Add crm_matches type with contacts, companies, deals, error fields * fix(fathom): guard against undefined webhook id on creation success * fix(fathom): add type to nested trigger outputs and fix boolean coercion - Add type: 'object' to recorded_by and default_summary trigger outputs - Use val === true || val === 'true' pattern for include flag coercion to safely handle both boolean and string values from providerConfig --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> Co-authored-by: Lakee Sivaraya <71339072+lakeesiv@users.noreply.github.com> Co-authored-by: Vikhyath Mondreti <vikhyath@simstudio.ai> Co-authored-by: Vikhyath Mondreti <vikhyathvikku@gmail.com>
1 parent 9295499 commit 97f78c6

File tree

21 files changed

+1629
-0
lines changed

21 files changed

+1629
-0
lines changed

apps/docs/components/icons.tsx

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1979,6 +1979,24 @@ export function ElevenLabsIcon(props: SVGProps<SVGSVGElement>) {
19791979
)
19801980
}
19811981

1982+
export function FathomIcon(props: SVGProps<SVGSVGElement>) {
1983+
return (
1984+
<svg {...props} xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1000 1000' fill='none'>
1985+
<path
1986+
d='M0,668.7v205.78c0,53.97,34.24,102.88,85.8,119.08,87.48,27.49,167.88-36.99,167.88-120.22v-77.45L0,668.7Z'
1987+
fill='#007299'
1988+
/>
1989+
<path
1990+
d='M873.72,626.07c-19.05,0-38.38-4.3-56.58-13.38L72.78,241.43C11.15,210.69-17.51,136.6,11.18,74.05,41.2,8.59,119.26-18.53,183.23,13.38l744.25,371.21c62.45,31.15,91,109.08,59.79,171.43-22.22,44.38-67.02,70.05-113.55,70.05Z'
1991+
fill='#00beff'
1992+
/>
1993+
<path
1994+
d='M500.09,813.66c-19.05,0-38.38-4.3-56.58-13.38l-370.72-184.9c-61.63-30.74-90.29-104.82-61.61-167.37,30.02-65.46,108.08-92.59,172.06-60.68l370.62,184.85c62.45,31.15,91,109.08,59.79,171.43-22.22,44.38-67.02,70.05-113.55,70.05Z'
1995+
fill='#00beff'
1996+
/>
1997+
</svg>
1998+
)
1999+
}
19822000
export function LinkupIcon(props: SVGProps<SVGSVGElement>) {
19832001
return (
19842002
<svg {...props} xmlns='http://www.w3.org/2000/svg' viewBox='0 0 154 107' fill='none'>

apps/docs/components/ui/icon-mapping.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ import {
4343
EvernoteIcon,
4444
ExaAIIcon,
4545
EyeIcon,
46+
FathomIcon,
4647
FirecrawlIcon,
4748
FirefliesIcon,
4849
GammaIcon,
@@ -206,6 +207,7 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
206207
enrich: EnrichSoIcon,
207208
evernote: EvernoteIcon,
208209
exa: ExaAIIcon,
210+
fathom: FathomIcon,
209211
file_v3: DocumentIcon,
210212
firecrawl: FirecrawlIcon,
211213
fireflies_v2: FirefliesIcon,
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
---
2+
title: Fathom
3+
description: Access meeting recordings, transcripts, and summaries
4+
---
5+
6+
import { BlockInfoCard } from "@/components/ui/block-info-card"
7+
8+
<BlockInfoCard
9+
type="fathom"
10+
color="#181C1E"
11+
/>
12+
13+
## Usage Instructions
14+
15+
Integrate Fathom AI Notetaker into your workflow. List meetings, get transcripts and summaries, and manage team members and teams. Can also trigger workflows when new meeting content is ready.
16+
17+
18+
19+
## Tools
20+
21+
### `fathom_list_meetings`
22+
23+
List recent meetings recorded by the user or shared to their team.
24+
25+
#### Input
26+
27+
| Parameter | Type | Required | Description |
28+
| --------- | ---- | -------- | ----------- |
29+
| `apiKey` | string | Yes | Fathom API Key |
30+
| `includeSummary` | string | No | Include meeting summary \(true/false\) |
31+
| `includeTranscript` | string | No | Include meeting transcript \(true/false\) |
32+
| `includeActionItems` | string | No | Include action items \(true/false\) |
33+
| `includeCrmMatches` | string | No | Include linked CRM matches \(true/false\) |
34+
| `createdAfter` | string | No | Filter meetings created after this ISO 8601 timestamp |
35+
| `createdBefore` | string | No | Filter meetings created before this ISO 8601 timestamp |
36+
| `recordedBy` | string | No | Filter by recorder email address |
37+
| `teams` | string | No | Filter by team name |
38+
| `cursor` | string | No | Pagination cursor from a previous response |
39+
40+
#### Output
41+
42+
| Parameter | Type | Description |
43+
| --------- | ---- | ----------- |
44+
| `meetings` | array | List of meetings |
45+
|`title` | string | Meeting title |
46+
|`recording_id` | number | Unique recording ID |
47+
|`url` | string | URL to view the meeting |
48+
|`share_url` | string | Shareable URL |
49+
|`created_at` | string | Creation timestamp |
50+
|`transcript_language` | string | Transcript language |
51+
| `next_cursor` | string | Pagination cursor for next page |
52+
53+
### `fathom_get_summary`
54+
55+
Get the call summary for a specific meeting recording.
56+
57+
#### Input
58+
59+
| Parameter | Type | Required | Description |
60+
| --------- | ---- | -------- | ----------- |
61+
| `apiKey` | string | Yes | Fathom API Key |
62+
| `recordingId` | string | Yes | The recording ID of the meeting |
63+
64+
#### Output
65+
66+
| Parameter | Type | Description |
67+
| --------- | ---- | ----------- |
68+
| `template_name` | string | Name of the summary template used |
69+
| `markdown_formatted` | string | Markdown-formatted summary text |
70+
71+
### `fathom_get_transcript`
72+
73+
Get the full transcript for a specific meeting recording.
74+
75+
#### Input
76+
77+
| Parameter | Type | Required | Description |
78+
| --------- | ---- | -------- | ----------- |
79+
| `apiKey` | string | Yes | Fathom API Key |
80+
| `recordingId` | string | Yes | The recording ID of the meeting |
81+
82+
#### Output
83+
84+
| Parameter | Type | Description |
85+
| --------- | ---- | ----------- |
86+
| `transcript` | array | Array of transcript entries with speaker, text, and timestamp |
87+
|`speaker` | object | Speaker information |
88+
|`display_name` | string | Speaker display name |
89+
|`matched_calendar_invitee_email` | string | Matched calendar invitee email |
90+
|`text` | string | Transcript text |
91+
|`timestamp` | string | Timestamp \(HH:MM:SS\) |
92+
93+
### `fathom_list_team_members`
94+
95+
List team members in your Fathom organization.
96+
97+
#### Input
98+
99+
| Parameter | Type | Required | Description |
100+
| --------- | ---- | -------- | ----------- |
101+
| `apiKey` | string | Yes | Fathom API Key |
102+
| `teams` | string | No | Team name to filter by |
103+
| `cursor` | string | No | Pagination cursor from a previous response |
104+
105+
#### Output
106+
107+
| Parameter | Type | Description |
108+
| --------- | ---- | ----------- |
109+
| `members` | array | List of team members |
110+
|`name` | string | Team member name |
111+
|`email` | string | Team member email |
112+
|`created_at` | string | Date the member was added |
113+
| `next_cursor` | string | Pagination cursor for next page |
114+
115+
### `fathom_list_teams`
116+
117+
List teams in your Fathom organization.
118+
119+
#### Input
120+
121+
| Parameter | Type | Required | Description |
122+
| --------- | ---- | -------- | ----------- |
123+
| `apiKey` | string | Yes | Fathom API Key |
124+
| `cursor` | string | No | Pagination cursor from a previous response |
125+
126+
#### Output
127+
128+
| Parameter | Type | Description |
129+
| --------- | ---- | ----------- |
130+
| `teams` | array | List of teams |
131+
|`name` | string | Team name |
132+
|`created_at` | string | Date the team was created |
133+
| `next_cursor` | string | Pagination cursor for next page |
134+
135+

apps/docs/content/docs/en/tools/meta.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
"enrich",
3838
"evernote",
3939
"exa",
40+
"fathom",
4041
"file",
4142
"firecrawl",
4243
"fireflies",

apps/sim/blocks/blocks/fathom.ts

Lines changed: 211 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,211 @@
1+
import { FathomIcon } from '@/components/icons'
2+
import { AuthMode, type BlockConfig } from '@/blocks/types'
3+
import type { FathomResponse } from '@/tools/fathom/types'
4+
import { getTrigger } from '@/triggers'
5+
import { fathomTriggerOptions } from '@/triggers/fathom/utils'
6+
7+
export const FathomBlock: BlockConfig<FathomResponse> = {
8+
type: 'fathom',
9+
name: 'Fathom',
10+
description: 'Access meeting recordings, transcripts, and summaries',
11+
authMode: AuthMode.ApiKey,
12+
triggerAllowed: true,
13+
longDescription:
14+
'Integrate Fathom AI Notetaker into your workflow. List meetings, get transcripts and summaries, and manage team members and teams. Can also trigger workflows when new meeting content is ready.',
15+
docsLink: 'https://docs.sim.ai/tools/fathom',
16+
category: 'tools',
17+
bgColor: '#181C1E',
18+
icon: FathomIcon,
19+
subBlocks: [
20+
{
21+
id: 'operation',
22+
title: 'Operation',
23+
type: 'dropdown',
24+
options: [
25+
{ label: 'List Meetings', id: 'fathom_list_meetings' },
26+
{ label: 'Get Summary', id: 'fathom_get_summary' },
27+
{ label: 'Get Transcript', id: 'fathom_get_transcript' },
28+
{ label: 'List Team Members', id: 'fathom_list_team_members' },
29+
{ label: 'List Teams', id: 'fathom_list_teams' },
30+
],
31+
value: () => 'fathom_list_meetings',
32+
},
33+
{
34+
id: 'recordingId',
35+
title: 'Recording ID',
36+
type: 'short-input',
37+
required: { field: 'operation', value: ['fathom_get_summary', 'fathom_get_transcript'] },
38+
placeholder: 'Enter the recording ID',
39+
condition: { field: 'operation', value: ['fathom_get_summary', 'fathom_get_transcript'] },
40+
},
41+
{
42+
id: 'includeSummary',
43+
title: 'Include Summary',
44+
type: 'dropdown',
45+
options: [
46+
{ label: 'No', id: 'false' },
47+
{ label: 'Yes', id: 'true' },
48+
],
49+
value: () => 'false',
50+
condition: { field: 'operation', value: 'fathom_list_meetings' },
51+
},
52+
{
53+
id: 'includeTranscript',
54+
title: 'Include Transcript',
55+
type: 'dropdown',
56+
options: [
57+
{ label: 'No', id: 'false' },
58+
{ label: 'Yes', id: 'true' },
59+
],
60+
value: () => 'false',
61+
condition: { field: 'operation', value: 'fathom_list_meetings' },
62+
},
63+
{
64+
id: 'includeActionItems',
65+
title: 'Include Action Items',
66+
type: 'dropdown',
67+
options: [
68+
{ label: 'No', id: 'false' },
69+
{ label: 'Yes', id: 'true' },
70+
],
71+
value: () => 'false',
72+
condition: { field: 'operation', value: 'fathom_list_meetings' },
73+
},
74+
{
75+
id: 'includeCrmMatches',
76+
title: 'Include CRM Matches',
77+
type: 'dropdown',
78+
options: [
79+
{ label: 'No', id: 'false' },
80+
{ label: 'Yes', id: 'true' },
81+
],
82+
value: () => 'false',
83+
condition: { field: 'operation', value: 'fathom_list_meetings' },
84+
},
85+
{
86+
id: 'createdAfter',
87+
title: 'Created After',
88+
type: 'short-input',
89+
placeholder: 'ISO 8601 timestamp (e.g., 2025-01-01T00:00:00Z)',
90+
condition: { field: 'operation', value: 'fathom_list_meetings' },
91+
mode: 'advanced',
92+
wandConfig: {
93+
enabled: true,
94+
prompt: 'Generate an ISO 8601 timestamp. Return ONLY the timestamp string.',
95+
generationType: 'timestamp',
96+
},
97+
},
98+
{
99+
id: 'createdBefore',
100+
title: 'Created Before',
101+
type: 'short-input',
102+
placeholder: 'ISO 8601 timestamp (e.g., 2025-12-31T23:59:59Z)',
103+
condition: { field: 'operation', value: 'fathom_list_meetings' },
104+
mode: 'advanced',
105+
wandConfig: {
106+
enabled: true,
107+
prompt: 'Generate an ISO 8601 timestamp. Return ONLY the timestamp string.',
108+
generationType: 'timestamp',
109+
},
110+
},
111+
{
112+
id: 'recordedBy',
113+
title: 'Recorded By',
114+
type: 'short-input',
115+
placeholder: 'Filter by recorder email',
116+
condition: { field: 'operation', value: 'fathom_list_meetings' },
117+
mode: 'advanced',
118+
},
119+
{
120+
id: 'teams',
121+
title: 'Team',
122+
type: 'short-input',
123+
placeholder: 'Filter by team name',
124+
condition: {
125+
field: 'operation',
126+
value: ['fathom_list_meetings', 'fathom_list_team_members'],
127+
},
128+
mode: 'advanced',
129+
},
130+
{
131+
id: 'cursor',
132+
title: 'Pagination Cursor',
133+
type: 'short-input',
134+
placeholder: 'Cursor from a previous response',
135+
condition: {
136+
field: 'operation',
137+
value: ['fathom_list_meetings', 'fathom_list_team_members', 'fathom_list_teams'],
138+
},
139+
mode: 'advanced',
140+
},
141+
{
142+
id: 'apiKey',
143+
title: 'API Key',
144+
type: 'short-input',
145+
required: true,
146+
placeholder: 'Enter your Fathom API key',
147+
password: true,
148+
},
149+
{
150+
id: 'selectedTriggerId',
151+
title: 'Trigger Type',
152+
type: 'dropdown',
153+
mode: 'trigger',
154+
options: fathomTriggerOptions,
155+
value: () => 'fathom_new_meeting',
156+
required: true,
157+
},
158+
...getTrigger('fathom_new_meeting').subBlocks,
159+
...getTrigger('fathom_webhook').subBlocks,
160+
],
161+
tools: {
162+
access: [
163+
'fathom_list_meetings',
164+
'fathom_get_summary',
165+
'fathom_get_transcript',
166+
'fathom_list_team_members',
167+
'fathom_list_teams',
168+
],
169+
config: {
170+
tool: (params) => {
171+
return params.operation || 'fathom_list_meetings'
172+
},
173+
},
174+
},
175+
inputs: {
176+
operation: { type: 'string', description: 'Operation to perform' },
177+
apiKey: { type: 'string', description: 'Fathom API key' },
178+
recordingId: { type: 'string', description: 'Recording ID for summary or transcript' },
179+
includeSummary: { type: 'string', description: 'Include summary in meetings response' },
180+
includeTranscript: { type: 'string', description: 'Include transcript in meetings response' },
181+
includeActionItems: {
182+
type: 'string',
183+
description: 'Include action items in meetings response',
184+
},
185+
includeCrmMatches: {
186+
type: 'string',
187+
description: 'Include linked CRM matches in meetings response',
188+
},
189+
createdAfter: { type: 'string', description: 'Filter meetings created after this timestamp' },
190+
createdBefore: {
191+
type: 'string',
192+
description: 'Filter meetings created before this timestamp',
193+
},
194+
recordedBy: { type: 'string', description: 'Filter by recorder email' },
195+
teams: { type: 'string', description: 'Filter by team name' },
196+
cursor: { type: 'string', description: 'Pagination cursor for next page' },
197+
},
198+
outputs: {
199+
meetings: { type: 'json', description: 'List of meetings' },
200+
template_name: { type: 'string', description: 'Summary template name' },
201+
markdown_formatted: { type: 'string', description: 'Markdown-formatted summary' },
202+
transcript: { type: 'json', description: 'Meeting transcript entries' },
203+
members: { type: 'json', description: 'List of team members' },
204+
teams: { type: 'json', description: 'List of teams' },
205+
next_cursor: { type: 'string', description: 'Pagination cursor' },
206+
},
207+
triggers: {
208+
enabled: true,
209+
available: ['fathom_new_meeting', 'fathom_webhook'],
210+
},
211+
}

0 commit comments

Comments
 (0)