feat(google-groups): added google groups (#2229)

* added google-groups

* added a few more endpoints

* removed comments

* removed named imports, fixed comments

* fixed google groups tool names

---------

Co-authored-by: aadamgough <adam@sim.ai>
Co-authored-by: waleed <walif6@gmail.com>
This commit is contained in:
Adam Gough
2025-12-06 17:32:30 -08:00
committed by GitHub
parent 7bfc6ebe48
commit ae7937280e
37 changed files with 1725 additions and 108 deletions

View File

@@ -4089,3 +4089,35 @@ export function PolymarketIcon(props: SVGProps<SVGSVGElement>) {
</svg>
)
}
export function GoogleGroupsIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg {...props} xmlns='http://www.w3.org/2000/svg' viewBox='0 0 950 950'>
<path
d='M0 0 C0.94278809 0.16097168 1.88557617 0.32194336 2.85693359 0.48779297 C41.39640021 7.38000818 77.6089919 23.60492603 108.359375 47.75439453 C110.82847014 49.62899623 113.39874033 51.31473268 116 53 C116.46293457 52.57372314 116.92586914 52.14744629 117.40283203 51.70825195 C122.59800275 47.03131713 128.0429109 43.0311917 133.875 39.1875 C134.79337646 38.58075439 135.71175293 37.97400879 136.65795898 37.34887695 C193.06543269 0.50131391 260.71306352 -11.46626137 326.5625 2.1875 C345.0682729 6.30166442 362.9846016 12.66357256 380 21 C380.84159668 21.41121094 381.68319336 21.82242187 382.55029297 22.24609375 C394.71831585 28.25763667 406.12081333 34.88025718 417 43 C417.91386475 43.680625 417.91386475 43.680625 418.84619141 44.375 C427.3442083 50.7615534 435.33491318 57.63400459 443 65 C443.89187012 65.85102295 443.89187012 65.85102295 444.80175781 66.71923828 C453.69930679 75.25198316 461.69744094 84.07076231 469 94 C469.42619629 94.57073242 469.85239258 95.14146484 470.29150391 95.72949219 C480.43354301 109.33663206 488.67420729 123.71010258 496 139 C496.44988281 139.91910156 496.89976562 140.83820313 497.36328125 141.78515625 C507.8727502 163.93377648 513.86707037 187.75512603 517 212 C517.17128418 213.27705811 517.34256836 214.55411621 517.51904297 215.86987305 C518.22536878 222.32344617 518.20134476 228.78767265 518.23828125 235.2734375 C518.24439454 236.28303968 518.24439454 236.28303968 518.25063133 237.31303787 C518.27135228 240.8724256 518.28571641 244.43177631 518.29516602 247.99121094 C518.30623374 251.63452388 518.34067753 255.27722681 518.38033772 258.92032433 C518.40666551 261.75333675 518.41487174 264.58620664 518.41844749 267.4193306 C518.42558411 269.40605687 518.45193759 271.39268495 518.47883606 273.37924194 C518.44942207 285.76015309 515.12264488 295.57193005 507 305 C499.87428202 312.02979486 489.28626689 317.89258596 479.05601447 318.02519969 C476.62337781 317.96406397 474.19532718 317.86193279 471.76460171 317.74760151 C470.82658438 317.70850022 469.88856705 317.66939893 468.92212495 317.62911275 C466.85886798 317.54255897 464.79572187 317.45333201 462.73267936 317.36180875 C458.15557952 317.15958497 453.5778828 316.97272504 449.00018999 316.78448407 C445.21423965 316.62851756 441.42837797 316.470502 437.64251518 316.31242561 C398.91465695 314.70443054 360.18475613 313.32679155 321.43299866 312.45133972 C320.24242123 312.42435066 320.24242123 312.42435066 319.02779173 312.39681636 C302.59808087 312.02523843 286.16791507 311.67886855 269.73699983 311.36500082 C260.42194939 311.18705349 251.10704348 311.00250961 241.79223633 310.81225586 C240.94943279 310.79516155 240.10662926 310.77806724 239.23828622 310.76045491 C214.73870723 310.26060136 190.27214589 309.42986365 165.79391344 308.29660819 C125.90250763 306.44979005 86.03732773 305.17982958 46.09943641 305.14658036 C44.50897189 305.14521365 42.91850784 305.14311607 41.32804524 305.14028964 C-37.5133746 305.00531502 -103.97082682 308.91076335 -163.52726094 367.12336398 C-188.38087655 391.97851495 -210.60272126 420.04013588 -229.42095524 449.719724 C-234.44627637 457.53470195 -238.00370356 461.2158497 -247.01953125 463.8984375 C-257.45600695 465.67920678 -265.74521563 464.625344 -274.70703125 458.76953125 C-282.12356812 453.04603687 -286.55153627 446.30121318 -288 437 C-288.0944182 434.21858347 -288.13925894 431.46261367 -288.13371277 428.68151855 C-288.13597833 427.84676797 -288.13824388 427.01201739 -288.14057809 426.15197134 C-288.14690588 423.35585743 -288.14608946 420.55979215 -288.14526367 417.76367188 C-288.14825623 415.75762367 -288.15165898 413.75157604 -288.15544128 411.74552917 C-288.16428321 406.29210673 -288.16661969 400.83869999 -288.16725707 395.38527107 C-288.16796834 391.97072817 -288.17010429 388.55618925 -288.17275429 385.14164734 C-288.18201368 373.20657092 -288.1860891 361.27150567 -288.18530273 349.33642578 C-288.18470423 338.25260833 -288.19520972 327.16883991 -288.2110464 316.08503485 C-288.22418718 306.54413041 -288.22948379 297.00324184 -288.22884732 287.46232843 C-288.22859392 281.77588842 -288.23135606 276.08949183 -288.24202538 270.40306091 C-288.25181491 265.03831145 -288.25171239 259.67364588 -288.24450874 254.3088932 C-288.2434757 252.35683887 -288.24574798 250.40477901 -288.2518692 248.45273399 C-288.30129251 231.57587659 -287.43735147 214.67304784 -284.25 198.0625 C-284.07936035 197.16249268 -283.9087207 196.26248535 -283.73291016 195.33520508 C-277.33281977 162.80659035 -264.83654002 129.80613517 -245 103 C-244.30777344 102.03835938 -243.61554688 101.07671875 -242.90234375 100.0859375 C-231.62223929 84.68769966 -218.86054597 69.06796015 -204 57 C-202.82757852 56.01627594 -201.65576659 55.0318252 -200.484375 54.046875 C-165.05335732 24.48458427 -123.47627349 6.4544733 -78 -1 C-77.21238281 -1.13132324 -76.42476562 -1.26264648 -75.61328125 -1.39794922 C-51.08216194 -5.26757047 -24.38186362 -4.16780456 0 0 Z '
fill='#4185F3'
transform='translate(394,440)'
/>
<path
d='M0 0 C0.84159668 0.41121094 1.68319336 0.82242187 2.55029297 1.24609375 C14.71831585 7.25763667 26.12081333 13.88025718 37 22 C37.91386475 22.680625 37.91386475 22.680625 38.84619141 23.375 C47.3442083 29.7615534 55.33491318 36.63400459 63 44 C63.59458008 44.56734863 64.18916016 45.13469727 64.80175781 45.71923828 C73.69930679 54.25198316 81.69744094 63.07076231 89 73 C89.63929443 73.85609863 89.63929443 73.85609863 90.29150391 74.72949219 C100.43354301 88.33663206 108.67420729 102.71010258 116 118 C116.67482422 119.37865234 116.67482422 119.37865234 117.36328125 120.78515625 C127.8727502 142.93377648 133.86707037 166.75512603 137 191 C137.17128418 192.27705811 137.34256836 193.55411621 137.51904297 194.86987305 C138.22536878 201.32344617 138.20134476 207.78767265 138.23828125 214.2734375 C138.24439454 215.28303968 138.24439454 215.28303968 138.25063133 216.31303787 C138.27135228 219.8724256 138.28571641 223.43177631 138.29516602 226.99121094 C138.30623374 230.63452388 138.34067753 234.27722681 138.38033772 237.92032433 C138.40666551 240.75333675 138.41487174 243.58620664 138.41844749 246.4193306 C138.42558411 248.40605687 138.45193759 250.39268495 138.47883606 252.37924194 C138.44942207 264.76015309 135.12264488 274.57193005 127 284 C118.57776719 292.3088566 107.25707403 297.12771911 95.43405437 297.12304783 C94.31986273 297.12503888 93.20567109 297.12702993 92.05771607 297.12908131 C90.83884967 297.12616847 89.61998327 297.12325563 88.36418152 297.12025452 C86.41604418 297.12153615 86.41604418 297.12153615 84.42855054 297.12284368 C80.82553724 297.1250799 77.22255366 297.12107927 73.61954415 297.11606562 C69.7334335 297.1117488 65.84732453 297.11320842 61.96121216 297.1139679 C55.22888479 297.11449235 48.49656711 297.11135375 41.76424217 297.10573006 C32.03042012 297.09760442 22.29660275 297.09499874 12.56277768 297.09374207 C-3.22955387 297.09155322 -19.02188025 297.08489767 -34.81420898 297.07543945 C-50.15535455 297.06626101 -65.49649872 297.05918229 -80.83764648 297.05493164 C-81.78321047 297.05466892 -82.72877445 297.05440619 -83.70299188 297.05413551 C-88.44658929 297.05283048 -93.1901867 297.05156677 -97.93378413 297.05032361 C-137.28919303 297.03995621 -176.64459618 297.02234244 -216 297 C-216 296.67 -216 296.34 -216 296 C-215.10539063 295.78085937 -214.21078125 295.56171875 -213.2890625 295.3359375 C-199.60744526 291.74779481 -190.30226454 286.44506049 -182.33886719 274.51049805 C-175.8694217 262.19130537 -177.24804735 248.40718553 -177.47143555 234.86889648 C-177.50929034 232.14367461 -177.51761785 229.41872657 -177.52514935 226.69327831 C-177.58592774 206.53538226 -178.58970103 187.22051454 -183.1875 167.5625 C-183.34061646 166.90023407 -183.49373291 166.23796814 -183.65148926 165.55563354 C-193.05991068 125.06154086 -212.75392634 88.11244854 -240.77734375 57.4453125 C-242.91048395 55.09848338 -244.98632073 52.70965414 -247.0625 50.3125 C-250.74767655 46.15843419 -254.73024771 42.54055591 -259 39 C-259.90878906 38.23623047 -259.90878906 38.23623047 -260.8359375 37.45703125 C-262.2186283 36.29829741 -263.60842508 35.14804931 -265 34 C-261.24101804 29.06359373 -257.22764272 25.6831341 -252.125 22.1875 C-251.37541016 21.66760498 -250.62582031 21.14770996 -249.85351562 20.61206055 C-242.75668826 15.74085214 -235.4948349 11.22981506 -228 7 C-227.34596191 6.6277832 -226.69192383 6.25556641 -226.01806641 5.87207031 C-214.74568717 -0.48948891 -203.12149343 -5.48811078 -191 -10 C-189.783125 -10.46148437 -188.56625 -10.92296875 -187.3125 -11.3984375 C-127.13030363 -32.87253938 -57.14586678 -27.9977207 0 0 Z '
fill='#4185F3'
transform='translate(774,461)'
/>
<path
d='M0 0 C2.5086616 2.21585252 4.93546061 4.49626878 7.3515625 6.8125 C8.23457031 7.62074219 9.11757813 8.42898437 10.02734375 9.26171875 C26.83279315 25.16390495 37.10842709 45.7665863 43.3515625 67.8125 C43.69316406 68.99070312 44.03476562 70.16890625 44.38671875 71.3828125 C50.59092755 97.64248697 47.11935597 127.30989764 36.3515625 151.8125 C35.92665527 152.79379883 35.92665527 152.79379883 35.49316406 153.79492188 C25.5268296 176.37059662 8.35413683 195.88783887 -12.6484375 208.8125 C-13.55078125 209.410625 -14.453125 210.00875 -15.3828125 210.625 C-42.35348642 227.69118915 -77.57347657 232.41053788 -108.6484375 226.1875 C-132.14362975 220.89155145 -153.29033371 209.45309871 -170.6484375 192.8125 C-171.53144531 192.00425781 -172.41445313 191.19601562 -173.32421875 190.36328125 C-190.12966815 174.46109505 -200.40530209 153.8584137 -206.6484375 131.8125 C-206.99003906 130.63429688 -207.33164062 129.45609375 -207.68359375 128.2421875 C-213.88780255 101.98251303 -210.41623097 72.31510236 -199.6484375 47.8125 C-199.36516602 47.15830078 -199.08189453 46.50410156 -198.79003906 45.83007812 C-188.8237046 23.25440338 -171.65101183 3.73716113 -150.6484375 -9.1875 C-149.29492188 -10.0846875 -149.29492188 -10.0846875 -147.9140625 -11 C-102.93060045 -39.46411158 -40.49856726 -33.45014405 0 0 Z '
fill='#4285F4'
transform='translate(753.6484375,172.1875)'
/>
<path
d='M0 0 C2.5086616 2.21585252 4.93546061 4.49626878 7.3515625 6.8125 C8.23457031 7.62074219 9.11757813 8.42898437 10.02734375 9.26171875 C26.83279315 25.16390495 37.10842709 45.7665863 43.3515625 67.8125 C43.69316406 68.99070312 44.03476562 70.16890625 44.38671875 71.3828125 C50.59092755 97.64248697 47.11935597 127.30989764 36.3515625 151.8125 C35.92665527 152.79379883 35.92665527 152.79379883 35.49316406 153.79492188 C25.5268296 176.37059662 8.35413683 195.88783887 -12.6484375 208.8125 C-13.55078125 209.410625 -14.453125 210.00875 -15.3828125 210.625 C-42.35348642 227.69118915 -77.57347657 232.41053788 -108.6484375 226.1875 C-132.14362975 220.89155145 -153.29033371 209.45309871 -170.6484375 192.8125 C-171.53144531 192.00425781 -172.41445313 191.19601562 -173.32421875 190.36328125 C-190.12966815 174.46109505 -200.40530209 153.8584137 -206.6484375 131.8125 C-206.99003906 130.63429688 -207.33164063 129.45609375 -207.68359375 128.2421875 C-213.88780255 101.98251303 -210.41623097 72.31510236 -199.6484375 47.8125 C-199.36516602 47.15830078 -199.08189453 46.50410156 -198.79003906 45.83007812 C-188.8237046 23.25440338 -171.65101183 3.73716113 -150.6484375 -9.1875 C-149.29492188 -10.0846875 -149.29492188 -10.0846875 -147.9140625 -11 C-102.93060045 -39.46411158 -40.49856726 -33.45014405 0 0 Z '
fill='#4285F4'
transform='translate(433.6484375,172.1875)'
/>
<path
d='M0 0 C3.81562395 1.29823475 6.07090879 2.74966858 8.8125 5.6875 C11.4212352 8.40859646 14.04942755 10.95293127 16.9375 13.375 C51.99603414 43.73637132 74.26678331 91.46037764 84.375 135.8125 C84.61371826 136.84769775 84.85243652 137.88289551 85.09838867 138.94946289 C89.0693436 157.37670439 89.42863544 175.94083356 89.48046875 194.72631836 C89.48930372 197.45992471 89.51740015 200.19229146 89.5625 202.92553711 C90.0727242 234.5058769 90.0727242 234.5058769 78.75 248.5 C67.10259629 260.32182406 52.90572797 263.38672329 36.8588047 263.52641392 C33.85098681 263.53023974 30.8436979 263.51414279 27.8359375 263.49609375 C25.70992992 263.49624909 23.58392206 263.49774385 21.45791626 263.50050354 C17.02520058 263.50188017 12.59281136 263.48945128 8.16015625 263.46655273 C2.50723581 263.43813586 -3.14514462 263.44092501 -8.79810524 263.45364285 C-13.18043552 263.46062972 -17.56264313 263.45277705 -21.94495773 263.44038582 C-24.02834985 263.43590298 -26.11175527 263.43550647 -28.19514847 263.43945122 C-45.28053358 263.45666805 -61.10730832 262.67785762 -74.25 250.4375 C-84.29292795 239.84189519 -87.30277119 227.81294372 -87.3359375 213.64453125 C-87.34418045 212.55703079 -87.3524234 211.46953033 -87.36091614 210.34907532 C-87.38009551 206.83674954 -87.38011101 203.32487017 -87.375 199.8125 C-87.37545319 198.61937195 -87.37590637 197.4262439 -87.37637329 196.19696045 C-87.35610617 178.09521781 -86.46012832 160.79921916 -83 143 C-82.75469856 141.54891669 -82.51332288 140.0971597 -82.27734375 138.64453125 C-78.04339545 114.58454961 -68.4884574 91.45015164 -57 70 C-56.38769531 68.84628906 -55.77539062 67.69257812 -55.14453125 66.50390625 C-47.06102443 51.82025778 -37.08959704 38.53023956 -26 26 C-25.22914063 25.11828125 -24.45828125 24.2365625 -23.6640625 23.328125 C-16.29692403 15.00455101 -8.575012 7.08370557 0 0 Z '
fill='#1967D2'
transform='translate(508,495)'
/>
</svg>
)
}

