mirror of
https://github.com/simstudioai/sim.git
synced 2026-09-24 15:45:35 +08:00
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.
This commit is contained in:
@@ -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`
|
||||
|
||||
@@ -24,6 +24,7 @@ export const FathomBlock: BlockConfig<FathomResponse> = {
|
||||
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<FathomResponse> = {
|
||||
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<FathomResponse> = {
|
||||
},
|
||||
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<FathomResponse> = {
|
||||
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<FathomResponse> = {
|
||||
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<FathomResponse> = {
|
||||
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<FathomResponse> = {
|
||||
},
|
||||
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' },
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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<string, string>).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,
|
||||
},
|
||||
},
|
||||
}
|
||||
@@ -38,6 +38,12 @@ export const listMeetingsTool: ToolConfig<FathomListMeetingsParams, FathomListMe
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Include linked CRM matches (true/false)',
|
||||
},
|
||||
includeHighlights: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Include meeting highlights (true/false)',
|
||||
},
|
||||
createdAfter: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
@@ -62,6 +68,24 @@ export const listMeetingsTool: ToolConfig<FathomListMeetingsParams, FathomListMe
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Filter by team name',
|
||||
},
|
||||
meetingType: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Filter by meeting type name',
|
||||
},
|
||||
calendarInviteesDomains: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Filter by calendar invitee company domain (exact match)',
|
||||
},
|
||||
calendarInviteesDomainsType: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
visibility: 'user-or-llm',
|
||||
description: 'Filter by invitee domain type: all, only_internal, or one_or_more_external',
|
||||
},
|
||||
cursor: {
|
||||
type: 'string',
|
||||
required: false,
|
||||
@@ -79,10 +103,19 @@ export const listMeetingsTool: ToolConfig<FathomListMeetingsParams, FathomListMe
|
||||
url.searchParams.append('include_action_items', 'true')
|
||||
if (params.includeCrmMatches === 'true')
|
||||
url.searchParams.append('include_crm_matches', 'true')
|
||||
if (params.includeHighlights === 'true') url.searchParams.append('include_highlights', 'true')
|
||||
if (params.createdAfter) url.searchParams.append('created_after', params.createdAfter)
|
||||
if (params.createdBefore) url.searchParams.append('created_before', params.createdBefore)
|
||||
if (params.recordedBy) url.searchParams.append('recorded_by[]', params.recordedBy)
|
||||
if (params.teams) url.searchParams.append('teams[]', params.teams)
|
||||
if (params.meetingType) url.searchParams.append('meeting_type', params.meetingType)
|
||||
if (params.calendarInviteesDomains)
|
||||
url.searchParams.append('calendar_invitees_domains[]', params.calendarInviteesDomains)
|
||||
if (params.calendarInviteesDomainsType && params.calendarInviteesDomainsType !== 'all')
|
||||
url.searchParams.append(
|
||||
'calendar_invitees_domains_type',
|
||||
params.calendarInviteesDomainsType
|
||||
)
|
||||
if (params.cursor) url.searchParams.append('cursor', params.cursor)
|
||||
return url.toString()
|
||||
},
|
||||
@@ -114,8 +147,10 @@ export const listMeetingsTool: ToolConfig<FathomListMeetingsParams, FathomListMe
|
||||
(meeting: Record<string, unknown> & { recorded_by?: Record<string, unknown> }) => ({
|
||||
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<FathomListMeetingsParams, FathomListMe
|
||||
recording_end_time: meeting.recording_end_time ?? null,
|
||||
transcript_language: meeting.transcript_language ?? '',
|
||||
calendar_invitees_domains_type: meeting.calendar_invitees_domains_type ?? null,
|
||||
shared_with: meeting.shared_with ?? null,
|
||||
recorded_by: meeting.recorded_by
|
||||
? {
|
||||
name: meeting.recorded_by.name ?? '',
|
||||
@@ -136,6 +172,7 @@ export const listMeetingsTool: ToolConfig<FathomListMeetingsParams, FathomListMe
|
||||
default_summary: meeting.default_summary ?? null,
|
||||
transcript: meeting.transcript ?? null,
|
||||
action_items: meeting.action_items ?? null,
|
||||
highlights: meeting.highlights ?? null,
|
||||
crm_matches: meeting.crm_matches ?? null,
|
||||
})
|
||||
)
|
||||
@@ -157,11 +194,213 @@ export const listMeetingsTool: ToolConfig<FathomListMeetingsParams, FathomListMe
|
||||
type: 'object',
|
||||
properties: {
|
||||
title: { type: 'string', description: 'Meeting title' },
|
||||
recording_id: { type: 'number', description: 'Unique recording ID' },
|
||||
meeting_title: { type: 'string', description: 'Calendar event title', optional: true },
|
||||
meeting_type: { type: 'string', description: 'Meeting type name', optional: true },
|
||||
recording_id: { type: 'number', description: 'Unique recording ID', optional: true },
|
||||
url: { type: 'string', description: 'URL to view the meeting' },
|
||||
meeting_url: {
|
||||
type: 'string',
|
||||
description: 'URL of the underlying video call (Zoom, Meet, Teams, etc.)',
|
||||
optional: true,
|
||||
},
|
||||
share_url: { type: 'string', description: 'Shareable URL' },
|
||||
created_at: { type: 'string', description: 'Creation timestamp' },
|
||||
scheduled_start_time: {
|
||||
type: 'string',
|
||||
description: 'Scheduled start time',
|
||||
optional: true,
|
||||
},
|
||||
scheduled_end_time: {
|
||||
type: 'string',
|
||||
description: 'Scheduled end time',
|
||||
optional: true,
|
||||
},
|
||||
recording_start_time: {
|
||||
type: 'string',
|
||||
description: 'Recording start time',
|
||||
optional: true,
|
||||
},
|
||||
recording_end_time: {
|
||||
type: 'string',
|
||||
description: 'Recording end time',
|
||||
optional: true,
|
||||
},
|
||||
transcript_language: { type: 'string', description: 'Transcript language' },
|
||||
calendar_invitees_domains_type: {
|
||||
type: 'string',
|
||||
description: 'Invitee domain type: only_internal or one_or_more_external',
|
||||
optional: true,
|
||||
},
|
||||
shared_with: {
|
||||
type: 'string',
|
||||
description: 'Sharing scope: no_teams, single_team, multiple_teams, or all_teams',
|
||||
optional: true,
|
||||
},
|
||||
recorded_by: {
|
||||
type: 'object',
|
||||
description: 'Recorder details',
|
||||
optional: true,
|
||||
properties: {
|
||||
name: { type: 'string', description: 'Name of the recorder' },
|
||||
email: { type: 'string', description: 'Email of the recorder' },
|
||||
email_domain: { type: 'string', description: 'Email domain of the recorder' },
|
||||
team: { type: 'string', description: 'Recorder team name', optional: true },
|
||||
},
|
||||
},
|
||||
calendar_invitees: {
|
||||
type: 'array',
|
||||
description: 'Calendar invitees for the meeting',
|
||||
items: {
|
||||
type: 'object',
|
||||
properties: {
|
||||
name: { type: 'string', description: 'Invitee name', optional: true },
|
||||
email: { type: 'string', description: 'Invitee email', optional: true },
|
||||
email_domain: {
|
||||
type: 'string',
|
||||
description: 'Invitee email domain',
|
||||
optional: true,
|
||||
},
|
||||
is_external: { type: 'boolean', description: 'Whether the invitee is external' },
|
||||
matched_speaker_display_name: {
|
||||
type: 'string',
|
||||
description: 'Matched transcript speaker display name',
|
||||
optional: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
default_summary: {
|
||||
type: 'object',
|
||||
description: 'Meeting summary',
|
||||
optional: true,
|
||||
properties: {
|
||||
template_name: {
|
||||
type: 'string',
|
||||
description: 'Summary template name',
|
||||
optional: true,
|
||||
},
|
||||
markdown_formatted: {
|
||||
type: 'string',
|
||||
description: 'Markdown-formatted summary',
|
||||
optional: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
transcript: {
|
||||
type: 'array',
|
||||
description: 'Transcript entries with speaker, text, and timestamp',
|
||||
optional: true,
|
||||
items: {
|
||||
type: 'object',
|
||||
properties: {
|
||||
speaker: {
|
||||
type: 'object',
|
||||
description: 'Speaker information',
|
||||
properties: {
|
||||
display_name: { type: 'string', description: 'Speaker display name' },
|
||||
matched_calendar_invitee_email: {
|
||||
type: 'string',
|
||||
description: 'Matched calendar invitee email',
|
||||
optional: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
text: { type: 'string', description: 'Transcript text' },
|
||||
timestamp: { type: 'string', description: 'Timestamp (HH:MM:SS)' },
|
||||
},
|
||||
},
|
||||
},
|
||||
action_items: {
|
||||
type: 'array',
|
||||
description: 'Action items extracted from the meeting',
|
||||
optional: true,
|
||||
items: {
|
||||
type: 'object',
|
||||
properties: {
|
||||
description: { type: 'string', description: 'Action item description' },
|
||||
user_generated: {
|
||||
type: 'boolean',
|
||||
description: 'Whether the action item was user-generated',
|
||||
},
|
||||
completed: { type: 'boolean', description: 'Whether the action item is completed' },
|
||||
recording_timestamp: {
|
||||
type: 'string',
|
||||
description: 'Timestamp in the recording (HH:MM:SS)',
|
||||
},
|
||||
recording_playback_url: {
|
||||
type: 'string',
|
||||
description: 'Playback URL for the action item moment',
|
||||
},
|
||||
assignee: {
|
||||
type: 'object',
|
||||
description: 'Assignee details',
|
||||
properties: {
|
||||
name: { type: 'string', description: 'Assignee name', optional: true },
|
||||
email: { type: 'string', description: 'Assignee email', optional: true },
|
||||
team: { type: 'string', description: 'Assignee team', optional: true },
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
highlights: {
|
||||
type: 'array',
|
||||
description: 'Meeting highlights with type, summary, text, and start/end time',
|
||||
optional: true,
|
||||
items: {
|
||||
type: 'object',
|
||||
properties: {
|
||||
type: { type: 'string', description: 'Highlight type' },
|
||||
summary: { type: 'string', description: 'Highlight summary', optional: true },
|
||||
text: { type: 'string', description: 'Highlight text' },
|
||||
start_time: { type: 'number', description: 'Start time in seconds' },
|
||||
end_time: { type: 'number', description: 'End time in seconds' },
|
||||
},
|
||||
},
|
||||
},
|
||||
crm_matches: {
|
||||
type: 'object',
|
||||
description: 'Matched CRM contacts, companies, and deals',
|
||||
optional: true,
|
||||
properties: {
|
||||
contacts: {
|
||||
type: 'array',
|
||||
description: 'Matched CRM contacts',
|
||||
items: {
|
||||
type: 'object',
|
||||
properties: {
|
||||
name: { type: 'string', description: 'Contact name' },
|
||||
email: { type: 'string', description: 'Contact email' },
|
||||
record_url: { type: 'string', description: 'CRM record URL' },
|
||||
},
|
||||
},
|
||||
},
|
||||
companies: {
|
||||
type: 'array',
|
||||
description: 'Matched CRM companies',
|
||||
items: {
|
||||
type: 'object',
|
||||
properties: {
|
||||
name: { type: 'string', description: 'Company name' },
|
||||
record_url: { type: 'string', description: 'CRM record URL' },
|
||||
},
|
||||
},
|
||||
},
|
||||
deals: {
|
||||
type: 'array',
|
||||
description: 'Matched CRM deals',
|
||||
items: {
|
||||
type: 'object',
|
||||
properties: {
|
||||
name: { type: 'string', description: 'Deal name' },
|
||||
amount: { type: 'number', description: 'Deal amount' },
|
||||
record_url: { type: 'string', description: 'CRM record URL' },
|
||||
},
|
||||
},
|
||||
},
|
||||
error: { type: 'string', description: 'CRM match error, if any', optional: true },
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
@@ -9,10 +9,14 @@ export interface FathomListMeetingsParams extends FathomBaseParams {
|
||||
includeTranscript?: string
|
||||
includeActionItems?: string
|
||||
includeCrmMatches?: string
|
||||
includeHighlights?: string
|
||||
createdAfter?: string
|
||||
createdBefore?: string
|
||||
recordedBy?: string
|
||||
teams?: string
|
||||
meetingType?: string
|
||||
calendarInviteesDomains?: string
|
||||
calendarInviteesDomainsType?: string
|
||||
cursor?: string
|
||||
}
|
||||
|
||||
@@ -21,8 +25,10 @@ export interface FathomListMeetingsResponse extends ToolResponse {
|
||||
meetings: Array<{
|
||||
title: string
|
||||
meeting_title: string | null
|
||||
meeting_type: string | null
|
||||
recording_id: number | null
|
||||
url: string
|
||||
meeting_url: string | null
|
||||
share_url: string
|
||||
created_at: string
|
||||
scheduled_start_time: string | null
|
||||
@@ -31,6 +37,7 @@ export interface FathomListMeetingsResponse extends ToolResponse {
|
||||
recording_end_time: string | null
|
||||
transcript_language: string
|
||||
calendar_invitees_domains_type: string | null
|
||||
shared_with: string | null
|
||||
recorded_by: { name: string; email: string; email_domain: string; team: string | null } | null
|
||||
calendar_invitees: Array<{
|
||||
name: string | null
|
||||
@@ -53,6 +60,13 @@ export interface FathomListMeetingsResponse extends ToolResponse {
|
||||
recording_playback_url: string
|
||||
assignee: { name: string | null; email: string | null; team: string | null }
|
||||
}> | 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
|
||||
|
||||
@@ -916,6 +916,7 @@ import {
|
||||
fathomGetSummaryTool,
|
||||
fathomGetTranscriptTool,
|
||||
fathomListMeetingsTool,
|
||||
fathomListMeetingTypesTool,
|
||||
fathomListTeamMembersTool,
|
||||
fathomListTeamsTool,
|
||||
} from '@/tools/fathom'
|
||||
@@ -6963,6 +6964,7 @@ export const tools: Record<string, ToolConfig> = {
|
||||
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,
|
||||
|
||||
Reference in New Issue
Block a user