Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions apps/docs/components/icons.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4796,6 +4796,22 @@ export function GoogleGroupsIcon(props: SVGProps<SVGSVGElement>) {
)
}

export function GoogleMeetIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg {...props} xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 87.5 72'>
<path fill='#00832d' d='M49.5 36l8.53 9.75 11.47 7.33 2-17.02-2-16.64-11.69 6.44z' />
<path fill='#0066da' d='M0 51.5V66c0 3.315 2.685 6 6 6h14.5l3-10.96-3-9.54-9.95-3z' />
<path fill='#e94235' d='M20.5 0L0 20.5l10.55 3 9.95-3 2.95-9.41z' />
<path fill='#2684fc' d='M20.5 20.5H0v31h20.5z' />
<path
fill='#00ac47'
d='M82.6 8.68L69.5 19.42v33.66l13.16 10.79c1.97 1.54 4.85.135 4.85-2.37V11c0-2.535-2.945-3.925-4.91-2.32zM49.5 36v15.5h-29V72h43c3.315 0 6-2.685 6-6V53.08z'
/>
<path fill='#ffba00' d='M63.5 0h-43v20.5h29V36l20-16.57V6c0-3.315-2.685-6-6-6z' />
</svg>
)
}

export function CursorIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg {...props} xmlns='http://www.w3.org/2000/svg' viewBox='0 0 546 546' fill='currentColor'>
Expand Down
2 changes: 2 additions & 0 deletions apps/docs/components/ui/icon-mapping.ts
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ import {
GoogleGroupsIcon,
GoogleIcon,
GoogleMapsIcon,
GoogleMeetIcon,
GooglePagespeedIcon,
GoogleSheetsIcon,
GoogleSlidesIcon,
Expand Down Expand Up @@ -217,6 +218,7 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
google_forms: GoogleFormsIcon,
google_groups: GoogleGroupsIcon,
google_maps: GoogleMapsIcon,
google_meet: GoogleMeetIcon,
google_pagespeed: GooglePagespeedIcon,
google_search: GoogleIcon,
google_sheets_v2: GoogleSheetsIcon,
Expand Down
156 changes: 156 additions & 0 deletions apps/docs/content/docs/en/tools/google_meet.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
---
title: Google Meet
description: Create and manage Google Meet meetings
---

import { BlockInfoCard } from "@/components/ui/block-info-card"

<BlockInfoCard
type="google_meet"
color="#E0E0E0"
/>

{/* MANUAL-CONTENT-START:intro */}
[Google Meet](https://meet.google.com) is Google's video conferencing and online meeting platform, providing secure, high-quality video calls for individuals and teams. As a core component of Google Workspace, Google Meet enables real-time collaboration through video meetings, screen sharing, and integrated chat.

The Google Meet REST API (v2) allows programmatic management of meeting spaces and conference records, enabling automated workflows to create meetings, track participation, and manage active conferences without manual intervention.

Key features of the Google Meet API include:

- **Meeting Space Management**: Create, retrieve, and configure meeting spaces with customizable access controls.
- **Conference Records**: Access historical conference data including start/end times and associated spaces.
- **Participant Tracking**: View participant details for any conference including join/leave times and user types.
- **Access Controls**: Configure who can join meetings (open, trusted, or restricted) and which entry points are allowed.
- **Active Conference Management**: Programmatically end active conferences in meeting spaces.

In Sim, the Google Meet integration allows your agents to create meeting spaces on demand, monitor conference activity, track participation across meetings, and manage active conferences as part of automated workflows. This enables scenarios such as automatically provisioning meeting rooms for scheduled events, generating attendance reports, ending stale conferences, and building meeting analytics dashboards.
{/* MANUAL-CONTENT-END */}


## Usage Instructions

Integrate Google Meet into your workflow. Create meeting spaces, get space details, end conferences, list conference records, and view participants.



## Tools

### `google_meet_create_space`

Create a new Google Meet meeting space

#### Input

| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `accessType` | string | No | Who can join the meeting without knocking: OPEN \(anyone with link\), TRUSTED \(org members\), RESTRICTED \(only invited\) |
| `entryPointAccess` | string | No | Entry points allowed: ALL \(all entry points\) or CREATOR_APP_ONLY \(only via app\) |

#### Output

| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `name` | string | Resource name of the space \(e.g., spaces/abc123\) |
| `meetingUri` | string | Meeting URL \(e.g., https://meet.google.com/abc-defg-hij\) |
| `meetingCode` | string | Meeting code \(e.g., abc-defg-hij\) |
| `accessType` | string | Access type configuration |
| `entryPointAccess` | string | Entry point access configuration |

### `google_meet_get_space`

Get details of a Google Meet meeting space by name or meeting code

#### Input

| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `spaceName` | string | Yes | Space resource name \(spaces/abc123\) or meeting code \(abc-defg-hij\) |

#### Output

| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `name` | string | Resource name of the space |
| `meetingUri` | string | Meeting URL |
| `meetingCode` | string | Meeting code |
| `accessType` | string | Access type configuration |
| `entryPointAccess` | string | Entry point access configuration |
| `activeConference` | string | Active conference record name |

### `google_meet_end_conference`

End the active conference in a Google Meet space

#### Input

| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `spaceName` | string | Yes | Space resource name \(e.g., spaces/abc123\) |

#### Output

| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `ended` | boolean | Whether the conference was ended successfully |

### `google_meet_list_conference_records`

List conference records for meetings you organized

#### Input

| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `filter` | string | No | Filter by space name \(e.g., space.name = "spaces/abc123"\) or time range \(e.g., start_time &gt; "2024-01-01T00:00:00Z"\) |
| `pageSize` | number | No | Maximum number of conference records to return \(max 100\) |
| `pageToken` | string | No | Page token from a previous list request |

#### Output

| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `conferenceRecords` | json | List of conference records with name, start/end times, and space |
| `nextPageToken` | string | Token for next page of results |

### `google_meet_get_conference_record`

Get details of a specific conference record

#### Input

| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `conferenceName` | string | Yes | Conference record resource name \(e.g., conferenceRecords/abc123\) |

#### Output

| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `name` | string | Conference record resource name |
| `startTime` | string | Conference start time |
| `endTime` | string | Conference end time |
| `expireTime` | string | Conference record expiration time |
| `space` | string | Associated space resource name |

### `google_meet_list_participants`

List participants of a conference record

#### Input

| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `conferenceName` | string | Yes | Conference record resource name \(e.g., conferenceRecords/abc123\) |
| `filter` | string | No | Filter participants \(e.g., earliest_start_time &gt; "2024-01-01T00:00:00Z"\) |
| `pageSize` | number | No | Maximum number of participants to return \(default 100, max 250\) |
| `pageToken` | string | No | Page token from a previous list request |

#### Output

| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `participants` | json | List of participants with name, times, display name, and user type |
| `nextPageToken` | string | Token for next page of results |
| `totalSize` | number | Total number of participants |


1 change: 1 addition & 0 deletions apps/docs/content/docs/en/tools/meta.json
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@
"google_forms",
"google_groups",
"google_maps",
"google_meet",
"google_pagespeed",
"google_search",
"google_sheets",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,10 @@ const SCOPE_DESCRIPTIONS: Record<string, string> = {
'https://www.googleapis.com/auth/admin.directory.group.readonly': 'View Google Workspace groups',
'https://www.googleapis.com/auth/admin.directory.group.member.readonly':
'View Google Workspace group memberships',
'https://www.googleapis.com/auth/meetings.space.created':
'Create and manage Google Meet meeting spaces',
'https://www.googleapis.com/auth/meetings.space.readonly':
'View Google Meet meeting space details',
'https://www.googleapis.com/auth/cloud-platform':
'Full access to Google Cloud resources for Vertex AI',
'read:confluence-content.all': 'Read all Confluence content',
Expand Down
182 changes: 182 additions & 0 deletions apps/sim/blocks/blocks/google_meet.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,182 @@
import { GoogleMeetIcon } from '@/components/icons'
import type { BlockConfig } from '@/blocks/types'
import { AuthMode } from '@/blocks/types'
import type { GoogleMeetResponse } from '@/tools/google_meet/types'

export const GoogleMeetBlock: BlockConfig<GoogleMeetResponse> = {
type: 'google_meet',
name: 'Google Meet',
description: 'Create and manage Google Meet meetings',
longDescription:
'Integrate Google Meet into your workflow. Create meeting spaces, get space details, end conferences, list conference records, and view participants.',
docsLink: 'https://docs.sim.ai/tools/google_meet',
category: 'tools',
bgColor: '#E0E0E0',
icon: GoogleMeetIcon,
authMode: AuthMode.OAuth,
subBlocks: [
{
id: 'operation',
title: 'Operation',
type: 'dropdown',
options: [
{ label: 'Create Space', id: 'create_space' },
{ label: 'Get Space', id: 'get_space' },
{ label: 'End Conference', id: 'end_conference' },
{ label: 'List Conference Records', id: 'list_conference_records' },
{ label: 'Get Conference Record', id: 'get_conference_record' },
{ label: 'List Participants', id: 'list_participants' },
],
value: () => 'create_space',
},
{
id: 'credential',
title: 'Google Meet Account',
type: 'oauth-input',
canonicalParamId: 'oauthCredential',
mode: 'basic',
required: true,
serviceId: 'google-meet',
requiredScopes: [
'https://www.googleapis.com/auth/meetings.space.created',
'https://www.googleapis.com/auth/meetings.space.readonly',
],
placeholder: 'Select Google Meet account',
},
{
id: 'manualCredential',
title: 'Google Meet Account',
type: 'short-input',
canonicalParamId: 'oauthCredential',
mode: 'advanced',
placeholder: 'Enter credential ID',
required: true,
},

// Create Space Fields
{
id: 'accessType',
title: 'Access Type',
type: 'dropdown',
condition: { field: 'operation', value: 'create_space' },
options: [
{ label: 'Open (anyone with link)', id: 'OPEN' },
{ label: 'Trusted (organization members)', id: 'TRUSTED' },
{ label: 'Restricted (invited only)', id: 'RESTRICTED' },
],
},
{
id: 'entryPointAccess',
title: 'Entry Point Access',
type: 'dropdown',
condition: { field: 'operation', value: 'create_space' },
mode: 'advanced',
options: [
{ label: 'All entry points', id: 'ALL' },
{ label: 'Creator app only', id: 'CREATOR_APP_ONLY' },
],
},

// Get Space / End Conference Fields
{
id: 'spaceName',
title: 'Space Name or Meeting Code',
type: 'short-input',
placeholder: 'spaces/abc123 or abc-defg-hij',
condition: { field: 'operation', value: ['get_space', 'end_conference'] },
required: { field: 'operation', value: ['get_space', 'end_conference'] },
},

// Conference Record Fields
{
id: 'conferenceName',
title: 'Conference Record Name',
type: 'short-input',
placeholder: 'conferenceRecords/abc123',
condition: { field: 'operation', value: ['get_conference_record', 'list_participants'] },
required: { field: 'operation', value: ['get_conference_record', 'list_participants'] },
},

// List Conference Records Fields
{
id: 'filter',
title: 'Filter',
type: 'short-input',
placeholder: 'space.name = "spaces/abc123"',
condition: { field: 'operation', value: ['list_conference_records', 'list_participants'] },
mode: 'advanced',
},
{
id: 'pageSize',
title: 'Page Size',
type: 'short-input',
placeholder: '25',
condition: { field: 'operation', value: ['list_conference_records', 'list_participants'] },
mode: 'advanced',
},
{
id: 'pageToken',
title: 'Page Token',
type: 'short-input',
placeholder: 'Token from previous request',
condition: { field: 'operation', value: ['list_conference_records', 'list_participants'] },
mode: 'advanced',
},
],
tools: {
access: [
'google_meet_create_space',
'google_meet_get_space',
'google_meet_end_conference',
'google_meet_list_conference_records',
'google_meet_get_conference_record',
'google_meet_list_participants',
],
config: {
tool: (params) => `google_meet_${params.operation}`,
params: (params) => {
const { oauthCredential, operation, pageSize, ...rest } = params

const processedParams: Record<string, unknown> = { ...rest }

if (pageSize) {
processedParams.pageSize =
typeof pageSize === 'string' ? Number.parseInt(pageSize, 10) : pageSize
}

return {
oauthCredential,
...processedParams,
}
},
},
},
inputs: {
operation: { type: 'string', description: 'Operation to perform' },
oauthCredential: { type: 'string', description: 'Google Meet access token' },
accessType: { type: 'string', description: 'Access type for meeting space' },
entryPointAccess: { type: 'string', description: 'Entry point access setting' },
spaceName: { type: 'string', description: 'Space resource name or meeting code' },
conferenceName: { type: 'string', description: 'Conference record resource name' },
filter: { type: 'string', description: 'Filter expression' },
pageSize: { type: 'string', description: 'Maximum results per page' },
pageToken: { type: 'string', description: 'Pagination token' },
},
outputs: {
name: { type: 'string', description: 'Resource name' },
meetingUri: { type: 'string', description: 'Meeting URL' },
meetingCode: { type: 'string', description: 'Meeting code' },
accessType: { type: 'string', description: 'Access type' },
entryPointAccess: { type: 'string', description: 'Entry point access' },
activeConference: { type: 'string', description: 'Active conference record' },
ended: { type: 'boolean', description: 'Whether conference was ended' },
conferenceRecords: { type: 'json', description: 'List of conference records' },
startTime: { type: 'string', description: 'Conference start time' },
endTime: { type: 'string', description: 'Conference end time' },
expireTime: { type: 'string', description: 'Record expiration time' },
space: { type: 'string', description: 'Associated space name' },
participants: { type: 'json', description: 'List of participants' },
nextPageToken: { type: 'string', description: 'Next page token' },
totalSize: { type: 'number', description: 'Total participant count' },
},
}
Loading