View File

@@ -32,6 +32,7 @@ import {
GoogleDocsIcon,
GoogleDriveIcon,
GoogleFormsIcon,
GoogleGroupsIcon,
GoogleIcon,
GoogleSheetsIcon,
GoogleSlidesIcon,
@@ -195,6 +196,7 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
google_vault: GoogleVaultIcon,
google_slides: GoogleSlidesIcon,
google_sheets: GoogleSheetsIcon,
google_groups: GoogleGroupsIcon,
google_forms: GoogleFormsIcon,
google_drive: GoogleDriveIcon,
google_docs: GoogleDocsIcon,

View File

@@ -0,0 +1,221 @@
---
title: Google Groups
description: Manage Google Workspace Groups and their members
---
import { BlockInfoCard } from "@/components/ui/block-info-card"
<BlockInfoCard
type="google_groups"
color="#E8F0FE"
/>
## Usage Instructions
Connect to Google Workspace to create, update, and manage groups and their members using the Admin SDK Directory API.
## Tools
### `google_groups_list_groups`
List all groups in a Google Workspace domain
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `customer` | string | No | Customer ID or "my_customer" for the authenticated user\'s domain |
| `domain` | string | No | Domain name to filter groups by |
| `maxResults` | number | No | Maximum number of results to return \(1-200\) |
| `pageToken` | string | No | Token for pagination |
| `query` | string | No | Search query to filter groups \(e.g., "email:admin*"\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `output` | json | Google Groups API response data |
### `google_groups_get_group`
Get details of a specific Google Group by email or group ID
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `groupKey` | string | Yes | Group email address or unique group ID |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `output` | json | Google Groups API response data |
### `google_groups_create_group`
Create a new Google Group in the domain
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `email` | string | Yes | Email address for the new group \(e.g., team@yourdomain.com\) |
| `name` | string | Yes | Display name for the group |
| `description` | string | No | Description of the group |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `output` | json | Google Groups API response data |
### `google_groups_update_group`
Update an existing Google Group
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `groupKey` | string | Yes | Group email address or unique group ID |
| `name` | string | No | New display name for the group |
| `description` | string | No | New description for the group |
| `email` | string | No | New email address for the group |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `output` | json | Google Groups API response data |
### `google_groups_delete_group`
Delete a Google Group
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `groupKey` | string | Yes | Group email address or unique group ID to delete |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `output` | json | Google Groups API response data |
### `google_groups_list_members`
List all members of a Google Group
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `groupKey` | string | Yes | Group email address or unique group ID |
| `maxResults` | number | No | Maximum number of results to return \(1-200\) |
| `pageToken` | string | No | Token for pagination |
| `roles` | string | No | Filter by roles \(comma-separated: OWNER, MANAGER, MEMBER\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `output` | json | Google Groups API response data |
### `google_groups_get_member`
Get details of a specific member in a Google Group
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `groupKey` | string | Yes | Group email address or unique group ID |
| `memberKey` | string | Yes | Member email address or unique member ID |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `output` | json | Google Groups API response data |
### `google_groups_add_member`
Add a new member to a Google Group
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `groupKey` | string | Yes | Group email address or unique group ID |
| `email` | string | Yes | Email address of the member to add |
| `role` | string | No | Role for the member \(MEMBER, MANAGER, or OWNER\). Defaults to MEMBER. |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `output` | json | Google Groups API response data |
### `google_groups_remove_member`
Remove a member from a Google Group
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `groupKey` | string | Yes | Group email address or unique group ID |
| `memberKey` | string | Yes | Email address or unique ID of the member to remove |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `output` | json | Google Groups API response data |
### `google_groups_update_member`
Update a member
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `groupKey` | string | Yes | Group email address or unique group ID |
| `memberKey` | string | Yes | Member email address or unique member ID |
| `role` | string | Yes | New role for the member \(MEMBER, MANAGER, or OWNER\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `output` | json | Google Groups API response data |
### `google_groups_has_member`
Check if a user is a member of a Google Group
#### Input
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `groupKey` | string | Yes | Group email address or unique group ID |
| `memberKey` | string | Yes | Member email address or unique member ID to check |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `output` | json | Google Groups API response data |
## Notes
- Category: `tools`
- Type: `google_groups`

View File

@@ -27,6 +27,7 @@
"google_docs",
"google_drive",
"google_forms",
"google_groups",
"google_search",
"google_sheets",
"google_slides",

View File

@@ -36,6 +36,12 @@ const SCOPE_DESCRIPTIONS: Record<string, string> = {
'https://www.googleapis.com/auth/forms.responses.readonly': 'View responses to your Google Forms',
'https://www.googleapis.com/auth/ediscovery': 'Access Google Vault for eDiscovery',
'https://www.googleapis.com/auth/devstorage.read_only': 'Read files from Google Cloud Storage',
'https://www.googleapis.com/auth/admin.directory.group': 'Manage Google Workspace groups',
'https://www.googleapis.com/auth/admin.directory.group.member':
'Manage Google Workspace group memberships',
'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',
'read:confluence-content.all': 'Read all Confluence content',
'read:confluence-space.summary': 'Read Confluence space information',
'read:space:confluence': 'View Confluence spaces',

View File

@@ -0,0 +1,317 @@
import { GoogleGroupsIcon } from '@/components/icons'
import type { BlockConfig } from '@/blocks/types'
import { AuthMode } from '@/blocks/types'
export const GoogleGroupsBlock: BlockConfig = {
type: 'google_groups',
name: 'Google Groups',
description: 'Manage Google Workspace Groups and their members',
authMode: AuthMode.OAuth,
longDescription:
'Connect to Google Workspace to create, update, and manage groups and their members using the Admin SDK Directory API.',
docsLink: 'https://developers.google.com/admin-sdk/directory/v1/guides/manage-groups',
category: 'tools',
bgColor: '#E8F0FE',
icon: GoogleGroupsIcon,
subBlocks: [
{
id: 'operation',
title: 'Operation',
type: 'dropdown',
options: [
{ label: 'List Groups', id: 'list_groups' },
{ label: 'Get Group', id: 'get_group' },
{ label: 'Create Group', id: 'create_group' },
{ label: 'Update Group', id: 'update_group' },
{ label: 'Delete Group', id: 'delete_group' },
{ label: 'List Members', id: 'list_members' },
{ label: 'Get Member', id: 'get_member' },
{ label: 'Add Member', id: 'add_member' },
{ label: 'Update Member Role', id: 'update_member' },
{ label: 'Remove Member', id: 'remove_member' },
{ label: 'Check Membership', id: 'has_member' },
],
value: () => 'list_groups',
},
{
id: 'credential',
title: 'Google Groups Account',
type: 'oauth-input',
required: true,
serviceId: 'google-groups',
requiredScopes: [
'https://www.googleapis.com/auth/admin.directory.group',
'https://www.googleapis.com/auth/admin.directory.group.member',
],
placeholder: 'Select Google Workspace account',
},
{
id: 'customer',
title: 'Customer ID',
type: 'short-input',
placeholder: 'my_customer (default)',
condition: { field: 'operation', value: 'list_groups' },
},
{
id: 'domain',
title: 'Domain',
type: 'short-input',
placeholder: 'Filter by domain (e.g., example.com)',
condition: { field: 'operation', value: 'list_groups' },
},
{
id: 'query',
title: 'Search Query',
type: 'short-input',
placeholder: 'Filter query (e.g., email:admin*)',
condition: { field: 'operation', value: 'list_groups' },
},
{
id: 'maxResults',
title: 'Max Results',
type: 'short-input',
placeholder: 'Maximum results (1-200)',
condition: {
field: 'operation',
value: ['list_groups', 'list_members'],
},
},
{
id: 'groupKey',
title: 'Group Email or ID',
type: 'short-input',
placeholder: 'group@example.com or group ID',
required: true,
condition: {
field: 'operation',
value: [
'get_group',
'update_group',
'delete_group',
'list_members',
'get_member',
'add_member',
'update_member',
'remove_member',
'has_member',
],
},
},
{
id: 'email',
title: 'Group Email',
type: 'short-input',
placeholder: 'newgroup@example.com',
required: true,
condition: { field: 'operation', value: 'create_group' },
},
{
id: 'name',
title: 'Group Name',
type: 'short-input',
placeholder: 'Display name for the group',
required: true,
condition: { field: 'operation', value: 'create_group' },
},
{
id: 'description',
title: 'Description',
type: 'long-input',
placeholder: 'Optional description for the group',
condition: { field: 'operation', value: ['create_group', 'update_group'] },
},
{
id: 'newName',
title: 'New Name',
type: 'short-input',
placeholder: 'New display name',
condition: { field: 'operation', value: 'update_group' },
},
{
id: 'newEmail',
title: 'New Email',
type: 'short-input',
placeholder: 'New email address',
condition: { field: 'operation', value: 'update_group' },
},
{
id: 'memberKey',
title: 'Member Email or ID',
type: 'short-input',
placeholder: 'user@example.com or member ID',
required: true,
condition: {
field: 'operation',
value: ['get_member', 'update_member', 'remove_member', 'has_member'],
},
},
{
id: 'memberEmail',
title: 'Member Email',
type: 'short-input',
placeholder: 'user@example.com',
required: true,
condition: { field: 'operation', value: 'add_member' },
},
{
id: 'role',
title: 'Member Role',
type: 'dropdown',
options: [
{ id: 'MEMBER', label: 'Member' },
{ id: 'MANAGER', label: 'Manager' },
{ id: 'OWNER', label: 'Owner' },
],
condition: { field: 'operation', value: ['add_member', 'update_member'] },
},
{
id: 'roles',
title: 'Filter by Roles',
type: 'short-input',
placeholder: 'OWNER,MANAGER,MEMBER',
condition: { field: 'operation', value: 'list_members' },
},
],
tools: {
access: [
'google_groups_list_groups',
'google_groups_get_group',
'google_groups_create_group',
'google_groups_update_group',
'google_groups_delete_group',
'google_groups_list_members',
'google_groups_get_member',
'google_groups_add_member',
'google_groups_remove_member',
'google_groups_update_member',
'google_groups_has_member',
],
config: {
tool: (params) => {
switch (params.operation) {
case 'list_groups':
return 'google_groups_list_groups'
case 'get_group':
return 'google_groups_get_group'
case 'create_group':
return 'google_groups_create_group'
case 'update_group':
return 'google_groups_update_group'
case 'delete_group':
return 'google_groups_delete_group'
case 'list_members':
return 'google_groups_list_members'
case 'get_member':
return 'google_groups_get_member'
case 'add_member':
return 'google_groups_add_member'
case 'update_member':
return 'google_groups_update_member'
case 'remove_member':
return 'google_groups_remove_member'
case 'has_member':
return 'google_groups_has_member'
default:
throw new Error(`Invalid Google Groups operation: ${params.operation}`)
}
},
params: (params) => {
const { credential, operation, ...rest } = params
switch (operation) {
case 'list_groups':
return {
credential,
customer: rest.customer,
domain: rest.domain,
query: rest.query,
maxResults: rest.maxResults ? Number(rest.maxResults) : undefined,
}
case 'get_group':
case 'delete_group':
return {
credential,
groupKey: rest.groupKey,
}
case 'create_group':
return {
credential,
email: rest.email,
name: rest.name,
description: rest.description,
}
case 'update_group':
return {
credential,
groupKey: rest.groupKey,
name: rest.newName,
email: rest.newEmail,
description: rest.description,
}
case 'list_members':
return {
credential,
groupKey: rest.groupKey,
maxResults: rest.maxResults ? Number(rest.maxResults) : undefined,
roles: rest.roles,
}
case 'get_member':
case 'remove_member':
return {
credential,
groupKey: rest.groupKey,
memberKey: rest.memberKey,
}
case 'add_member':
return {
credential,
groupKey: rest.groupKey,
email: rest.memberEmail,
role: rest.role,
}
case 'update_member':
return {
credential,
groupKey: rest.groupKey,
memberKey: rest.memberKey,
role: rest.role,
}
case 'has_member':
return {
credential,
groupKey: rest.groupKey,
memberKey: rest.memberKey,
}
default:
return { credential, ...rest }
}
},
},
},
inputs: {
operation: { type: 'string', description: 'Operation to perform' },
credential: { type: 'string', description: 'Google Workspace OAuth credential' },
customer: { type: 'string', description: 'Customer ID for listing groups' },
domain: { type: 'string', description: 'Domain filter for listing groups' },
query: { type: 'string', description: 'Search query for filtering groups' },
maxResults: { type: 'number', description: 'Maximum results to return' },
groupKey: { type: 'string', description: 'Group email address or ID' },
email: { type: 'string', description: 'Email address for new group' },
name: { type: 'string', description: 'Display name for group' },
description: { type: 'string', description: 'Group description' },
newName: { type: 'string', description: 'New display name for update' },
newEmail: { type: 'string', description: 'New email for update' },
memberKey: { type: 'string', description: 'Member email or ID' },
memberEmail: { type: 'string', description: 'Email of member to add' },
role: { type: 'string', description: 'Member role (MEMBER, MANAGER, OWNER)' },
roles: { type: 'string', description: 'Filter by roles for list members' },
},
outputs: {
output: { type: 'json', description: 'Google Groups API response data' },
},
}

View File

@@ -34,6 +34,7 @@ import { GoogleCalendarBlock } from '@/blocks/blocks/google_calendar'
import { GoogleDocsBlock } from '@/blocks/blocks/google_docs'
import { GoogleDriveBlock } from '@/blocks/blocks/google_drive'
import { GoogleFormsBlock } from '@/blocks/blocks/google_form'
import { GoogleGroupsBlock } from '@/blocks/blocks/google_groups'
import { GoogleSheetsBlock } from '@/blocks/blocks/google_sheets'
import { GoogleSlidesBlock } from '@/blocks/blocks/google_slides'
import { GoogleVaultBlock } from '@/blocks/blocks/google_vault'
@@ -175,6 +176,7 @@ export const registry: Record<string, BlockConfig> = {
google_sheets: GoogleSheetsBlock,
google_slides: GoogleSlidesBlock,
google_vault: GoogleVaultBlock,
google_groups: GoogleGroupsBlock,
hubspot: HubSpotBlock,
huggingface: HuggingFaceBlock,
human_in_the_loop: HumanInTheLoopBlock,

View File

@@ -4089,3 +4089,35 @@ export function PolymarketIcon(props: SVGProps<SVGSVGElement>) {
</svg>
)
}
export function GoogleGroupsIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg {...props} xmlns='http://www.w3.org/2000/svg' viewBox='0 0 950 950'>
<path
d='M0 0 C0.94278809 0.16097168 1.88557617 0.32194336 2.85693359 0.48779297 C41.39640021 7.38000818 77.6089919 23.60492603 108.359375 47.75439453 C110.82847014 49.62899623 113.39874033 51.31473268 116 53 C116.46293457 52.57372314 116.92586914 52.14744629 117.40283203 51.70825195 C122.59800275 47.03131713 128.0429109 43.0311917 133.875 39.1875 C134.79337646 38.58075439 135.71175293 37.97400879 136.65795898 37.34887695 C193.06543269 0.50131391 260.71306352 -11.46626137 326.5625 2.1875 C345.0682729 6.30166442 362.9846016 12.66357256 380 21 C380.84159668 21.41121094 381.68319336 21.82242187 382.55029297 22.24609375 C394.71831585 28.25763667 406.12081333 34.88025718 417 43 C417.91386475 43.680625 417.91386475 43.680625 418.84619141 44.375 C427.3442083 50.7615534 435.33491318 57.63400459 443 65 C443.89187012 65.85102295 443.89187012 65.85102295 444.80175781 66.71923828 C453.69930679 75.25198316 461.69744094 84.07076231 469 94 C469.42619629 94.57073242 469.85239258 95.14146484 470.29150391 95.72949219 C480.43354301 109.33663206 488.67420729 123.71010258 496 139 C496.44988281 139.91910156 496.89976562 140.83820313 497.36328125 141.78515625 C507.8727502 163.93377648 513.86707037 187.75512603 517 212 C517.17128418 213.27705811 517.34256836 214.55411621 517.51904297 215.86987305 C518.22536878 222.32344617 518.20134476 228.78767265 518.23828125 235.2734375 C518.24439454 236.28303968 518.24439454 236.28303968 518.25063133 237.31303787 C518.27135228 240.8724256 518.28571641 244.43177631 518.29516602 247.99121094 C518.30623374 251.63452388 518.34067753 255.27722681 518.38033772 258.92032433 C518.40666551 261.75333675 518.41487174 264.58620664 518.41844749 267.4193306 C518.42558411 269.40605687 518.45193759 271.39268495 518.47883606 273.37924194 C518.44942207 285.76015309 515.12264488 295.57193005 507 305 C499.87428202 312.02979486 489.28626689 317.89258596 479.05601447 318.02519969 C476.62337781 317.96406397 474.19532718 317.86193279 471.76460171 317.74760151 C470.82658438 317.70850022 469.88856705 317.66939893 468.92212495 317.62911275 C466.85886798 317.54255897 464.79572187 317.45333201 462.73267936 317.36180875 C458.15557952 317.15958497 453.5778828 316.97272504 449.00018999 316.78448407 C445.21423965 316.62851756 441.42837797 316.470502 437.64251518 316.31242561 C398.91465695 314.70443054 360.18475613 313.32679155 321.43299866 312.45133972 C320.24242123 312.42435066 320.24242123 312.42435066 319.02779173 312.39681636 C302.59808087 312.02523843 286.16791507 311.67886855 269.73699983 311.36500082 C260.42194939 311.18705349 251.10704348 311.00250961 241.79223633 310.81225586 C240.94943279 310.79516155 240.10662926 310.77806724 239.23828622 310.76045491 C214.73870723 310.26060136 190.27214589 309.42986365 165.79391344 308.29660819 C125.90250763 306.44979005 86.03732773 305.17982958 46.09943641 305.14658036 C44.50897189 305.14521365 42.91850784 305.14311607 41.32804524 305.14028964 C-37.5133746 305.00531502 -103.97082682 308.91076335 -163.52726094 367.12336398 C-188.38087655 391.97851495 -210.60272126 420.04013588 -229.42095524 449.719724 C-234.44627637 457.53470195 -238.00370356 461.2158497 -247.01953125 463.8984375 C-257.45600695 465.67920678 -265.74521563 464.625344 -274.70703125 458.76953125 C-282.12356812 453.04603687 -286.55153627 446.30121318 -288 437 C-288.0944182 434.21858347 -288.13925894 431.46261367 -288.13371277 428.68151855 C-288.13597833 427.84676797 -288.13824388 427.01201739 -288.14057809 426.15197134 C-288.14690588 423.35585743 -288.14608946 420.55979215 -288.14526367 417.76367188 C-288.14825623 415.75762367 -288.15165898 413.75157604 -288.15544128 411.74552917 C-288.16428321 406.29210673 -288.16661969 400.83869999 -288.16725707 395.38527107 C-288.16796834 391.97072817 -288.17010429 388.55618925 -288.17275429 385.14164734 C-288.18201368 373.20657092 -288.1860891 361.27150567 -288.18530273 349.33642578 C-288.18470423 338.25260833 -288.19520972 327.16883991 -288.2110464 316.08503485 C-288.22418718 306.54413041 -288.22948379 297.00324184 -288.22884732 287.46232843 C-288.22859392 281.77588842 -288.23135606 276.08949183 -288.24202538 270.40306091 C-288.25181491 265.03831145 -288.25171239 259.67364588 -288.24450874 254.3088932 C-288.2434757 252.35683887 -288.24574798 250.40477901 -288.2518692 248.45273399 C-288.30129251 231.57587659 -287.43735147 214.67304784 -284.25 198.0625 C-284.07936035 197.16249268 -283.9087207 196.26248535 -283.73291016 195.33520508 C-277.33281977 162.80659035 -264.83654002 129.80613517 -245 103 C-244.30777344 102.03835938 -243.61554688 101.07671875 -242.90234375 100.0859375 C-231.62223929 84.68769966 -218.86054597 69.06796015 -204 57 C-202.82757852 56.01627594 -201.65576659 55.0318252 -200.484375 54.046875 C-165.05335732 24.48458427 -123.47627349 6.4544733 -78 -1 C-77.21238281 -1.13132324 -76.42476562 -1.26264648 -75.61328125 -1.39794922 C-51.08216194 -5.26757047 -24.38186362 -4.16780456 0 0 Z '
fill='#4185F3'
transform='translate(394,440)'
/>
<path
d='M0 0 C0.84159668 0.41121094 1.68319336 0.82242187 2.55029297 1.24609375 C14.71831585 7.25763667 26.12081333 13.88025718 37 22 C37.91386475 22.680625 37.91386475 22.680625 38.84619141 23.375 C47.3442083 29.7615534 55.33491318 36.63400459 63 44 C63.59458008 44.56734863 64.18916016 45.13469727 64.80175781 45.71923828 C73.69930679 54.25198316 81.69744094 63.07076231 89 73 C89.63929443 73.85609863 89.63929443 73.85609863 90.29150391 74.72949219 C100.43354301 88.33663206 108.67420729 102.71010258 116 118 C116.67482422 119.37865234 116.67482422 119.37865234 117.36328125 120.78515625 C127.8727502 142.93377648 133.86707037 166.75512603 137 191 C137.17128418 192.27705811 137.34256836 193.55411621 137.51904297 194.86987305 C138.22536878 201.32344617 138.20134476 207.78767265 138.23828125 214.2734375 C138.24439454 215.28303968 138.24439454 215.28303968 138.25063133 216.31303787 C138.27135228 219.8724256 138.28571641 223.43177631 138.29516602 226.99121094 C138.30623374 230.63452388 138.34067753 234.27722681 138.38033772 237.92032433 C138.40666551 240.75333675 138.41487174 243.58620664 138.41844749 246.4193306 C138.42558411 248.40605687 138.45193759 250.39268495 138.47883606 252.37924194 C138.44942207 264.76015309 135.12264488 274.57193005 127 284 C118.57776719 292.3088566 107.25707403 297.12771911 95.43405437 297.12304783 C94.31986273 297.12503888 93.20567109 297.12702993 92.05771607 297.12908131 C90.83884967 297.12616847 89.61998327 297.12325563 88.36418152 297.12025452 C86.41604418 297.12153615 86.41604418 297.12153615 84.42855054 297.12284368 C80.82553724 297.1250799 77.22255366 297.12107927 73.61954415 297.11606562 C69.7334335 297.1117488 65.84732453 297.11320842 61.96121216 297.1139679 C55.22888479 297.11449235 48.49656711 297.11135375 41.76424217 297.10573006 C32.03042012 297.09760442 22.29660275 297.09499874 12.56277768 297.09374207 C-3.22955387 297.09155322 -19.02188025 297.08489767 -34.81420898 297.07543945 C-50.15535455 297.06626101 -65.49649872 297.05918229 -80.83764648 297.05493164 C-81.78321047 297.05466892 -82.72877445 297.05440619 -83.70299188 297.05413551 C-88.44658929 297.05283048 -93.1901867 297.05156677 -97.93378413 297.05032361 C-137.28919303 297.03995621 -176.64459618 297.02234244 -216 297 C-216 296.67 -216 296.34 -216 296 C-215.10539063 295.78085937 -214.21078125 295.56171875 -213.2890625 295.3359375 C-199.60744526 291.74779481 -190.30226454 286.44506049 -182.33886719 274.51049805 C-175.8694217 262.19130537 -177.24804735 248.40718553 -177.47143555 234.86889648 C-177.50929034 232.14367461 -177.51761785 229.41872657 -177.52514935 226.69327831 C-177.58592774 206.53538226 -178.58970103 187.22051454 -183.1875 167.5625 C-183.34061646 166.90023407 -183.49373291 166.23796814 -183.65148926 165.55563354 C-193.05991068 125.06154086 -212.75392634 88.11244854 -240.77734375 57.4453125 C-242.91048395 55.09848338 -244.98632073 52.70965414 -247.0625 50.3125 C-250.74767655 46.15843419 -254.73024771 42.54055591 -259 39 C-259.90878906 38.23623047 -259.90878906 38.23623047 -260.8359375 37.45703125 C-262.2186283 36.29829741 -263.60842508 35.14804931 -265 34 C-261.24101804 29.06359373 -257.22764272 25.6831341 -252.125 22.1875 C-251.37541016 21.66760498 -250.62582031 21.14770996 -249.85351562 20.61206055 C-242.75668826 15.74085214 -235.4948349 11.22981506 -228 7 C-227.34596191 6.6277832 -226.69192383 6.25556641 -226.01806641 5.87207031 C-214.74568717 -0.48948891 -203.12149343 -5.48811078 -191 -10 C-189.783125 -10.46148437 -188.56625 -10.92296875 -187.3125 -11.3984375 C-127.13030363 -32.87253938 -57.14586678 -27.9977207 0 0 Z '
fill='#4185F3'
transform='translate(774,461)'
/>
<path
d='M0 0 C2.5086616 2.21585252 4.93546061 4.49626878 7.3515625 6.8125 C8.23457031 7.62074219 9.11757813 8.42898437 10.02734375 9.26171875 C26.83279315 25.16390495 37.10842709 45.7665863 43.3515625 67.8125 C43.69316406 68.99070312 44.03476562 70.16890625 44.38671875 71.3828125 C50.59092755 97.64248697 47.11935597 127.30989764 36.3515625 151.8125 C35.92665527 152.79379883 35.92665527 152.79379883 35.49316406 153.79492188 C25.5268296 176.37059662 8.35413683 195.88783887 -12.6484375 208.8125 C-13.55078125 209.410625 -14.453125 210.00875 -15.3828125 210.625 C-42.35348642 227.69118915 -77.57347657 232.41053788 -108.6484375 226.1875 C-132.14362975 220.89155145 -153.29033371 209.45309871 -170.6484375 192.8125 C-171.53144531 192.00425781 -172.41445313 191.19601562 -173.32421875 190.36328125 C-190.12966815 174.46109505 -200.40530209 153.8584137 -206.6484375 131.8125 C-206.99003906 130.63429688 -207.33164062 129.45609375 -207.68359375 128.2421875 C-213.88780255 101.98251303 -210.41623097 72.31510236 -199.6484375 47.8125 C-199.36516602 47.15830078 -199.08189453 46.50410156 -198.79003906 45.83007812 C-188.8237046 23.25440338 -171.65101183 3.73716113 -150.6484375 -9.1875 C-149.29492188 -10.0846875 -149.29492188 -10.0846875 -147.9140625 -11 C-102.93060045 -39.46411158 -40.49856726 -33.45014405 0 0 Z '
fill='#4285F4'
transform='translate(753.6484375,172.1875)'
/>
<path
d='M0 0 C2.5086616 2.21585252 4.93546061 4.49626878 7.3515625 6.8125 C8.23457031 7.62074219 9.11757813 8.42898437 10.02734375 9.26171875 C26.83279315 25.16390495 37.10842709 45.7665863 43.3515625 67.8125 C43.69316406 68.99070312 44.03476562 70.16890625 44.38671875 71.3828125 C50.59092755 97.64248697 47.11935597 127.30989764 36.3515625 151.8125 C35.92665527 152.79379883 35.92665527 152.79379883 35.49316406 153.79492188 C25.5268296 176.37059662 8.35413683 195.88783887 -12.6484375 208.8125 C-13.55078125 209.410625 -14.453125 210.00875 -15.3828125 210.625 C-42.35348642 227.69118915 -77.57347657 232.41053788 -108.6484375 226.1875 C-132.14362975 220.89155145 -153.29033371 209.45309871 -170.6484375 192.8125 C-171.53144531 192.00425781 -172.41445313 191.19601562 -173.32421875 190.36328125 C-190.12966815 174.46109505 -200.40530209 153.8584137 -206.6484375 131.8125 C-206.99003906 130.63429688 -207.33164063 129.45609375 -207.68359375 128.2421875 C-213.88780255 101.98251303 -210.41623097 72.31510236 -199.6484375 47.8125 C-199.36516602 47.15830078 -199.08189453 46.50410156 -198.79003906 45.83007812 C-188.8237046 23.25440338 -171.65101183 3.73716113 -150.6484375 -9.1875 C-149.29492188 -10.0846875 -149.29492188 -10.0846875 -147.9140625 -11 C-102.93060045 -39.46411158 -40.49856726 -33.45014405 0 0 Z '
fill='#4285F4'
transform='translate(433.6484375,172.1875)'
/>
<path
d='M0 0 C3.81562395 1.29823475 6.07090879 2.74966858 8.8125 5.6875 C11.4212352 8.40859646 14.04942755 10.95293127 16.9375 13.375 C51.99603414 43.73637132 74.26678331 91.46037764 84.375 135.8125 C84.61371826 136.84769775 84.85243652 137.88289551 85.09838867 138.94946289 C89.0693436 157.37670439 89.42863544 175.94083356 89.48046875 194.72631836 C89.48930372 197.45992471 89.51740015 200.19229146 89.5625 202.92553711 C90.0727242 234.5058769 90.0727242 234.5058769 78.75 248.5 C67.10259629 260.32182406 52.90572797 263.38672329 36.8588047 263.52641392 C33.85098681 263.53023974 30.8436979 263.51414279 27.8359375 263.49609375 C25.70992992 263.49624909 23.58392206 263.49774385 21.45791626 263.50050354 C17.02520058 263.50188017 12.59281136 263.48945128 8.16015625 263.46655273 C2.50723581 263.43813586 -3.14514462 263.44092501 -8.79810524 263.45364285 C-13.18043552 263.46062972 -17.56264313 263.45277705 -21.94495773 263.44038582 C-24.02834985 263.43590298 -26.11175527 263.43550647 -28.19514847 263.43945122 C-45.28053358 263.45666805 -61.10730832 262.67785762 -74.25 250.4375 C-84.29292795 239.84189519 -87.30277119 227.81294372 -87.3359375 213.64453125 C-87.34418045 212.55703079 -87.3524234 211.46953033 -87.36091614 210.34907532 C-87.38009551 206.83674954 -87.38011101 203.32487017 -87.375 199.8125 C-87.37545319 198.61937195 -87.37590637 197.4262439 -87.37637329 196.19696045 C-87.35610617 178.09521781 -86.46012832 160.79921916 -83 143 C-82.75469856 141.54891669 -82.51332288 140.0971597 -82.27734375 138.64453125 C-78.04339545 114.58454961 -68.4884574 91.45015164 -57 70 C-56.38769531 68.84628906 -55.77539062 67.69257812 -55.14453125 66.50390625 C-47.06102443 51.82025778 -37.08959704 38.53023956 -26 26 C-25.22914063 25.11828125 -24.45828125 24.2365625 -23.6640625 23.328125 C-16.29692403 15.00455101 -8.575012 7.08370557 0 0 Z '
fill='#1967D2'
transform='translate(508,495)'
/>
</svg>
)
}

View File

@@ -498,6 +498,22 @@ export const auth = betterAuth({
redirectURI: `${getBaseUrl()}/api/auth/oauth2/callback/google-vault`,
},
{
providerId: 'google-groups',
clientId: env.GOOGLE_CLIENT_ID as string,
clientSecret: env.GOOGLE_CLIENT_SECRET as string,
discoveryUrl: 'https://accounts.google.com/.well-known/openid-configuration',
accessType: 'offline',
scopes: [
'https://www.googleapis.com/auth/userinfo.email',
'https://www.googleapis.com/auth/userinfo.profile',
'https://www.googleapis.com/auth/admin.directory.group',
'https://www.googleapis.com/auth/admin.directory.group.member',
],
prompt: 'consent',
redirectURI: `${getBaseUrl()}/api/auth/oauth2/callback/google-groups`,
},
{
providerId: 'microsoft-teams',
clientId: env.MICROSOFT_CLIENT_ID as string,

View File

@@ -11,6 +11,7 @@ import {
GoogleDocsIcon,
GoogleDriveIcon,
GoogleFormsIcon,
GoogleGroupsIcon,
GoogleIcon,
GoogleSheetsIcon,
HubspotIcon,
@@ -80,6 +81,7 @@ export type OAuthService =
| 'google-calendar'
| 'google-vault'
| 'google-forms'
| 'google-groups'
| 'github'
| 'x'
// | 'supabase'
@@ -224,6 +226,19 @@ export const OAUTH_PROVIDERS: Record<string, OAuthProviderConfig> = {
],
scopeHints: ['ediscovery', 'devstorage'],
},
'google-groups': {
id: 'google-groups',
name: 'Google Groups',
description: 'Manage Google Workspace Groups and their members.',
providerId: 'google-groups',
icon: (props) => GoogleGroupsIcon(props),
baseProviderIcon: (props) => GoogleIcon(props),
scopes: [
'https://www.googleapis.com/auth/admin.directory.group',
'https://www.googleapis.com/auth/admin.directory.group.member',
],
scopeHints: ['admin.directory.group'],
},
},
defaultService: 'gmail',
},

View File

@@ -5,4 +5,9 @@ import { queryTool } from './query'
import { scanTool } from './scan'
import { updateTool } from './update'
export { deleteTool, getTool, putTool, queryTool, scanTool, updateTool }
export const dynamodbDeleteTool = deleteTool
export const dynamodbGetTool = getTool
export const dynamodbPutTool = putTool
export const dynamodbQueryTool = queryTool
export const dynamodbScanTool = scanTool
export const dynamodbUpdateTool = updateTool

View File

@@ -4,4 +4,8 @@ import { mapTool } from '@/tools/firecrawl/map'
import { scrapeTool } from '@/tools/firecrawl/scrape'
import { searchTool } from '@/tools/firecrawl/search'
export { scrapeTool, searchTool, crawlTool, mapTool, extractTool }
export const firecrawlScrapeTool = scrapeTool
export const firecrawlSearchTool = searchTool
export const firecrawlCrawlTool = crawlTool
export const firecrawlMapTool = mapTool
export const firecrawlExtractTool = extractTool

View File

@@ -1,3 +1,3 @@
import { searchTool } from '@/tools/google/search'
import { searchTool } from './search'
export { searchTool }
export const googleSearchTool = searchTool

View File

@@ -0,0 +1,72 @@
import type { ToolConfig } from '@/tools/types'
import type { GoogleGroupsAddMemberParams, GoogleGroupsResponse } from './types'
export const addMemberTool: ToolConfig<GoogleGroupsAddMemberParams, GoogleGroupsResponse> = {
id: 'google_groups_add_member',
name: 'Google Groups Add Member',
description: 'Add a new member to a Google Group',
version: '1.0.0',
oauth: {
required: true,
provider: 'google-groups',
},
params: {
accessToken: {
type: 'string',
required: true,
visibility: 'hidden',
description: 'OAuth access token',
},
groupKey: {
type: 'string',
required: true,
visibility: 'user-or-llm',
description: 'Group email address or unique group ID',
},
email: {
type: 'string',
required: true,
visibility: 'user-or-llm',
description: 'Email address of the member to add',
},
role: {
type: 'string',
required: false,
visibility: 'user-or-llm',
description: 'Role for the member (MEMBER, MANAGER, or OWNER). Defaults to MEMBER.',
},
},
request: {
url: (params) => {
const encodedGroupKey = encodeURIComponent(params.groupKey)
return `https://admin.googleapis.com/admin/directory/v1/groups/${encodedGroupKey}/members`
},
method: 'POST',
headers: (params) => ({
Authorization: `Bearer ${params.accessToken}`,
'Content-Type': 'application/json',
}),
body: (params) => {
const body: Record<string, string> = {
email: params.email,
role: params.role || 'MEMBER',
}
return JSON.stringify(body)
},
},
transformResponse: async (response) => {
const data = await response.json()
if (!response.ok) {
throw new Error(data.error?.message || 'Failed to add member to group')
}
return {
success: true,
output: data,
}
},
}

View File

@@ -0,0 +1,73 @@
import type { ToolConfig } from '@/tools/types'
import type { GoogleGroupsCreateParams, GoogleGroupsResponse } from './types'
export const createGroupTool: ToolConfig<GoogleGroupsCreateParams, GoogleGroupsResponse> = {
id: 'google_groups_create_group',
name: 'Google Groups Create Group',
description: 'Create a new Google Group in the domain',
version: '1.0.0',
oauth: {
required: true,
provider: 'google-groups',
},
params: {
accessToken: {
type: 'string',
required: true,
visibility: 'hidden',
description: 'OAuth access token',
},
email: {
type: 'string',
required: true,
visibility: 'user-or-llm',
description: 'Email address for the new group (e.g., team@yourdomain.com)',
},
name: {
type: 'string',
required: true,
visibility: 'user-or-llm',
description: 'Display name for the group',
},
description: {
type: 'string',
required: false,
visibility: 'user-or-llm',
description: 'Description of the group',
},
},
request: {
url: () => 'https://admin.googleapis.com/admin/directory/v1/groups',
method: 'POST',
headers: (params) => ({
Authorization: `Bearer ${params.accessToken}`,
'Content-Type': 'application/json',
}),
body: (params) => {
const body: Record<string, string> = {
email: params.email,
name: params.name,
}
if (params.description) {
body.description = params.description
}
return JSON.stringify(body)
},
},
transformResponse: async (response) => {
const data = await response.json()
if (!response.ok) {
throw new Error(data.error?.message || 'Failed to create group')
}
return {
success: true,
output: data,
}
},
}

View File

@@ -0,0 +1,52 @@
import type { ToolConfig } from '@/tools/types'
import type { GoogleGroupsDeleteParams, GoogleGroupsResponse } from './types'
export const deleteGroupTool: ToolConfig<GoogleGroupsDeleteParams, GoogleGroupsResponse> = {
id: 'google_groups_delete_group',
name: 'Google Groups Delete Group',
description: 'Delete a Google Group',
version: '1.0.0',
oauth: {
required: true,
provider: 'google-groups',
},
params: {
accessToken: {
type: 'string',
required: true,
visibility: 'hidden',
description: 'OAuth access token',
},
groupKey: {
type: 'string',
required: true,
visibility: 'user-or-llm',
description: 'Group email address or unique group ID to delete',
},
},
request: {
url: (params) => {
const encodedGroupKey = encodeURIComponent(params.groupKey)
return `https://admin.googleapis.com/admin/directory/v1/groups/${encodedGroupKey}`
},
method: 'DELETE',
headers: (params) => ({
Authorization: `Bearer ${params.accessToken}`,
'Content-Type': 'application/json',
}),
},
transformResponse: async (response) => {
if (!response.ok) {
const data = await response.json()
throw new Error(data.error?.message || 'Failed to delete group')
}
return {
success: true,
output: { message: 'Group deleted successfully' },
}
},
}

View File

@@ -0,0 +1,52 @@
import type { ToolConfig } from '@/tools/types'
import type { GoogleGroupsGetParams, GoogleGroupsResponse } from './types'
export const getGroupTool: ToolConfig<GoogleGroupsGetParams, GoogleGroupsResponse> = {
id: 'google_groups_get_group',
name: 'Google Groups Get Group',
description: 'Get details of a specific Google Group by email or group ID',
version: '1.0.0',
oauth: {
required: true,
provider: 'google-groups',
},
params: {
accessToken: {
type: 'string',
required: true,
visibility: 'hidden',
description: 'OAuth access token',
},
groupKey: {
type: 'string',
required: true,
visibility: 'user-or-llm',
description: 'Group email address or unique group ID',
},
},
request: {
url: (params) => {
const encodedGroupKey = encodeURIComponent(params.groupKey)
return `https://admin.googleapis.com/admin/directory/v1/groups/${encodedGroupKey}`
},
method: 'GET',
headers: (params) => ({
Authorization: `Bearer ${params.accessToken}`,
'Content-Type': 'application/json',
}),
},
transformResponse: async (response) => {
const data = await response.json()
if (!response.ok) {
throw new Error(data.error?.message || 'Failed to get group')
}
return {
success: true,
output: data,
}
},
}

View File

@@ -0,0 +1,59 @@
import type { ToolConfig } from '@/tools/types'
import type { GoogleGroupsGetMemberParams, GoogleGroupsResponse } from './types'
export const getMemberTool: ToolConfig<GoogleGroupsGetMemberParams, GoogleGroupsResponse> = {
id: 'google_groups_get_member',
name: 'Google Groups Get Member',
description: 'Get details of a specific member in a Google Group',
version: '1.0.0',
oauth: {
required: true,
provider: 'google-groups',
},
params: {
accessToken: {
type: 'string',
required: true,
visibility: 'hidden',
description: 'OAuth access token',
},
groupKey: {
type: 'string',
required: true,
visibility: 'user-or-llm',
description: 'Group email address or unique group ID',
},
memberKey: {
type: 'string',
required: true,
visibility: 'user-or-llm',
description: 'Member email address or unique member ID',
},
},
request: {
url: (params) => {
const encodedGroupKey = encodeURIComponent(params.groupKey)
const encodedMemberKey = encodeURIComponent(params.memberKey)
return `https://admin.googleapis.com/admin/directory/v1/groups/${encodedGroupKey}/members/${encodedMemberKey}`
},
method: 'GET',
headers: (params) => ({
Authorization: `Bearer ${params.accessToken}`,
'Content-Type': 'application/json',
}),
},
transformResponse: async (response) => {
const data = await response.json()
if (!response.ok) {
throw new Error(data.error?.message || 'Failed to get group member')
}
return {
success: true,
output: data,
}
},
}

View File

@@ -0,0 +1,59 @@
import type { ToolConfig } from '@/tools/types'
import type { GoogleGroupsHasMemberParams, GoogleGroupsResponse } from './types'
export const hasMemberTool: ToolConfig<GoogleGroupsHasMemberParams, GoogleGroupsResponse> = {
id: 'google_groups_has_member',
name: 'Google Groups Has Member',
description: 'Check if a user is a member of a Google Group',
version: '1.0.0',
oauth: {
required: true,
provider: 'google-groups',
},
params: {
accessToken: {
type: 'string',
required: true,
visibility: 'hidden',
description: 'OAuth access token',
},
groupKey: {
type: 'string',
required: true,
visibility: 'user-or-llm',
description: 'Group email address or unique group ID',
},
memberKey: {
type: 'string',
required: true,
visibility: 'user-or-llm',
description: 'Member email address or unique member ID to check',
},
},
request: {
url: (params) => {
const encodedGroupKey = encodeURIComponent(params.groupKey)
const encodedMemberKey = encodeURIComponent(params.memberKey)
return `https://admin.googleapis.com/admin/directory/v1/groups/${encodedGroupKey}/hasMember/${encodedMemberKey}`
},
method: 'GET',
headers: (params) => ({
Authorization: `Bearer ${params.accessToken}`,
'Content-Type': 'application/json',
}),
},
transformResponse: async (response) => {
const data = await response.json()
if (!response.ok) {
throw new Error(data.error?.message || 'Failed to check membership')
}
return {
success: true,
output: data,
}
},
}

View File

@@ -0,0 +1,23 @@
import { addMemberTool } from './add_member'
import { createGroupTool } from './create_group'
import { deleteGroupTool } from './delete_group'
import { getGroupTool } from './get_group'
import { getMemberTool } from './get_member'
import { hasMemberTool } from './has_member'
import { listGroupsTool } from './list_groups'
import { listMembersTool } from './list_members'
import { removeMemberTool } from './remove_member'
import { updateGroupTool } from './update_group'
import { updateMemberTool } from './update_member'
export const googleGroupsAddMemberTool = addMemberTool
export const googleGroupsCreateGroupTool = createGroupTool
export const googleGroupsDeleteGroupTool = deleteGroupTool
export const googleGroupsGetGroupTool = getGroupTool
export const googleGroupsGetMemberTool = getMemberTool
export const googleGroupsHasMemberTool = hasMemberTool
export const googleGroupsListGroupsTool = listGroupsTool
export const googleGroupsListMembersTool = listMembersTool
export const googleGroupsRemoveMemberTool = removeMemberTool
export const googleGroupsUpdateGroupTool = updateGroupTool
export const googleGroupsUpdateMemberTool = updateMemberTool

View File

@@ -0,0 +1,97 @@
import type { ToolConfig } from '@/tools/types'
import type { GoogleGroupsListParams, GoogleGroupsResponse } from './types'
export const listGroupsTool: ToolConfig<GoogleGroupsListParams, GoogleGroupsResponse> = {
id: 'google_groups_list_groups',
name: 'Google Groups List Groups',
description: 'List all groups in a Google Workspace domain',
version: '1.0.0',
oauth: {
required: true,
provider: 'google-groups',
},
params: {
accessToken: {
type: 'string',
required: true,
visibility: 'hidden',
description: 'OAuth access token',
},
customer: {
type: 'string',
required: false,
visibility: 'user-only',
description: 'Customer ID or "my_customer" for the authenticated user\'s domain',
},
domain: {
type: 'string',
required: false,
visibility: 'user-only',
description: 'Domain name to filter groups by',
},
maxResults: {
type: 'number',
required: false,
visibility: 'user-only',
description: 'Maximum number of results to return (1-200)',
},
pageToken: {
type: 'string',
required: false,
visibility: 'hidden',
description: 'Token for pagination',
},
query: {
type: 'string',
required: false,
visibility: 'user-only',
description: 'Search query to filter groups (e.g., "email:admin*")',
},
},
request: {
url: (params) => {
const url = new URL('https://admin.googleapis.com/admin/directory/v1/groups')
// Use my_customer as default if no customer or domain specified
if (params.customer) {
url.searchParams.set('customer', params.customer)
} else if (!params.domain) {
url.searchParams.set('customer', 'my_customer')
}
if (params.domain) {
url.searchParams.set('domain', params.domain)
}
if (params.maxResults) {
url.searchParams.set('maxResults', String(params.maxResults))
}
if (params.pageToken) {
url.searchParams.set('pageToken', params.pageToken)
}
if (params.query) {
url.searchParams.set('query', params.query)
}
return url.toString()
},
method: 'GET',
headers: (params) => ({
Authorization: `Bearer ${params.accessToken}`,
'Content-Type': 'application/json',
}),
},
transformResponse: async (response) => {
const data = await response.json()
if (!response.ok) {
throw new Error(data.error?.message || 'Failed to list groups')
}
return {
success: true,
output: data,
}
},
}

View File

@@ -0,0 +1,84 @@
import type { ToolConfig } from '@/tools/types'
import type { GoogleGroupsListMembersParams, GoogleGroupsResponse } from './types'
export const listMembersTool: ToolConfig<GoogleGroupsListMembersParams, GoogleGroupsResponse> = {
id: 'google_groups_list_members',
name: 'Google Groups List Members',
description: 'List all members of a Google Group',
version: '1.0.0',
oauth: {
required: true,
provider: 'google-groups',
},
params: {
accessToken: {
type: 'string',
required: true,
visibility: 'hidden',
description: 'OAuth access token',
},
groupKey: {
type: 'string',
required: true,
visibility: 'user-or-llm',
description: 'Group email address or unique group ID',
},
maxResults: {
type: 'number',
required: false,
visibility: 'user-only',
description: 'Maximum number of results to return (1-200)',
},
pageToken: {
type: 'string',
required: false,
visibility: 'hidden',
description: 'Token for pagination',
},
roles: {
type: 'string',
required: false,
visibility: 'user-or-llm',
description: 'Filter by roles (comma-separated: OWNER, MANAGER, MEMBER)',
},
},
request: {
url: (params) => {
const encodedGroupKey = encodeURIComponent(params.groupKey)
const url = new URL(
`https://admin.googleapis.com/admin/directory/v1/groups/${encodedGroupKey}/members`
)
if (params.maxResults) {
url.searchParams.set('maxResults', String(params.maxResults))
}
if (params.pageToken) {
url.searchParams.set('pageToken', params.pageToken)
}
if (params.roles) {
url.searchParams.set('roles', params.roles)
}
return url.toString()
},
method: 'GET',
headers: (params) => ({
Authorization: `Bearer ${params.accessToken}`,
'Content-Type': 'application/json',
}),
},
transformResponse: async (response) => {
const data = await response.json()
if (!response.ok) {
throw new Error(data.error?.message || 'Failed to list group members')
}
return {
success: true,
output: data,
}
},
}

View File

@@ -0,0 +1,59 @@
import type { ToolConfig } from '@/tools/types'
import type { GoogleGroupsRemoveMemberParams, GoogleGroupsResponse } from './types'
export const removeMemberTool: ToolConfig<GoogleGroupsRemoveMemberParams, GoogleGroupsResponse> = {
id: 'google_groups_remove_member',
name: 'Google Groups Remove Member',
description: 'Remove a member from a Google Group',
version: '1.0.0',
oauth: {
required: true,
provider: 'google-groups',
},
params: {
accessToken: {
type: 'string',
required: true,
visibility: 'hidden',
description: 'OAuth access token',
},
groupKey: {
type: 'string',
required: true,
visibility: 'user-or-llm',
description: 'Group email address or unique group ID',
},
memberKey: {
type: 'string',
required: true,
visibility: 'user-or-llm',
description: 'Email address or unique ID of the member to remove',
},
},
request: {
url: (params) => {
const encodedGroupKey = encodeURIComponent(params.groupKey)
const encodedMemberKey = encodeURIComponent(params.memberKey)
return `https://admin.googleapis.com/admin/directory/v1/groups/${encodedGroupKey}/members/${encodedMemberKey}`
},
method: 'DELETE',
headers: (params) => ({
Authorization: `Bearer ${params.accessToken}`,
'Content-Type': 'application/json',
}),
},
transformResponse: async (response) => {
if (!response.ok) {
const data = await response.json()
throw new Error(data.error?.message || 'Failed to remove member from group')
}
return {
success: true,
output: { message: 'Member removed successfully' },
}
},
}

View File

@@ -0,0 +1,111 @@
import type { ToolResponse } from '@/tools/types'
/**
* Common parameters for Google Groups API calls
*/
export interface GoogleGroupsCommonParams {
accessToken: string
}
/**
* Parameters for listing groups
*/
export interface GoogleGroupsListParams extends GoogleGroupsCommonParams {
customer?: string
domain?: string
maxResults?: number
pageToken?: string
query?: string
}
/**
* Parameters for getting a specific group
*/
export interface GoogleGroupsGetParams extends GoogleGroupsCommonParams {
groupKey: string
}
/**
* Parameters for creating a group
*/
export interface GoogleGroupsCreateParams extends GoogleGroupsCommonParams {
email: string
name: string
description?: string
}
/**
* Parameters for updating a group
*/
export interface GoogleGroupsUpdateParams extends GoogleGroupsCommonParams {
groupKey: string
name?: string
description?: string
email?: string
}
/**
* Parameters for deleting a group
*/
export interface GoogleGroupsDeleteParams extends GoogleGroupsCommonParams {
groupKey: string
}
/**
* Parameters for listing group members
*/
export interface GoogleGroupsListMembersParams extends GoogleGroupsCommonParams {
groupKey: string
maxResults?: number
pageToken?: string
roles?: string
}
/**
* Parameters for getting a specific member
*/
export interface GoogleGroupsGetMemberParams extends GoogleGroupsCommonParams {
groupKey: string
memberKey: string
}
/**
* Parameters for adding a member to a group
*/
export interface GoogleGroupsAddMemberParams extends GoogleGroupsCommonParams {
groupKey: string
email: string
role?: 'MEMBER' | 'MANAGER' | 'OWNER'
}
/**
* Parameters for removing a member from a group
*/
export interface GoogleGroupsRemoveMemberParams extends GoogleGroupsCommonParams {
groupKey: string
memberKey: string
}
/**
* Parameters for updating a member's role in a group
*/
export interface GoogleGroupsUpdateMemberParams extends GoogleGroupsCommonParams {
groupKey: string
memberKey: string
role: 'MEMBER' | 'MANAGER' | 'OWNER'
}
/**
* Parameters for checking if a user is a member of a group
*/
export interface GoogleGroupsHasMemberParams extends GoogleGroupsCommonParams {
groupKey: string
memberKey: string
}
/**
* Standard response for Google Groups operations
*/
export interface GoogleGroupsResponse extends ToolResponse {
output: Record<string, unknown>
}

View File

@@ -0,0 +1,85 @@
import type { ToolConfig } from '@/tools/types'
import type { GoogleGroupsResponse, GoogleGroupsUpdateParams } from './types'
export const updateGroupTool: ToolConfig<GoogleGroupsUpdateParams, GoogleGroupsResponse> = {
id: 'google_groups_update_group',
name: 'Google Groups Update Group',
description: 'Update an existing Google Group',
version: '1.0.0',
oauth: {
required: true,
provider: 'google-groups',
},
params: {
accessToken: {
type: 'string',
required: true,
visibility: 'hidden',
description: 'OAuth access token',
},
groupKey: {
type: 'string',
required: true,
visibility: 'user-or-llm',
description: 'Group email address or unique group ID',
},
name: {
type: 'string',
required: false,
visibility: 'user-or-llm',
description: 'New display name for the group',
},
description: {
type: 'string',
required: false,
visibility: 'user-or-llm',
description: 'New description for the group',
},
email: {
type: 'string',
required: false,
visibility: 'user-or-llm',
description: 'New email address for the group',
},
},
request: {
url: (params) => {
const encodedGroupKey = encodeURIComponent(params.groupKey)
return `https://admin.googleapis.com/admin/directory/v1/groups/${encodedGroupKey}`
},
method: 'PATCH',
headers: (params) => ({
Authorization: `Bearer ${params.accessToken}`,
'Content-Type': 'application/json',
}),
body: (params) => {
const body: Record<string, string> = {}
if (params.name) {
body.name = params.name
}
if (params.description) {
body.description = params.description
}
if (params.email) {
body.email = params.email
}
return JSON.stringify(body)
},
},
transformResponse: async (response) => {
const data = await response.json()
if (!response.ok) {
throw new Error(data.error?.message || 'Failed to update group')
}
return {
success: true,
output: data,
}
},
}

View File

@@ -0,0 +1,70 @@
import type { ToolConfig } from '@/tools/types'
import type { GoogleGroupsResponse, GoogleGroupsUpdateMemberParams } from './types'
export const updateMemberTool: ToolConfig<GoogleGroupsUpdateMemberParams, GoogleGroupsResponse> = {
id: 'google_groups_update_member',
name: 'Google Groups Update Member',
description: "Update a member's role in a Google Group (promote or demote)",
version: '1.0.0',
oauth: {
required: true,
provider: 'google-groups',
},
params: {
accessToken: {
type: 'string',
required: true,
visibility: 'hidden',
description: 'OAuth access token',
},
groupKey: {
type: 'string',
required: true,
visibility: 'user-or-llm',
description: 'Group email address or unique group ID',
},
memberKey: {
type: 'string',
required: true,
visibility: 'user-or-llm',
description: 'Member email address or unique member ID',
},
role: {
type: 'string',
required: true,
visibility: 'user-or-llm',
description: 'New role for the member (MEMBER, MANAGER, or OWNER)',
},
},
request: {
url: (params) => {
const encodedGroupKey = encodeURIComponent(params.groupKey)
const encodedMemberKey = encodeURIComponent(params.memberKey)
return `https://admin.googleapis.com/admin/directory/v1/groups/${encodedGroupKey}/members/${encodedMemberKey}`
},
method: 'PATCH',
headers: (params) => ({
Authorization: `Bearer ${params.accessToken}`,
'Content-Type': 'application/json',
}),
body: (params) => {
return JSON.stringify({
role: params.role,
})
},
},
transformResponse: async (response) => {
const data = await response.json()
if (!response.ok) {
throw new Error(data.error?.message || 'Failed to update member role')
}
return {
success: true,
output: data,
}
},
}

View File

@@ -1,3 +1,3 @@
import { requestTool } from '@/tools/http/request'
import { requestTool } from './request'
export { requestTool }
export const httpRequestTool = requestTool

View File

@@ -1,4 +1,5 @@
import { readUrlTool } from '@/tools/jina/read_url'
import { searchTool } from '@/tools/jina/search'
import { readUrlTool } from './read_url'
import { searchTool } from './search'
export { readUrlTool, searchTool }
export const jinaReadUrlTool = readUrlTool
export const jinaSearchTool = searchTool

View File

@@ -1,6 +1,13 @@
export { deleteTool } from './delete'
export { executeTool } from './execute'
export { insertTool } from './insert'
export { queryTool } from './query'
import { deleteTool } from './delete'
import { executeTool } from './execute'
import { insertTool } from './insert'
import { queryTool } from './query'
import { updateTool } from './update'
export const mongodbDeleteTool = deleteTool
export const mongodbExecuteTool = executeTool
export const mongodbInsertTool = insertTool
export const mongodbQueryTool = queryTool
export const mongodbUpdateTool = updateTool
export * from './types'
export { updateTool } from './update'

View File

@@ -1,6 +1,13 @@
export { deleteTool } from './delete'
export { executeTool } from './execute'
export { insertTool } from './insert'
export { queryTool } from './query'
import { deleteTool } from './delete'
import { executeTool } from './execute'
import { insertTool } from './insert'
import { queryTool } from './query'
import { updateTool } from './update'
export const mysqlDeleteTool = deleteTool
export const mysqlExecuteTool = executeTool
export const mysqlInsertTool = insertTool
export const mysqlQueryTool = queryTool
export const mysqlUpdateTool = updateTool
export * from './types'
export { updateTool } from './update'

View File

@@ -1,7 +1,14 @@
export { createTool } from './create'
export { deleteTool } from './delete'
export { executeTool } from './execute'
export { mergeTool } from './merge'
export { queryTool } from './query'
import { createTool } from './create'
import { deleteTool } from './delete'
import { executeTool } from './execute'
import { mergeTool } from './merge'
import { queryTool } from './query'
import { updateTool } from './update'
export const neo4jCreateTool = createTool
export const neo4jDeleteTool = deleteTool
export const neo4jExecuteTool = executeTool
export const neo4jMergeTool = mergeTool
export const neo4jQueryTool = queryTool
export const neo4jUpdateTool = updateTool
export * from './types'
export { updateTool } from './update'

View File

@@ -1,4 +1,5 @@
import { embeddingsTool } from '@/tools/openai/embeddings'
import { imageTool } from '@/tools/openai/image'
export { embeddingsTool, imageTool }
export const openAIEmbeddingsTool = embeddingsTool
export const openAIImageTool = imageTool

View File

@@ -4,4 +4,8 @@ import { insertTool } from './insert'
import { queryTool } from './query'
import { updateTool } from './update'
export { deleteTool, executeTool, insertTool, queryTool, updateTool }
export const postgresDeleteTool = deleteTool
export const postgresExecuteTool = executeTool
export const postgresInsertTool = insertTool
export const postgresQueryTool = queryTool
export const postgresUpdateTool = updateTool

View File

@@ -4,4 +4,8 @@ import { insertTool } from './insert'
import { queryTool } from './query'
import { updateTool } from './update'
export { deleteTool, executeTool, insertTool, queryTool, updateTool }
export const rdsDeleteTool = deleteTool
export const rdsExecuteTool = executeTool
export const rdsInsertTool = insertTool
export const rdsQueryTool = queryTool
export const rdsUpdateTool = updateTool

View File

@@ -145,12 +145,12 @@ import {
dropboxUploadTool,
} from '@/tools/dropbox'
import {
deleteTool as dynamodbDeleteTool,
getTool as dynamodbGetTool,
putTool as dynamodbPutTool,
queryTool as dynamodbQueryTool,
scanTool as dynamodbScanTool,
updateTool as dynamodbUpdateTool,
dynamodbDeleteTool,
dynamodbGetTool,
dynamodbPutTool,
dynamodbQueryTool,
dynamodbScanTool,
dynamodbUpdateTool,
} from '@/tools/dynamodb'
import {
elasticsearchBulkTool,
@@ -176,11 +176,11 @@ import {
} from '@/tools/exa'
import { fileParseTool } from '@/tools/file'
import {
crawlTool,
extractTool,
searchTool as firecrawlSearchTool,
mapTool,
scrapeTool,
firecrawlCrawlTool,
firecrawlExtractTool,
firecrawlMapTool,
firecrawlScrapeTool,
firecrawlSearchTool,
} from '@/tools/firecrawl'
import { functionExecuteTool } from '@/tools/function'
import {
@@ -272,7 +272,7 @@ import {
gmailSendTool,
gmailUnarchiveTool,
} from '@/tools/gmail'
import { searchTool as googleSearchTool } from '@/tools/google'
import { googleSearchTool } from '@/tools/google'
import {
googleCalendarCreateTool,
googleCalendarGetTool,
@@ -289,6 +289,19 @@ import {
googleDriveUploadTool,
} from '@/tools/google_drive'
import { googleFormsGetResponsesTool } from '@/tools/google_form'
import {
googleGroupsAddMemberTool,
googleGroupsCreateGroupTool,
googleGroupsDeleteGroupTool,
googleGroupsGetGroupTool,
googleGroupsGetMemberTool,
googleGroupsHasMemberTool,
googleGroupsListGroupsTool,
googleGroupsListMembersTool,
googleGroupsRemoveMemberTool,
googleGroupsUpdateGroupTool,
googleGroupsUpdateMemberTool,
} from '@/tools/google_groups'
import {
googleSheetsAppendTool,
googleSheetsReadTool,
@@ -335,7 +348,7 @@ import {
grafanaUpdateDashboardTool,
} from '@/tools/grafana'
import { guardrailsValidateTool } from '@/tools/guardrails'
import { requestTool as httpRequest } from '@/tools/http'
import { httpRequestTool } from '@/tools/http'
import {
hubspotCreateCompanyTool,
hubspotCreateContactTool,
@@ -424,7 +437,7 @@ import {
intercomSearchConversationsTool,
intercomUpdateContactTool,
} from '@/tools/intercom'
import { searchTool as jinaSearchTool, readUrlTool } from '@/tools/jina'
import { jinaReadUrlTool, jinaSearchTool } from '@/tools/jina'
import {
jiraAddCommentTool,
jiraAddWatcherTool,
@@ -682,26 +695,26 @@ import {
} from '@/tools/microsoft_teams'
import { mistralParserTool } from '@/tools/mistral'
import {
deleteTool as mongodbDeleteTool,
executeTool as mongodbExecuteTool,
insertTool as mongodbInsertTool,
queryTool as mongodbQueryTool,
updateTool as mongodbUpdateTool,
mongodbDeleteTool,
mongodbExecuteTool,
mongodbInsertTool,
mongodbQueryTool,
mongodbUpdateTool,
} from '@/tools/mongodb'
import {
deleteTool as mysqlDeleteTool,
executeTool as mysqlExecuteTool,
insertTool as mysqlInsertTool,
queryTool as mysqlQueryTool,
updateTool as mysqlUpdateTool,
mysqlDeleteTool,
mysqlExecuteTool,
mysqlInsertTool,
mysqlQueryTool,
mysqlUpdateTool,
} from '@/tools/mysql'
import {
createTool as neo4jCreateTool,
deleteTool as neo4jDeleteTool,
executeTool as neo4jExecuteTool,
mergeTool as neo4jMergeTool,
queryTool as neo4jQueryTool,
updateTool as neo4jUpdateTool,
neo4jCreateTool,
neo4jDeleteTool,
neo4jExecuteTool,
neo4jMergeTool,
neo4jQueryTool,
neo4jUpdateTool,
} from '@/tools/neo4j'
import {
notionCreateDatabaseTool,
@@ -719,7 +732,7 @@ import {
onedriveListTool,
onedriveUploadTool,
} from '@/tools/onedrive'
import { imageTool, embeddingsTool as openAIEmbeddings } from '@/tools/openai'
import { openAIEmbeddingsTool, openAIImageTool } from '@/tools/openai'
import {
outlookCopyTool,
outlookDeleteTool,
@@ -780,11 +793,11 @@ import {
polymarketSearchTool,
} from '@/tools/polymarket'
import {
deleteTool as postgresDeleteTool,
executeTool as postgresExecuteTool,
insertTool as postgresInsertTool,
queryTool as postgresQueryTool,
updateTool as postgresUpdateTool,
postgresDeleteTool,
postgresExecuteTool,
postgresInsertTool,
postgresQueryTool,
postgresUpdateTool,
} from '@/tools/postgresql'
import {
posthogBatchEventsTool,
@@ -873,11 +886,11 @@ import {
} from '@/tools/pylon'
import { qdrantFetchTool, qdrantSearchTool, qdrantUpsertTool } from '@/tools/qdrant'
import {
deleteTool as rdsDeleteTool,
executeTool as rdsExecuteTool,
insertTool as rdsInsertTool,
queryTool as rdsQueryTool,
updateTool as rdsUpdateTool,
rdsDeleteTool,
rdsExecuteTool,
rdsInsertTool,
rdsQueryTool,
rdsUpdateTool,
} from '@/tools/rds'
import {
redditDeleteTool,
@@ -961,7 +974,7 @@ import {
updateIssueTool,
updateProjectTool,
} from '@/tools/sentry'
import { searchTool as serperSearch } from '@/tools/serper'
import { serperSearchTool } from '@/tools/serper'
import {
sharepointAddListItemTool,
sharepointCreateListTool,
@@ -1011,19 +1024,19 @@ import {
import { smsSendTool } from '@/tools/sms'
import { smtpSendMailTool } from '@/tools/smtp'
import {
checkCommandExistsTool as sshCheckCommandExistsTool,
checkFileExistsTool as sshCheckFileExistsTool,
createDirectoryTool as sshCreateDirectoryTool,
deleteFileTool as sshDeleteFileTool,
downloadFileTool as sshDownloadFileTool,
executeCommandTool as sshExecuteCommandTool,
executeScriptTool as sshExecuteScriptTool,
getSystemInfoTool as sshGetSystemInfoTool,
listDirectoryTool as sshListDirectoryTool,
moveRenameTool as sshMoveRenameTool,
readFileContentTool as sshReadFileContentTool,
uploadFileTool as sshUploadFileTool,
writeFileContentTool as sshWriteFileContentTool,
sshCheckCommandExistsTool,
sshCheckFileExistsTool,
sshCreateDirectoryTool,
sshDeleteFileTool,
sshDownloadFileTool,
sshExecuteCommandTool,
sshExecuteScriptTool,
sshGetSystemInfoTool,
sshListDirectoryTool,
sshMoveRenameTool,
sshReadFileContentTool,
sshUploadFileTool,
sshWriteFileContentTool,
} from '@/tools/ssh'
import { stagehandAgentTool, stagehandExtractTool } from '@/tools/stagehand'
import {
@@ -1283,17 +1296,17 @@ export const tools: Record<string, ToolConfig> = {
asana_search_tasks: asanaSearchTasksTool,
asana_add_comment: asanaAddCommentTool,
browser_use_run_task: browserUseRunTaskTool,
openai_embeddings: openAIEmbeddings,
http_request: httpRequest,
openai_embeddings: openAIEmbeddingsTool,
http_request: httpRequestTool,
huggingface_chat: huggingfaceChatTool,
function_execute: functionExecuteTool,
vision_tool: visionTool,
file_parser: fileParseTool,
firecrawl_scrape: scrapeTool,
firecrawl_scrape: firecrawlScrapeTool,
firecrawl_search: firecrawlSearchTool,
firecrawl_crawl: crawlTool,
firecrawl_map: mapTool,
firecrawl_extract: extractTool,
firecrawl_crawl: firecrawlCrawlTool,
firecrawl_map: firecrawlMapTool,
firecrawl_extract: firecrawlExtractTool,
grafana_get_dashboard: grafanaGetDashboardTool,
grafana_list_dashboards: grafanaListDashboardsTool,
grafana_create_dashboard: grafanaCreateDashboardTool,
@@ -1315,7 +1328,7 @@ export const tools: Record<string, ToolConfig> = {
grafana_create_folder: grafanaCreateFolderTool,
google_search: googleSearchTool,
guardrails_validate: guardrailsValidateTool,
jina_read_url: readUrlTool,
jina_read_url: jinaReadUrlTool,
jina_search: jinaSearchTool,
linkup_search: linkupSearchTool,
linkedin_share_post: linkedInSharePostTool,
@@ -1429,7 +1442,7 @@ export const tools: Record<string, ToolConfig> = {
slack_add_reaction: slackAddReactionTool,
github_repo_info: githubRepoInfoTool,
github_latest_commit: githubLatestCommitTool,
serper_search: serperSearch,
serper_search: serperSearchTool,
tavily_search: tavilySearchTool,
tavily_extract: tavilyExtractTool,
tavily_crawl: tavilyCrawlTool,
@@ -1914,7 +1927,7 @@ export const tools: Record<string, ToolConfig> = {
datadog_create_downtime: datadogCreateDowntimeTool,
datadog_list_downtimes: datadogListDowntimesTool,
datadog_cancel_downtime: datadogCancelDowntimeTool,
openai_image: imageTool,
openai_image: openAIImageTool,
microsoft_teams_read_chat: microsoftTeamsReadChatTool,
microsoft_teams_write_chat: microsoftTeamsWriteChatTool,
microsoft_teams_read_channel: microsoftTeamsReadChannelTool,
@@ -2115,6 +2128,17 @@ export const tools: Record<string, ToolConfig> = {
google_vault_create_matters: createMattersTool,
google_vault_list_matters: listMattersTool,
google_vault_download_export_file: downloadExportFileTool,
google_groups_list_groups: googleGroupsListGroupsTool,
google_groups_get_group: googleGroupsGetGroupTool,
google_groups_create_group: googleGroupsCreateGroupTool,
google_groups_update_group: googleGroupsUpdateGroupTool,
google_groups_delete_group: googleGroupsDeleteGroupTool,
google_groups_list_members: googleGroupsListMembersTool,
google_groups_get_member: googleGroupsGetMemberTool,
google_groups_add_member: googleGroupsAddMemberTool,
google_groups_remove_member: googleGroupsRemoveMemberTool,
google_groups_update_member: googleGroupsUpdateMemberTool,
google_groups_has_member: googleGroupsHasMemberTool,
qdrant_fetch_points: qdrantFetchTool,
qdrant_search_vector: qdrantSearchTool,
qdrant_upsert_points: qdrantUpsertTool,

View File

@@ -1,3 +1,3 @@
import { searchTool } from '@/tools/serper/search'
import { searchTool } from './search'
export { searchTool }
export const serperSearchTool = searchTool

View File

@@ -1,14 +1,27 @@
export { checkCommandExistsTool } from './check_command_exists'
export { checkFileExistsTool } from './check_file_exists'
export { createDirectoryTool } from './create_directory'
export { deleteFileTool } from './delete_file'
export { downloadFileTool } from './download_file'
export { executeCommandTool } from './execute_command'
export { executeScriptTool } from './execute_script'
export { getSystemInfoTool } from './get_system_info'
export { listDirectoryTool } from './list_directory'
export { moveRenameTool } from './move_rename'
export { readFileContentTool } from './read_file_content'
export * from './types'
export { uploadFileTool } from './upload_file'
export { writeFileContentTool } from './write_file_content'
import { checkCommandExistsTool } from './check_command_exists'
import { checkFileExistsTool } from './check_file_exists'
import { createDirectoryTool } from './create_directory'
import { deleteFileTool } from './delete_file'
import { downloadFileTool } from './download_file'
import { executeCommandTool } from './execute_command'
import { executeScriptTool } from './execute_script'
import { getSystemInfoTool } from './get_system_info'
import { listDirectoryTool } from './list_directory'
import { moveRenameTool } from './move_rename'
import { readFileContentTool } from './read_file_content'
import { uploadFileTool } from './upload_file'
import { writeFileContentTool } from './write_file_content'
export const sshCheckCommandExistsTool = checkCommandExistsTool
export const sshCheckFileExistsTool = checkFileExistsTool
export const sshCreateDirectoryTool = createDirectoryTool
export const sshDeleteFileTool = deleteFileTool
export const sshDownloadFileTool = downloadFileTool
export const sshExecuteCommandTool = executeCommandTool
export const sshExecuteScriptTool = executeScriptTool
export const sshGetSystemInfoTool = getSystemInfoTool
export const sshListDirectoryTool = listDirectoryTool
export const sshMoveRenameTool = moveRenameTool
export const sshReadFileContentTool = readFileContentTool
export const sshUploadFileTool = uploadFileTool
export const sshWriteFileContentTool = writeFileContentTool