From 657e2bb39f33fbab4ba4175b167a3fa860cf582b Mon Sep 17 00:00:00 2001 From: waleed Date: Thu, 2 Jul 2026 11:20:57 -0700 Subject: [PATCH 1/5] feat(google-appsheet): add Google AppSheet integration - 4 tools (find/add/edit/delete rows) against the AppSheet Action API - API key auth via Application Access Key (no OAuth/scopes needed) - Block with operation dropdown, region selector, and Selector expression support - Generated docs --- apps/docs/components/icons.tsx | 15 ++ apps/docs/components/ui/icon-mapping.ts | 2 + .../docs/en/integrations/google_appsheet.mdx | 109 ++++++++ .../content/docs/en/integrations/meta.json | 1 + apps/sim/blocks/blocks/google_appsheet.ts | 235 ++++++++++++++++++ apps/sim/blocks/registry-maps.ts | 3 + apps/sim/components/icons.tsx | 15 ++ apps/sim/lib/integrations/icon-mapping.ts | 2 + apps/sim/lib/integrations/integrations.json | 35 +++ apps/sim/tools/google_appsheet/add_rows.ts | 102 ++++++++ apps/sim/tools/google_appsheet/delete_rows.ts | 102 ++++++++ apps/sim/tools/google_appsheet/edit_rows.ts | 102 ++++++++ apps/sim/tools/google_appsheet/find_rows.ts | 102 ++++++++ apps/sim/tools/google_appsheet/index.ts | 13 + apps/sim/tools/google_appsheet/types.ts | 72 ++++++ apps/sim/tools/google_appsheet/utils.ts | 10 + apps/sim/tools/registry.ts | 10 + 17 files changed, 930 insertions(+) create mode 100644 apps/docs/content/docs/en/integrations/google_appsheet.mdx create mode 100644 apps/sim/blocks/blocks/google_appsheet.ts create mode 100644 apps/sim/tools/google_appsheet/add_rows.ts create mode 100644 apps/sim/tools/google_appsheet/delete_rows.ts create mode 100644 apps/sim/tools/google_appsheet/edit_rows.ts create mode 100644 apps/sim/tools/google_appsheet/find_rows.ts create mode 100644 apps/sim/tools/google_appsheet/index.ts create mode 100644 apps/sim/tools/google_appsheet/types.ts create mode 100644 apps/sim/tools/google_appsheet/utils.ts diff --git a/apps/docs/components/icons.tsx b/apps/docs/components/icons.tsx index 2bc753071f2..00db61dd498 100644 --- a/apps/docs/components/icons.tsx +++ b/apps/docs/components/icons.tsx @@ -1742,6 +1742,21 @@ export function AmplitudeIcon(props: SVGProps) { ) } +export function GoogleAppsheetIcon(props: SVGProps) { + return ( + + + + + + + + ) +} + export function GoogleBooksIcon(props: SVGProps) { return ( diff --git a/apps/docs/components/ui/icon-mapping.ts b/apps/docs/components/ui/icon-mapping.ts index 243cb5ef066..f5f3a71a108 100644 --- a/apps/docs/components/ui/icon-mapping.ts +++ b/apps/docs/components/ui/icon-mapping.ts @@ -78,6 +78,7 @@ import { GmailIcon, GongIcon, GoogleAdsIcon, + GoogleAppsheetIcon, GoogleBigQueryIcon, GoogleBooksIcon, GoogleCalendarIcon, @@ -321,6 +322,7 @@ export const blockTypeToIconMap: Record = { gmail_v2: GmailIcon, gong: GongIcon, google_ads: GoogleAdsIcon, + google_appsheet: GoogleAppsheetIcon, google_bigquery: GoogleBigQueryIcon, google_books: GoogleBooksIcon, google_calendar: GoogleCalendarIcon, diff --git a/apps/docs/content/docs/en/integrations/google_appsheet.mdx b/apps/docs/content/docs/en/integrations/google_appsheet.mdx new file mode 100644 index 00000000000..745c8a524a7 --- /dev/null +++ b/apps/docs/content/docs/en/integrations/google_appsheet.mdx @@ -0,0 +1,109 @@ +--- +title: Google AppSheet +description: Read, add, edit, and delete rows in a Google AppSheet table +--- + +import { BlockInfoCard } from "@/components/ui/block-info-card" + + + +## Usage Instructions + +Integrate Google AppSheet into your workflow. Find, add, edit, and delete rows in an AppSheet table using the AppSheet API. Requires an AppSheet Enterprise plan with the API enabled and an Application Access Key. + + + +## Actions + +### `google_appsheet_find_rows` + +Read rows from an AppSheet table. Omit the selector to return every row, or provide a Selector expression (Filter/Select/OrderBy/Top) to narrow and shape the results. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | AppSheet Application Access Key | +| `appId` | string | Yes | AppSheet app ID \(found in App > Settings > Integrations > IN\) | +| `tableName` | string | Yes | Name of the table to read from | +| `region` | string | No | AppSheet region subdomain: "www" \(global, default\), "eu", or "asia-southeast" | +| `selector` | string | No | Optional AppSheet expression to filter/sort/limit rows, e.g. Filter\(TableName, \[Age\] >= 21\) or Top\(OrderBy\(Filter\(TableName, true\), \[LastName\], true\), 10\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `rows` | array | Matching rows returned by AppSheet | +| `metadata` | json | Operation metadata | +| ↳ `rowCount` | number | Number of rows returned | + +### `google_appsheet_add_rows` + +Add new rows to an AppSheet table. The key column value must be provided explicitly, or omitted when its Initial value expression generates it automatically (e.g. UNIQUEID()). + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | AppSheet Application Access Key | +| `appId` | string | Yes | AppSheet app ID \(found in App > Settings > Integrations > IN\) | +| `tableName` | string | Yes | Name of the table to add rows to | +| `region` | string | No | AppSheet region subdomain: "www" \(global, default\), "eu", or "asia-southeast" | +| `rows` | json | Yes | Array of row objects to add, each a column-name/value map, e.g. \[\{ "FirstName": "Jan", "LastName": "Jones" \}\] | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `rows` | array | Rows added by AppSheet, including any generated key values | +| `metadata` | json | Operation metadata | +| ↳ `rowCount` | number | Number of rows added | + +### `google_appsheet_edit_rows` + +Update existing rows in an AppSheet table. Each row must explicitly include the key column name and value, plus any columns to change. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | AppSheet Application Access Key | +| `appId` | string | Yes | AppSheet app ID \(found in App > Settings > Integrations > IN\) | +| `tableName` | string | Yes | Name of the table to update rows in | +| `region` | string | No | AppSheet region subdomain: "www" \(global, default\), "eu", or "asia-southeast" | +| `rows` | json | Yes | Array of row objects to update, each including the key column and the columns to change, e.g. \[\{ "RowID": "123", "Status": "Done" \}\] | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `rows` | array | Rows updated by AppSheet | +| `metadata` | json | Operation metadata | +| ↳ `rowCount` | number | Number of rows updated | + +### `google_appsheet_delete_rows` + +Delete rows from an AppSheet table. Each row only needs to include the key column name and value. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | AppSheet Application Access Key | +| `appId` | string | Yes | AppSheet app ID \(found in App > Settings > Integrations > IN\) | +| `tableName` | string | Yes | Name of the table to delete rows from | +| `region` | string | No | AppSheet region subdomain: "www" \(global, default\), "eu", or "asia-southeast" | +| `rows` | json | Yes | Array of row objects identifying rows to delete by key column, e.g. \[\{ "RowID": "123" \}\] | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `rows` | array | Rows deleted by AppSheet | +| `metadata` | json | Operation metadata | +| ↳ `rowCount` | number | Number of rows deleted | + + diff --git a/apps/docs/content/docs/en/integrations/meta.json b/apps/docs/content/docs/en/integrations/meta.json index f9f8e3a7c26..ae36529830d 100644 --- a/apps/docs/content/docs/en/integrations/meta.json +++ b/apps/docs/content/docs/en/integrations/meta.json @@ -77,6 +77,7 @@ "gong", "google-service-account", "google_ads", + "google_appsheet", "google_bigquery", "google_books", "google_calendar", diff --git a/apps/sim/blocks/blocks/google_appsheet.ts b/apps/sim/blocks/blocks/google_appsheet.ts new file mode 100644 index 00000000000..954bdfb5d2f --- /dev/null +++ b/apps/sim/blocks/blocks/google_appsheet.ts @@ -0,0 +1,235 @@ +import { GoogleAppsheetIcon } from '@/components/icons' +import type { BlockConfig, BlockMeta } from '@/blocks/types' +import { AuthMode, IntegrationType } from '@/blocks/types' +import type { GoogleAppsheetResponse } from '@/tools/google_appsheet/types' + +export const GoogleAppsheetBlock: BlockConfig = { + type: 'google_appsheet', + name: 'Google AppSheet', + description: 'Read, add, edit, and delete rows in a Google AppSheet table', + authMode: AuthMode.ApiKey, + longDescription: + 'Integrate Google AppSheet into your workflow. Find, add, edit, and delete rows in an AppSheet table using the AppSheet API. Requires an AppSheet Enterprise plan with the API enabled and an Application Access Key.', + docsLink: 'https://docs.sim.ai/integrations/google_appsheet', + category: 'tools', + integrationType: IntegrationType.Databases, + bgColor: '#FFFFFF', + icon: GoogleAppsheetIcon, + + subBlocks: [ + { + id: 'operation', + title: 'Operation', + type: 'dropdown', + options: [ + { label: 'Find Rows', id: 'google_appsheet_find_rows' }, + { label: 'Add Rows', id: 'google_appsheet_add_rows' }, + { label: 'Edit Rows', id: 'google_appsheet_edit_rows' }, + { label: 'Delete Rows', id: 'google_appsheet_delete_rows' }, + ], + value: () => 'google_appsheet_find_rows', + }, + { + id: 'appId', + title: 'App ID', + type: 'short-input', + placeholder: 'App > Settings > Integrations > IN', + required: true, + }, + { + id: 'tableName', + title: 'Table Name', + type: 'short-input', + placeholder: 'e.g. Orders', + required: true, + }, + // Find Rows operation inputs + { + id: 'selector', + title: 'Selector', + type: 'long-input', + placeholder: + 'Optional expression, e.g. Filter(Orders, [Status] = "Open") or Top(OrderBy(Filter(Orders, true), [Date], true), 10)', + condition: { field: 'operation', value: 'google_appsheet_find_rows' }, + mode: 'advanced', + }, + // Add/Edit/Delete Rows operation inputs (shared JSON array field) + { + id: 'rows', + title: 'Rows (JSON Array)', + type: 'code', + language: 'json', + placeholder: 'For Add: `[{ "FirstName": "Jan", "LastName": "Jones" }]`', + condition: { + field: 'operation', + value: [ + 'google_appsheet_add_rows', + 'google_appsheet_edit_rows', + 'google_appsheet_delete_rows', + ], + }, + required: { + field: 'operation', + value: [ + 'google_appsheet_add_rows', + 'google_appsheet_edit_rows', + 'google_appsheet_delete_rows', + ], + }, + wandConfig: { + enabled: true, + prompt: `Generate an AppSheet rows JSON array based on the user's description. +Each element is an object mapping column names to values. + +Current rows: {context} + +For Add, provide the columns for each new row: +[{ "FirstName": "Jan", "LastName": "Jones" }] + +For Edit, include the key column plus the columns to change: +[{ "RowID": "123", "Status": "Done" }] + +For Delete, include only the key column: +[{ "RowID": "123" }] + +Return ONLY the valid JSON array - no explanations, no markdown.`, + placeholder: 'Describe the rows to add, edit, or delete...', + generationType: 'json-object', + }, + }, + { + id: 'region', + title: 'Region', + type: 'dropdown', + options: [ + { label: 'Global (www)', id: 'www' }, + { label: 'Europe (eu)', id: 'eu' }, + { label: 'Asia Pacific (asia-southeast)', id: 'asia-southeast' }, + ], + value: () => 'www', + mode: 'advanced', + }, + // API Key (common to all operations) + { + id: 'apiKey', + title: 'Application Access Key', + type: 'short-input', + placeholder: 'Enter your AppSheet Application Access Key', + password: true, + required: true, + }, + ], + + tools: { + access: [ + 'google_appsheet_find_rows', + 'google_appsheet_add_rows', + 'google_appsheet_edit_rows', + 'google_appsheet_delete_rows', + ], + config: { + tool: (params) => params.operation, + params: (params) => { + const { rows, ...rest } = params + const result: Record = { ...rest } + if (params.operation !== 'google_appsheet_find_rows' && rows) { + try { + result.rows = typeof rows === 'string' ? JSON.parse(rows) : rows + } catch (error: any) { + throw new Error(`Invalid JSON in Rows field: ${error.message}`) + } + } + return result + }, + }, + }, + + inputs: { + operation: { type: 'string', description: 'Operation to perform' }, + appId: { type: 'string', description: 'AppSheet app ID' }, + tableName: { type: 'string', description: 'Name of the table to operate on' }, + region: { type: 'string', description: 'AppSheet region subdomain' }, + apiKey: { type: 'string', description: 'AppSheet Application Access Key' }, + selector: { type: 'string', description: 'Optional AppSheet Selector expression' }, + rows: { type: 'json', description: 'Array of row objects for the operation' }, + }, + + outputs: { + rows: { type: 'json', description: 'Rows returned by the AppSheet operation' }, + metadata: { type: 'json', description: 'Operation metadata, including row count' }, + }, +} + +export const GoogleAppsheetBlockMeta = { + tags: ['spreadsheet', 'automation', 'google-workspace'], + url: 'https://about.appsheet.com', + templates: [ + { + icon: GoogleAppsheetIcon, + title: 'AppSheet order intake', + prompt: + 'Build a workflow triggered by a form submission that adds a new row to an AppSheet Orders table, then posts a confirmation message to Slack with the order details.', + modules: ['agent', 'workflows'], + category: 'operations', + tags: ['automation'], + alsoIntegrations: ['slack'], + }, + { + icon: GoogleAppsheetIcon, + title: 'AppSheet daily status digest', + prompt: + 'Create a scheduled workflow that runs daily, finds all AppSheet rows where Status is "Open", summarizes them with an agent, and emails the summary to the operations team.', + modules: ['scheduled', 'agent', 'workflows'], + category: 'operations', + tags: ['automation', 'monitoring'], + alsoIntegrations: ['gmail'], + }, + { + icon: GoogleAppsheetIcon, + title: 'AppSheet inventory sync', + prompt: + 'Build a workflow that reads updated rows from an AppSheet Inventory table, transforms the quantities with an agent, and writes the reconciled totals into a Google Sheet.', + modules: ['agent', 'workflows'], + category: 'operations', + tags: ['automation', 'analysis'], + alsoIntegrations: ['google_sheets'], + }, + { + icon: GoogleAppsheetIcon, + title: 'AppSheet ticket escalation', + prompt: + 'Build a workflow that finds AppSheet rows where Priority is "High" and Status is not "Resolved", and edits each row to add an Escalated flag, then creates a Linear issue for each one.', + modules: ['agent', 'workflows'], + category: 'support', + tags: ['automation', 'ticketing'], + alsoIntegrations: ['linear'], + }, + { + icon: GoogleAppsheetIcon, + title: 'AppSheet cleanup job', + prompt: + 'Create a scheduled workflow that finds AppSheet rows older than 90 days with Status "Archived" and deletes them, then logs a summary of how many rows were removed to a table.', + modules: ['scheduled', 'tables', 'workflows'], + category: 'operations', + tags: ['automation'], + }, + { + icon: GoogleAppsheetIcon, + title: 'AppSheet lead router', + prompt: + 'Build a workflow that finds new AppSheet rows in a Leads table, uses an agent to classify each lead by region, and edits the row to assign the correct sales rep.', + modules: ['agent', 'workflows'], + category: 'sales', + tags: ['automation', 'crm'], + }, + { + icon: GoogleAppsheetIcon, + title: 'AppSheet field service report', + prompt: + 'Build a workflow that finds all AppSheet rows completed today in a Work Orders table, generates a summary report with an agent, and saves it as a file for the team.', + modules: ['agent', 'files', 'workflows'], + category: 'operations', + tags: ['automation', 'analysis'], + }, + ], +} as const satisfies BlockMeta diff --git a/apps/sim/blocks/registry-maps.ts b/apps/sim/blocks/registry-maps.ts index 801cd3c2abf..fd1d8de138a 100644 --- a/apps/sim/blocks/registry-maps.ts +++ b/apps/sim/blocks/registry-maps.ts @@ -92,6 +92,7 @@ import { GmailBlock, GmailBlockMeta, GmailV2Block, GmailV2BlockMeta } from '@/bl import { GongBlock, GongBlockMeta } from '@/blocks/blocks/gong' import { GoogleSearchBlock, GoogleSearchBlockMeta } from '@/blocks/blocks/google' import { GoogleAdsBlock, GoogleAdsBlockMeta } from '@/blocks/blocks/google_ads' +import { GoogleAppsheetBlock, GoogleAppsheetBlockMeta } from '@/blocks/blocks/google_appsheet' import { GoogleBigQueryBlock, GoogleBigQueryBlockMeta } from '@/blocks/blocks/google_bigquery' import { GoogleBooksBlock, GoogleBooksBlockMeta } from '@/blocks/blocks/google_books' import { @@ -429,6 +430,7 @@ export const BLOCK_REGISTRY: Record = { gmail_v2: GmailV2Block, gong: GongBlock, google_ads: GoogleAdsBlock, + google_appsheet: GoogleAppsheetBlock, google_bigquery: GoogleBigQueryBlock, google_books: GoogleBooksBlock, google_calendar: GoogleCalendarBlock, @@ -725,6 +727,7 @@ export const BLOCK_META_REGISTRY: Record = { gmail_v2: GmailV2BlockMeta, gong: GongBlockMeta, google_ads: GoogleAdsBlockMeta, + google_appsheet: GoogleAppsheetBlockMeta, google_bigquery: GoogleBigQueryBlockMeta, google_books: GoogleBooksBlockMeta, google_calendar: GoogleCalendarBlockMeta, diff --git a/apps/sim/components/icons.tsx b/apps/sim/components/icons.tsx index 2bc753071f2..00db61dd498 100644 --- a/apps/sim/components/icons.tsx +++ b/apps/sim/components/icons.tsx @@ -1742,6 +1742,21 @@ export function AmplitudeIcon(props: SVGProps) { ) } +export function GoogleAppsheetIcon(props: SVGProps) { + return ( + + + + + + + + ) +} + export function GoogleBooksIcon(props: SVGProps) { return ( diff --git a/apps/sim/lib/integrations/icon-mapping.ts b/apps/sim/lib/integrations/icon-mapping.ts index fbb302ad9f1..e9df1348307 100644 --- a/apps/sim/lib/integrations/icon-mapping.ts +++ b/apps/sim/lib/integrations/icon-mapping.ts @@ -77,6 +77,7 @@ import { GmailIcon, GongIcon, GoogleAdsIcon, + GoogleAppsheetIcon, GoogleBigQueryIcon, GoogleBooksIcon, GoogleCalendarIcon, @@ -310,6 +311,7 @@ export const blockTypeToIconMap: Record = { gmail_v2: GmailIcon, gong: GongIcon, google_ads: GoogleAdsIcon, + google_appsheet: GoogleAppsheetIcon, google_bigquery: GoogleBigQueryIcon, google_books: GoogleBooksIcon, google_calendar_v2: GoogleCalendarIcon, diff --git a/apps/sim/lib/integrations/integrations.json b/apps/sim/lib/integrations/integrations.json index f542ae6daea..d64e5926d1f 100644 --- a/apps/sim/lib/integrations/integrations.json +++ b/apps/sim/lib/integrations/integrations.json @@ -6181,6 +6181,41 @@ "integrationType": "analytics", "tags": ["marketing", "google-workspace", "data-analytics"] }, + { + "type": "google_appsheet", + "slug": "google-appsheet", + "name": "Google AppSheet", + "description": "Read, add, edit, and delete rows in a Google AppSheet table", + "longDescription": "Integrate Google AppSheet into your workflow. Find, add, edit, and delete rows in an AppSheet table using the AppSheet API. Requires an AppSheet Enterprise plan with the API enabled and an Application Access Key.", + "bgColor": "#FFFFFF", + "iconName": "GoogleAppsheetIcon", + "docsUrl": "https://docs.sim.ai/integrations/google_appsheet", + "operations": [ + { + "name": "Find Rows", + "description": "Read rows from an AppSheet table. Omit the selector to return every row, or provide a Selector expression (Filter/Select/OrderBy/Top) to narrow and shape the results." + }, + { + "name": "Add Rows", + "description": "Add new rows to an AppSheet table. The key column value must be provided explicitly, or omitted when its Initial value expression generates it automatically (e.g. UNIQUEID())." + }, + { + "name": "Edit Rows", + "description": "Update existing rows in an AppSheet table. Each row must explicitly include the key column name and value, plus any columns to change." + }, + { + "name": "Delete Rows", + "description": "Delete rows from an AppSheet table. Each row only needs to include the key column name and value." + } + ], + "operationCount": 4, + "triggers": [], + "triggerCount": 0, + "authType": "api-key", + "category": "tools", + "integrationType": "databases", + "tags": ["spreadsheet", "automation", "google-workspace"] + }, { "type": "google_bigquery", "slug": "google-bigquery", diff --git a/apps/sim/tools/google_appsheet/add_rows.ts b/apps/sim/tools/google_appsheet/add_rows.ts new file mode 100644 index 00000000000..d40e162ede8 --- /dev/null +++ b/apps/sim/tools/google_appsheet/add_rows.ts @@ -0,0 +1,102 @@ +import type { + GoogleAppsheetAddParams, + GoogleAppsheetAddResponse, +} from '@/tools/google_appsheet/types' +import { buildAppsheetActionUrl } from '@/tools/google_appsheet/utils' +import type { ToolConfig } from '@/tools/types' + +export const googleAppsheetAddRowsTool: ToolConfig< + GoogleAppsheetAddParams, + GoogleAppsheetAddResponse +> = { + id: 'google_appsheet_add_rows', + name: 'AppSheet Add Rows', + description: + 'Add new rows to an AppSheet table. The key column value must be provided explicitly, or omitted when its Initial value expression generates it automatically (e.g. UNIQUEID()).', + version: '1.0.0', + + params: { + apiKey: { + type: 'string', + required: true, + visibility: 'user-only', + description: 'AppSheet Application Access Key', + }, + appId: { + type: 'string', + required: true, + visibility: 'user-or-llm', + description: 'AppSheet app ID (found in App > Settings > Integrations > IN)', + }, + tableName: { + type: 'string', + required: true, + visibility: 'user-or-llm', + description: 'Name of the table to add rows to', + }, + region: { + type: 'string', + required: false, + visibility: 'user-only', + description: 'AppSheet region subdomain: "www" (global, default), "eu", or "asia-southeast"', + }, + rows: { + type: 'json', + required: true, + visibility: 'user-or-llm', + description: + 'Array of row objects to add, each a column-name/value map, e.g. [{ "FirstName": "Jan", "LastName": "Jones" }]', + }, + }, + + request: { + url: (params) => buildAppsheetActionUrl(params.appId, params.tableName, params.region), + method: 'POST', + headers: (params) => ({ + ApplicationAccessKey: params.apiKey, + 'Content-Type': 'application/json', + }), + body: (params) => ({ + Action: 'Add', + Properties: {}, + Rows: params.rows, + }), + }, + + transformResponse: async (response: Response) => { + const data = await response.json() + + if (!response.ok) { + throw new Error(data.error?.message || data.message || 'Failed to add AppSheet rows') + } + + const rows = data.Rows ?? data.rows ?? [] + + return { + success: true, + output: { + rows, + metadata: { + rowCount: rows.length, + }, + }, + } + }, + + outputs: { + rows: { + type: 'array', + description: 'Rows added by AppSheet, including any generated key values', + items: { + type: 'object', + }, + }, + metadata: { + type: 'json', + description: 'Operation metadata', + properties: { + rowCount: { type: 'number', description: 'Number of rows added' }, + }, + }, + }, +} diff --git a/apps/sim/tools/google_appsheet/delete_rows.ts b/apps/sim/tools/google_appsheet/delete_rows.ts new file mode 100644 index 00000000000..aa3c243082d --- /dev/null +++ b/apps/sim/tools/google_appsheet/delete_rows.ts @@ -0,0 +1,102 @@ +import type { + GoogleAppsheetDeleteParams, + GoogleAppsheetDeleteResponse, +} from '@/tools/google_appsheet/types' +import { buildAppsheetActionUrl } from '@/tools/google_appsheet/utils' +import type { ToolConfig } from '@/tools/types' + +export const googleAppsheetDeleteRowsTool: ToolConfig< + GoogleAppsheetDeleteParams, + GoogleAppsheetDeleteResponse +> = { + id: 'google_appsheet_delete_rows', + name: 'AppSheet Delete Rows', + description: + 'Delete rows from an AppSheet table. Each row only needs to include the key column name and value.', + version: '1.0.0', + + params: { + apiKey: { + type: 'string', + required: true, + visibility: 'user-only', + description: 'AppSheet Application Access Key', + }, + appId: { + type: 'string', + required: true, + visibility: 'user-or-llm', + description: 'AppSheet app ID (found in App > Settings > Integrations > IN)', + }, + tableName: { + type: 'string', + required: true, + visibility: 'user-or-llm', + description: 'Name of the table to delete rows from', + }, + region: { + type: 'string', + required: false, + visibility: 'user-only', + description: 'AppSheet region subdomain: "www" (global, default), "eu", or "asia-southeast"', + }, + rows: { + type: 'json', + required: true, + visibility: 'user-or-llm', + description: + 'Array of row objects identifying rows to delete by key column, e.g. [{ "RowID": "123" }]', + }, + }, + + request: { + url: (params) => buildAppsheetActionUrl(params.appId, params.tableName, params.region), + method: 'POST', + headers: (params) => ({ + ApplicationAccessKey: params.apiKey, + 'Content-Type': 'application/json', + }), + body: (params) => ({ + Action: 'Delete', + Properties: {}, + Rows: params.rows, + }), + }, + + transformResponse: async (response: Response) => { + const data = await response.json() + + if (!response.ok) { + throw new Error(data.error?.message || data.message || 'Failed to delete AppSheet rows') + } + + const rows = data.Rows ?? data.rows ?? [] + + return { + success: true, + output: { + rows, + metadata: { + rowCount: rows.length, + }, + }, + } + }, + + outputs: { + rows: { + type: 'array', + description: 'Rows deleted by AppSheet', + items: { + type: 'object', + }, + }, + metadata: { + type: 'json', + description: 'Operation metadata', + properties: { + rowCount: { type: 'number', description: 'Number of rows deleted' }, + }, + }, + }, +} diff --git a/apps/sim/tools/google_appsheet/edit_rows.ts b/apps/sim/tools/google_appsheet/edit_rows.ts new file mode 100644 index 00000000000..04365547fd1 --- /dev/null +++ b/apps/sim/tools/google_appsheet/edit_rows.ts @@ -0,0 +1,102 @@ +import type { + GoogleAppsheetEditParams, + GoogleAppsheetEditResponse, +} from '@/tools/google_appsheet/types' +import { buildAppsheetActionUrl } from '@/tools/google_appsheet/utils' +import type { ToolConfig } from '@/tools/types' + +export const googleAppsheetEditRowsTool: ToolConfig< + GoogleAppsheetEditParams, + GoogleAppsheetEditResponse +> = { + id: 'google_appsheet_edit_rows', + name: 'AppSheet Edit Rows', + description: + 'Update existing rows in an AppSheet table. Each row must explicitly include the key column name and value, plus any columns to change.', + version: '1.0.0', + + params: { + apiKey: { + type: 'string', + required: true, + visibility: 'user-only', + description: 'AppSheet Application Access Key', + }, + appId: { + type: 'string', + required: true, + visibility: 'user-or-llm', + description: 'AppSheet app ID (found in App > Settings > Integrations > IN)', + }, + tableName: { + type: 'string', + required: true, + visibility: 'user-or-llm', + description: 'Name of the table to update rows in', + }, + region: { + type: 'string', + required: false, + visibility: 'user-only', + description: 'AppSheet region subdomain: "www" (global, default), "eu", or "asia-southeast"', + }, + rows: { + type: 'json', + required: true, + visibility: 'user-or-llm', + description: + 'Array of row objects to update, each including the key column and the columns to change, e.g. [{ "RowID": "123", "Status": "Done" }]', + }, + }, + + request: { + url: (params) => buildAppsheetActionUrl(params.appId, params.tableName, params.region), + method: 'POST', + headers: (params) => ({ + ApplicationAccessKey: params.apiKey, + 'Content-Type': 'application/json', + }), + body: (params) => ({ + Action: 'Edit', + Properties: {}, + Rows: params.rows, + }), + }, + + transformResponse: async (response: Response) => { + const data = await response.json() + + if (!response.ok) { + throw new Error(data.error?.message || data.message || 'Failed to edit AppSheet rows') + } + + const rows = data.Rows ?? data.rows ?? [] + + return { + success: true, + output: { + rows, + metadata: { + rowCount: rows.length, + }, + }, + } + }, + + outputs: { + rows: { + type: 'array', + description: 'Rows updated by AppSheet', + items: { + type: 'object', + }, + }, + metadata: { + type: 'json', + description: 'Operation metadata', + properties: { + rowCount: { type: 'number', description: 'Number of rows updated' }, + }, + }, + }, +} diff --git a/apps/sim/tools/google_appsheet/find_rows.ts b/apps/sim/tools/google_appsheet/find_rows.ts new file mode 100644 index 00000000000..01935788e4c --- /dev/null +++ b/apps/sim/tools/google_appsheet/find_rows.ts @@ -0,0 +1,102 @@ +import type { + GoogleAppsheetFindParams, + GoogleAppsheetFindResponse, +} from '@/tools/google_appsheet/types' +import { buildAppsheetActionUrl } from '@/tools/google_appsheet/utils' +import type { ToolConfig } from '@/tools/types' + +export const googleAppsheetFindRowsTool: ToolConfig< + GoogleAppsheetFindParams, + GoogleAppsheetFindResponse +> = { + id: 'google_appsheet_find_rows', + name: 'AppSheet Find Rows', + description: + 'Read rows from an AppSheet table. Omit the selector to return every row, or provide a Selector expression (Filter/Select/OrderBy/Top) to narrow and shape the results.', + version: '1.0.0', + + params: { + apiKey: { + type: 'string', + required: true, + visibility: 'user-only', + description: 'AppSheet Application Access Key', + }, + appId: { + type: 'string', + required: true, + visibility: 'user-or-llm', + description: 'AppSheet app ID (found in App > Settings > Integrations > IN)', + }, + tableName: { + type: 'string', + required: true, + visibility: 'user-or-llm', + description: 'Name of the table to read from', + }, + region: { + type: 'string', + required: false, + visibility: 'user-only', + description: 'AppSheet region subdomain: "www" (global, default), "eu", or "asia-southeast"', + }, + selector: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: + 'Optional AppSheet expression to filter/sort/limit rows, e.g. Filter(TableName, [Age] >= 21) or Top(OrderBy(Filter(TableName, true), [LastName], true), 10)', + }, + }, + + request: { + url: (params) => buildAppsheetActionUrl(params.appId, params.tableName, params.region), + method: 'POST', + headers: (params) => ({ + ApplicationAccessKey: params.apiKey, + 'Content-Type': 'application/json', + }), + body: (params) => ({ + Action: 'Find', + Properties: params.selector ? { Selector: params.selector } : {}, + Rows: [], + }), + }, + + transformResponse: async (response: Response) => { + const data = await response.json() + + if (!response.ok) { + throw new Error(data.error?.message || data.message || 'Failed to find AppSheet rows') + } + + const rows = data.Rows ?? data.rows ?? [] + + return { + success: true, + output: { + rows, + metadata: { + rowCount: rows.length, + }, + }, + } + }, + + outputs: { + rows: { + type: 'array', + description: 'Matching rows returned by AppSheet', + items: { + type: 'object', + }, + }, + metadata: { + type: 'json', + description: 'Operation metadata', + properties: { + rowCount: { type: 'number', description: 'Number of rows returned' }, + }, + }, + }, +} diff --git a/apps/sim/tools/google_appsheet/index.ts b/apps/sim/tools/google_appsheet/index.ts new file mode 100644 index 00000000000..d0737550262 --- /dev/null +++ b/apps/sim/tools/google_appsheet/index.ts @@ -0,0 +1,13 @@ +import { googleAppsheetAddRowsTool } from '@/tools/google_appsheet/add_rows' +import { googleAppsheetDeleteRowsTool } from '@/tools/google_appsheet/delete_rows' +import { googleAppsheetEditRowsTool } from '@/tools/google_appsheet/edit_rows' +import { googleAppsheetFindRowsTool } from '@/tools/google_appsheet/find_rows' + +export { + googleAppsheetAddRowsTool, + googleAppsheetDeleteRowsTool, + googleAppsheetEditRowsTool, + googleAppsheetFindRowsTool, +} + +export * from './types' diff --git a/apps/sim/tools/google_appsheet/types.ts b/apps/sim/tools/google_appsheet/types.ts new file mode 100644 index 00000000000..fcb523dd527 --- /dev/null +++ b/apps/sim/tools/google_appsheet/types.ts @@ -0,0 +1,72 @@ +import type { ToolResponse } from '@/tools/types' + +interface GoogleAppsheetBaseParams { + apiKey: string + appId: string + tableName: string + region?: string +} + +export type GoogleAppsheetRow = Record + +// Find Rows Types +export interface GoogleAppsheetFindParams extends GoogleAppsheetBaseParams { + selector?: string +} + +export interface GoogleAppsheetFindResponse extends ToolResponse { + output: { + rows: GoogleAppsheetRow[] + metadata: { + rowCount: number + } + } +} + +// Add Rows Types +export interface GoogleAppsheetAddParams extends GoogleAppsheetBaseParams { + rows: GoogleAppsheetRow[] +} + +export interface GoogleAppsheetAddResponse extends ToolResponse { + output: { + rows: GoogleAppsheetRow[] + metadata: { + rowCount: number + } + } +} + +// Edit Rows Types +export interface GoogleAppsheetEditParams extends GoogleAppsheetBaseParams { + rows: GoogleAppsheetRow[] +} + +export interface GoogleAppsheetEditResponse extends ToolResponse { + output: { + rows: GoogleAppsheetRow[] + metadata: { + rowCount: number + } + } +} + +// Delete Rows Types +export interface GoogleAppsheetDeleteParams extends GoogleAppsheetBaseParams { + rows: GoogleAppsheetRow[] +} + +export interface GoogleAppsheetDeleteResponse extends ToolResponse { + output: { + rows: GoogleAppsheetRow[] + metadata: { + rowCount: number + } + } +} + +export type GoogleAppsheetResponse = + | GoogleAppsheetFindResponse + | GoogleAppsheetAddResponse + | GoogleAppsheetEditResponse + | GoogleAppsheetDeleteResponse diff --git a/apps/sim/tools/google_appsheet/utils.ts b/apps/sim/tools/google_appsheet/utils.ts new file mode 100644 index 00000000000..d2e11650d06 --- /dev/null +++ b/apps/sim/tools/google_appsheet/utils.ts @@ -0,0 +1,10 @@ +const DEFAULT_REGION = 'www' + +/** + * Builds the AppSheet API Action endpoint URL for a given app/table/region. + * Region defaults to the global `www.appsheet.com` domain when unset. + */ +export function buildAppsheetActionUrl(appId: string, tableName: string, region?: string): string { + const host = `${(region || DEFAULT_REGION).trim()}.appsheet.com` + return `https://${host}/api/v2/apps/${appId.trim()}/tables/${encodeURIComponent(tableName.trim())}/Action` +} diff --git a/apps/sim/tools/registry.ts b/apps/sim/tools/registry.ts index b947a88a56b..c293f27acf2 100644 --- a/apps/sim/tools/registry.ts +++ b/apps/sim/tools/registry.ts @@ -1257,6 +1257,12 @@ import { googleAdsListCustomersTool, googleAdsSearchTool, } from '@/tools/google_ads' +import { + googleAppsheetAddRowsTool, + googleAppsheetDeleteRowsTool, + googleAppsheetEditRowsTool, + googleAppsheetFindRowsTool, +} from '@/tools/google_appsheet' import { googleBigQueryGetTableTool, googleBigQueryInsertRowsTool, @@ -7560,6 +7566,10 @@ export const tools: Record = { google_ads_campaign_performance: googleAdsCampaignPerformanceTool, google_ads_list_ad_groups: googleAdsListAdGroupsTool, google_ads_ad_performance: googleAdsAdPerformanceTool, + google_appsheet_find_rows: googleAppsheetFindRowsTool, + google_appsheet_add_rows: googleAppsheetAddRowsTool, + google_appsheet_edit_rows: googleAppsheetEditRowsTool, + google_appsheet_delete_rows: googleAppsheetDeleteRowsTool, google_bigquery_query: googleBigQueryQueryTool, google_bigquery_list_datasets: googleBigQueryListDatasetsTool, google_bigquery_list_tables: googleBigQueryListTablesTool, From 19069165c7cde3a3adb5d065f9811fd55327b676 Mon Sep 17 00:00:00 2001 From: waleed Date: Thu, 2 Jul 2026 11:32:22 -0700 Subject: [PATCH 2/5] improvement(google-appsheet): harden response parsing, add wand config and skills - Guard against empty/non-JSON AppSheet response bodies (Delete may return no body) - Add wandConfig to the Selector field for AI-assisted expression generation - Add 3 skills grounded in attested AppSheet/Zapier automation patterns - Tighten json output descriptions to describe inner shape --- apps/sim/blocks/blocks/google_appsheet.ts | 42 ++++++++++++++++++- apps/sim/tools/google_appsheet/add_rows.ts | 4 +- apps/sim/tools/google_appsheet/delete_rows.ts | 4 +- apps/sim/tools/google_appsheet/edit_rows.ts | 4 +- apps/sim/tools/google_appsheet/find_rows.ts | 4 +- apps/sim/tools/google_appsheet/utils.ts | 16 +++++++ 6 files changed, 64 insertions(+), 10 deletions(-) diff --git a/apps/sim/blocks/blocks/google_appsheet.ts b/apps/sim/blocks/blocks/google_appsheet.ts index 954bdfb5d2f..0091a9e11cb 100644 --- a/apps/sim/blocks/blocks/google_appsheet.ts +++ b/apps/sim/blocks/blocks/google_appsheet.ts @@ -52,6 +52,19 @@ export const GoogleAppsheetBlock: BlockConfig = { 'Optional expression, e.g. Filter(Orders, [Status] = "Open") or Top(OrderBy(Filter(Orders, true), [Date], true), 10)', condition: { field: 'operation', value: 'google_appsheet_find_rows' }, mode: 'advanced', + wandConfig: { + enabled: true, + prompt: `Generate an AppSheet Selector expression based on the user's description. The table name in the expression is a placeholder - use the literal word matching the table being queried. + +Format examples: +- Filter(TableName, [Status] = "Open") +- Filter(TableName, AND([Age] >= 21, [State] = "CA")) +- OrderBy(Filter(TableName, true), [LastName], true) +- Top(OrderBy(Filter(TableName, true), [Date], true), 10) + +Return ONLY the Selector expression - no explanations, no quotes around the entire expression.`, + placeholder: 'Describe the filter/sort criteria (e.g., "open orders sorted by date")...', + }, }, // Add/Edit/Delete Rows operation inputs (shared JSON array field) { @@ -155,8 +168,11 @@ Return ONLY the valid JSON array - no explanations, no markdown.`, }, outputs: { - rows: { type: 'json', description: 'Rows returned by the AppSheet operation' }, - metadata: { type: 'json', description: 'Operation metadata, including row count' }, + rows: { + type: 'json', + description: 'Rows returned by the AppSheet operation: [{ columnName: value, ... }]', + }, + metadata: { type: 'json', description: 'Operation metadata: { rowCount: number }' }, }, } @@ -232,4 +248,26 @@ export const GoogleAppsheetBlockMeta = { tags: ['automation', 'analysis'], }, ], + skills: [ + { + name: 'add-appsheet-row', + description: 'Add a new row to an AppSheet table in response to an external event.', + content: + '# Add AppSheet Row\n\nCreate a new row in an AppSheet table, e.g. when a form is submitted or an external event fires.\n\n## Steps\n1. Set App ID and Table Name for the target table.\n2. Provide the Rows JSON array with one object per new row, e.g. `[{ "FirstName": "Jan", "LastName": "Jones" }]`.\n3. Give the key column an explicit value, or omit it if its Initial value expression (e.g. UNIQUEID()) generates it automatically.\n4. Run the Add Rows operation and confirm the returned row includes the generated key.\n\n## Output\nThe newly created row(s), including any generated key values, plus a row count.', + }, + { + name: 'find-appsheet-rows', + description: + 'Query an AppSheet table with a Selector expression to filter, sort, or limit rows.', + content: + '# Find AppSheet Rows\n\nRead rows from an AppSheet table, optionally filtered and sorted with a Selector expression.\n\n## Steps\n1. Set App ID and Table Name for the target table.\n2. Leave Selector blank to return every row, or provide an expression such as `Filter(TableName, [Status] = "Open")`.\n3. Combine `OrderBy()` and `Top()` to sort and limit results, e.g. `Top(OrderBy(Filter(TableName, true), [Date], true), 10)`.\n4. Run the Find Rows operation.\n\n## Output\nThe matching rows and a row count, ready to feed into an agent or a downstream integration.', + }, + { + name: 'sync-appsheet-updates-to-sheet', + description: + 'Mirror updated AppSheet rows into a Google Sheet to maintain a real-time audit trail.', + content: + '# Sync AppSheet Updates to a Sheet\n\nKeep a Google Sheet in sync with changes to an AppSheet table, mirroring the pattern used in AppSheet-Zapier integrations for audit trails.\n\n## Steps\n1. Use Find Rows with a Selector expression that isolates recently changed rows (e.g. filtered by a LastModified column).\n2. For each row, append or update the corresponding row in a Google Sheet.\n3. Schedule the workflow to run on an interval so the sheet stays current.\n\n## Output\nA Google Sheet that reflects the latest AppSheet row data, useful as a shareable audit trail or reporting source.', + }, + ], } as const satisfies BlockMeta diff --git a/apps/sim/tools/google_appsheet/add_rows.ts b/apps/sim/tools/google_appsheet/add_rows.ts index d40e162ede8..817d26d32f6 100644 --- a/apps/sim/tools/google_appsheet/add_rows.ts +++ b/apps/sim/tools/google_appsheet/add_rows.ts @@ -2,7 +2,7 @@ import type { GoogleAppsheetAddParams, GoogleAppsheetAddResponse, } from '@/tools/google_appsheet/types' -import { buildAppsheetActionUrl } from '@/tools/google_appsheet/utils' +import { buildAppsheetActionUrl, readAppsheetResponseBody } from '@/tools/google_appsheet/utils' import type { ToolConfig } from '@/tools/types' export const googleAppsheetAddRowsTool: ToolConfig< @@ -64,7 +64,7 @@ export const googleAppsheetAddRowsTool: ToolConfig< }, transformResponse: async (response: Response) => { - const data = await response.json() + const data = await readAppsheetResponseBody(response) if (!response.ok) { throw new Error(data.error?.message || data.message || 'Failed to add AppSheet rows') diff --git a/apps/sim/tools/google_appsheet/delete_rows.ts b/apps/sim/tools/google_appsheet/delete_rows.ts index aa3c243082d..a9e47343c68 100644 --- a/apps/sim/tools/google_appsheet/delete_rows.ts +++ b/apps/sim/tools/google_appsheet/delete_rows.ts @@ -2,7 +2,7 @@ import type { GoogleAppsheetDeleteParams, GoogleAppsheetDeleteResponse, } from '@/tools/google_appsheet/types' -import { buildAppsheetActionUrl } from '@/tools/google_appsheet/utils' +import { buildAppsheetActionUrl, readAppsheetResponseBody } from '@/tools/google_appsheet/utils' import type { ToolConfig } from '@/tools/types' export const googleAppsheetDeleteRowsTool: ToolConfig< @@ -64,7 +64,7 @@ export const googleAppsheetDeleteRowsTool: ToolConfig< }, transformResponse: async (response: Response) => { - const data = await response.json() + const data = await readAppsheetResponseBody(response) if (!response.ok) { throw new Error(data.error?.message || data.message || 'Failed to delete AppSheet rows') diff --git a/apps/sim/tools/google_appsheet/edit_rows.ts b/apps/sim/tools/google_appsheet/edit_rows.ts index 04365547fd1..2e1b53be494 100644 --- a/apps/sim/tools/google_appsheet/edit_rows.ts +++ b/apps/sim/tools/google_appsheet/edit_rows.ts @@ -2,7 +2,7 @@ import type { GoogleAppsheetEditParams, GoogleAppsheetEditResponse, } from '@/tools/google_appsheet/types' -import { buildAppsheetActionUrl } from '@/tools/google_appsheet/utils' +import { buildAppsheetActionUrl, readAppsheetResponseBody } from '@/tools/google_appsheet/utils' import type { ToolConfig } from '@/tools/types' export const googleAppsheetEditRowsTool: ToolConfig< @@ -64,7 +64,7 @@ export const googleAppsheetEditRowsTool: ToolConfig< }, transformResponse: async (response: Response) => { - const data = await response.json() + const data = await readAppsheetResponseBody(response) if (!response.ok) { throw new Error(data.error?.message || data.message || 'Failed to edit AppSheet rows') diff --git a/apps/sim/tools/google_appsheet/find_rows.ts b/apps/sim/tools/google_appsheet/find_rows.ts index 01935788e4c..08a74a46b19 100644 --- a/apps/sim/tools/google_appsheet/find_rows.ts +++ b/apps/sim/tools/google_appsheet/find_rows.ts @@ -2,7 +2,7 @@ import type { GoogleAppsheetFindParams, GoogleAppsheetFindResponse, } from '@/tools/google_appsheet/types' -import { buildAppsheetActionUrl } from '@/tools/google_appsheet/utils' +import { buildAppsheetActionUrl, readAppsheetResponseBody } from '@/tools/google_appsheet/utils' import type { ToolConfig } from '@/tools/types' export const googleAppsheetFindRowsTool: ToolConfig< @@ -64,7 +64,7 @@ export const googleAppsheetFindRowsTool: ToolConfig< }, transformResponse: async (response: Response) => { - const data = await response.json() + const data = await readAppsheetResponseBody(response) if (!response.ok) { throw new Error(data.error?.message || data.message || 'Failed to find AppSheet rows') diff --git a/apps/sim/tools/google_appsheet/utils.ts b/apps/sim/tools/google_appsheet/utils.ts index d2e11650d06..bc7331bc6d5 100644 --- a/apps/sim/tools/google_appsheet/utils.ts +++ b/apps/sim/tools/google_appsheet/utils.ts @@ -8,3 +8,19 @@ export function buildAppsheetActionUrl(appId: string, tableName: string, region? const host = `${(region || DEFAULT_REGION).trim()}.appsheet.com` return `https://${host}/api/v2/apps/${appId.trim()}/tables/${encodeURIComponent(tableName.trim())}/Action` } + +/** + * Safely reads an AppSheet API response body. AppSheet does not consistently + * document whether every Action returns a JSON body (e.g. Delete may return an + * empty body on some accounts), so this avoids `response.json()` throwing on + * empty or non-JSON content. + */ +export async function readAppsheetResponseBody(response: Response): Promise> { + const text = await response.text() + if (!text) return {} + try { + return JSON.parse(text) + } catch { + return { message: text } + } +} From 5a46daba02c4ca13e86655c54228e98a19884a94 Mon Sep 17 00:00:00 2001 From: waleed Date: Thu, 2 Jul 2026 11:36:30 -0700 Subject: [PATCH 3/5] fix(google-appsheet): validate region against allow-list, encode appId, validate rows shape - Reject unrecognized region values instead of interpolating them into the request host (a caller could otherwise redirect the Application Access Key to an arbitrary domain) - URL-encode appId, not just tableName, in the Action endpoint path - Reject non-array Rows input in tools.config.params instead of forwarding a single object to the AppSheet Action API - Drop the mismatched json-object generationType on the rows wand config (that enricher appends "must start with { and end with }", which conflicts with the JSON-array shape the field expects) - Add utils.test.ts covering region validation and response-body parsing --- apps/sim/blocks/blocks/google_appsheet.ts | 8 +++- apps/sim/tools/google_appsheet/utils.test.ts | 50 ++++++++++++++++++++ apps/sim/tools/google_appsheet/utils.ts | 16 +++++-- 3 files changed, 69 insertions(+), 5 deletions(-) create mode 100644 apps/sim/tools/google_appsheet/utils.test.ts diff --git a/apps/sim/blocks/blocks/google_appsheet.ts b/apps/sim/blocks/blocks/google_appsheet.ts index 0091a9e11cb..85a11e99236 100644 --- a/apps/sim/blocks/blocks/google_appsheet.ts +++ b/apps/sim/blocks/blocks/google_appsheet.ts @@ -107,7 +107,6 @@ For Delete, include only the key column: Return ONLY the valid JSON array - no explanations, no markdown.`, placeholder: 'Describe the rows to add, edit, or delete...', - generationType: 'json-object', }, }, { @@ -146,11 +145,16 @@ Return ONLY the valid JSON array - no explanations, no markdown.`, const { rows, ...rest } = params const result: Record = { ...rest } if (params.operation !== 'google_appsheet_find_rows' && rows) { + let parsedRows: unknown try { - result.rows = typeof rows === 'string' ? JSON.parse(rows) : rows + parsedRows = typeof rows === 'string' ? JSON.parse(rows) : rows } catch (error: any) { throw new Error(`Invalid JSON in Rows field: ${error.message}`) } + if (!Array.isArray(parsedRows)) { + throw new Error('Rows must be a JSON array of row objects, e.g. [{ "RowID": "123" }]') + } + result.rows = parsedRows } return result }, diff --git a/apps/sim/tools/google_appsheet/utils.test.ts b/apps/sim/tools/google_appsheet/utils.test.ts new file mode 100644 index 00000000000..d23ffd34341 --- /dev/null +++ b/apps/sim/tools/google_appsheet/utils.test.ts @@ -0,0 +1,50 @@ +/** + * @vitest-environment node + */ +import { describe, expect, it } from 'vitest' +import { buildAppsheetActionUrl, readAppsheetResponseBody } from '@/tools/google_appsheet/utils' + +describe('buildAppsheetActionUrl', () => { + it('defaults to the global www region when unset', () => { + expect(buildAppsheetActionUrl('app-1', 'Orders')).toBe( + 'https://www.appsheet.com/api/v2/apps/app-1/tables/Orders/Action' + ) + }) + + it('builds the URL for a valid non-default region', () => { + expect(buildAppsheetActionUrl('app-1', 'Orders', 'eu')).toBe( + 'https://eu.appsheet.com/api/v2/apps/app-1/tables/Orders/Action' + ) + }) + + it('trims and URL-encodes appId and tableName', () => { + expect(buildAppsheetActionUrl(' app 1 ', ' My Table ')).toBe( + 'https://www.appsheet.com/api/v2/apps/app%201/tables/My%20Table/Action' + ) + }) + + it('rejects a region outside the known AppSheet regions', () => { + expect(() => buildAppsheetActionUrl('app-1', 'Orders', 'attacker.example.com')).toThrow( + /Invalid AppSheet region/ + ) + }) +}) + +describe('readAppsheetResponseBody', () => { + it('parses a JSON body', async () => { + const response = new Response('{"Rows":[{"id":"1"}]}') + expect(await readAppsheetResponseBody(response)).toEqual({ Rows: [{ id: '1' }] }) + }) + + it('returns an empty object for an empty body', async () => { + const response = new Response('') + expect(await readAppsheetResponseBody(response)).toEqual({}) + }) + + it('wraps a non-JSON body as a message instead of throwing', async () => { + const response = new Response('502 Bad Gateway') + expect(await readAppsheetResponseBody(response)).toEqual({ + message: '502 Bad Gateway', + }) + }) +}) diff --git a/apps/sim/tools/google_appsheet/utils.ts b/apps/sim/tools/google_appsheet/utils.ts index bc7331bc6d5..dc635e1f0d8 100644 --- a/apps/sim/tools/google_appsheet/utils.ts +++ b/apps/sim/tools/google_appsheet/utils.ts @@ -1,12 +1,22 @@ const DEFAULT_REGION = 'www' +const ALLOWED_REGIONS = new Set(['www', 'eu', 'asia-southeast']) /** * Builds the AppSheet API Action endpoint URL for a given app/table/region. - * Region defaults to the global `www.appsheet.com` domain when unset. + * Region defaults to the global `www.appsheet.com` domain when unset, and is + * validated against the known AppSheet regions since it is interpolated into + * the request host — an unvalidated value would let a caller redirect the + * Application Access Key to an arbitrary host. */ export function buildAppsheetActionUrl(appId: string, tableName: string, region?: string): string { - const host = `${(region || DEFAULT_REGION).trim()}.appsheet.com` - return `https://${host}/api/v2/apps/${appId.trim()}/tables/${encodeURIComponent(tableName.trim())}/Action` + const trimmedRegion = (region || DEFAULT_REGION).trim() + if (!ALLOWED_REGIONS.has(trimmedRegion)) { + throw new Error( + `Invalid AppSheet region "${trimmedRegion}". Must be one of: ${Array.from(ALLOWED_REGIONS).join(', ')}.` + ) + } + const host = `${trimmedRegion}.appsheet.com` + return `https://${host}/api/v2/apps/${encodeURIComponent(appId.trim())}/tables/${encodeURIComponent(tableName.trim())}/Action` } /** From e457e94676fdb2f6d9795712ef730ece7838ee81 Mon Sep 17 00:00:00 2001 From: waleed Date: Thu, 2 Jul 2026 11:52:51 -0700 Subject: [PATCH 4/5] docs(google-appsheet): add manual intro/getting-started section MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Match the MANUAL-CONTENT convention used by other integration docs (Airtable, Ahrefs, Google PageSpeed) — an overview of the service, what the Sim integration lets agents do, and how to get an Application Access Key. --- .../docs/en/integrations/google_appsheet.mdx | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/apps/docs/content/docs/en/integrations/google_appsheet.mdx b/apps/docs/content/docs/en/integrations/google_appsheet.mdx index 745c8a524a7..3b34ac1095b 100644 --- a/apps/docs/content/docs/en/integrations/google_appsheet.mdx +++ b/apps/docs/content/docs/en/integrations/google_appsheet.mdx @@ -10,6 +10,32 @@ import { BlockInfoCard } from "@/components/ui/block-info-card" color="#FFFFFF" /> +{/* MANUAL-CONTENT-START:intro */} +[Google AppSheet](https://about.appsheet.com/) is Google's no-code app development platform that lets teams turn spreadsheets and databases into mobile and web apps, backed by data sources like Google Sheets, Excel, and cloud databases. + +With the Google AppSheet integration in Sim, you can: + +- **Find rows**: Query a table with an optional Selector expression (`Filter`, `OrderBy`, `Top`, and more) to narrow, sort, and limit the rows returned +- **Add rows**: Insert new rows into a table, letting AppSheet generate the key column automatically or providing it explicitly +- **Edit rows**: Update existing rows by key column, changing only the fields that need to change +- **Delete rows**: Remove rows from a table by key column + +In Sim, the Google AppSheet integration enables your agents to read and write AppSheet app data as part of automated workflows — syncing order intake, routing leads, escalating tickets, or keeping a table in sync with another system, all without touching the AppSheet editor. + +### Getting Your Application Access Key + +Google AppSheet authenticates with a static Application Access Key rather than OAuth: + +1. Open your app in the [AppSheet editor](https://www.appsheet.com/) +2. Go to **Settings > Integrations** +3. Enable **IN: from cloud services to your app** +4. Under **Application Access Keys**, create a key (or use an existing one) and copy it +5. Use the Application Access Key, along with your App ID and table name, in the Sim block configuration + +The AppSheet API requires an Enterprise plan. +{/* MANUAL-CONTENT-END */} + + ## Usage Instructions Integrate Google AppSheet into your workflow. Find, add, edit, and delete rows in an AppSheet table using the AppSheet API. Requires an AppSheet Enterprise plan with the API enabled and an Application Access Key. From 3d8b8ee2f4ad6c793d2748d03ee32f9337b67d7b Mon Sep 17 00:00:00 2001 From: waleed Date: Thu, 2 Jul 2026 11:53:51 -0700 Subject: [PATCH 5/5] docs: sync generated integration docs with current source Regenerate docs for integrations whose tools/blocks changed upstream without a matching docs regen (ahrefs, algolia, amplitude, brex, clerk, gong, hex, langsmith, loops, onepassword, sendgrid, sharepoint, similarweb, supabase, tailscale, trello, vercel, wordpress), plus the integrations.json catalog. --- .../content/docs/en/integrations/ahrefs.mdx | 169 ++-- .../content/docs/en/integrations/algolia.mdx | 2 +- .../docs/en/integrations/amplitude.mdx | 99 +- .../content/docs/en/integrations/brex.mdx | 5 + .../content/docs/en/integrations/clerk.mdx | 855 +++++++++++++++++- .../content/docs/en/integrations/gong.mdx | 101 +++ .../docs/content/docs/en/integrations/hex.mdx | 139 ++- .../docs/en/integrations/langsmith.mdx | 77 ++ .../content/docs/en/integrations/loops.mdx | 74 +- .../docs/en/integrations/onepassword.mdx | 136 ++- .../content/docs/en/integrations/sendgrid.mdx | 11 +- .../docs/en/integrations/sharepoint.mdx | 171 +++- .../docs/en/integrations/similarweb.mdx | 28 + .../content/docs/en/integrations/supabase.mdx | 79 +- .../docs/en/integrations/tailscale.mdx | 88 +- .../content/docs/en/integrations/trello.mdx | 186 +++- .../content/docs/en/integrations/vercel.mdx | 79 +- .../docs/en/integrations/wordpress.mdx | 167 +++- apps/sim/lib/integrations/integrations.json | 391 +++++++- 19 files changed, 2714 insertions(+), 143 deletions(-) diff --git a/apps/docs/content/docs/en/integrations/ahrefs.mdx b/apps/docs/content/docs/en/integrations/ahrefs.mdx index c05bf0c8ebd..92d278e9fab 100644 --- a/apps/docs/content/docs/en/integrations/ahrefs.mdx +++ b/apps/docs/content/docs/en/integrations/ahrefs.mdx @@ -52,6 +52,34 @@ Get the Domain Rating (DR) and Ahrefs Rank for a target domain. Domain Rating sh | `domainRating` | number | Domain Rating score \(0-100\) | | `ahrefsRank` | number | Ahrefs Rank - global ranking based on backlink profile strength | +### `ahrefs_metrics` + +Get a one-call organic and paid search overview for a target domain or URL: organic traffic, organic keywords, paid traffic, paid keywords, and estimated traffic cost. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `target` | string | Yes | The target domain or URL to analyze. Example: "example.com" | +| `country` | string | No | Country code for traffic data. Example: "us", "gb", "de" | +| `mode` | string | No | Analysis mode: domain \(entire domain\), prefix \(URL prefix\), subdomains \(include all subdomains, default\), exact \(exact URL match\). Example: "domain" | +| `date` | string | No | Date to report metrics on, in YYYY-MM-DD format \(defaults to today\) | +| `apiKey` | string | Yes | Ahrefs API Key | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `metrics` | object | Organic and paid search overview | +| ↳ `organicTraffic` | number | Estimated monthly organic traffic | +| ↳ `organicKeywords` | number | Number of organic keywords ranked | +| ↳ `organicKeywordsTop3` | number | Number of organic keywords ranking in positions 1-3 | +| ↳ `organicCost` | number | Estimated monthly cost to replicate organic traffic via ads \(USD\) | +| ↳ `paidTraffic` | number | Estimated monthly paid search traffic | +| ↳ `paidKeywords` | number | Number of paid keywords targeted | +| ↳ `paidPages` | number | Number of pages receiving paid traffic | +| ↳ `paidCost` | number | Estimated monthly paid search spend \(USD\) | + ### `ahrefs_backlinks` Get a list of backlinks pointing to a target domain or URL. Returns details about each backlink including source URL, anchor text, and domain rating. @@ -61,10 +89,9 @@ Get a list of backlinks pointing to a target domain or URL. Returns details abou | Parameter | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `target` | string | Yes | The target domain or URL to analyze. Example: "example.com" or "https://example.com/page" | -| `mode` | string | No | Analysis mode: domain \(entire domain\), prefix \(URL prefix\), subdomains \(include all subdomains\), exact \(exact URL match\). Example: "domain" | -| `date` | string | No | Date for historical data in YYYY-MM-DD format \(defaults to today\) | -| `limit` | number | No | Maximum number of results to return. Example: 50 \(default: 100\) | -| `offset` | number | No | Number of results to skip for pagination. Example: 100 | +| `mode` | string | No | Analysis mode: domain \(entire domain\), prefix \(URL prefix\), subdomains \(include all subdomains, default\), exact \(exact URL match\). Example: "domain" | +| `history` | string | No | Historical scope: "live" \(currently live backlinks\), "all_time" \(default, includes lost backlinks\), or "since:YYYY-MM-DD" \(backlinks found since a date\). | +| `limit` | number | No | Maximum number of results to return. Example: 50 \(default: 1000\) | | `apiKey` | string | Yes | Ahrefs API Key | #### Output @@ -82,28 +109,26 @@ Get a list of backlinks pointing to a target domain or URL. Returns details abou ### `ahrefs_backlinks_stats` -Get backlink statistics for a target domain or URL. Returns totals for different backlink types including dofollow, nofollow, text, image, and redirect links. +Get backlink and referring domain totals for a target domain or URL, both currently live and across all time. #### Input | Parameter | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `target` | string | Yes | The target domain or URL to analyze. Example: "example.com" or "https://example.com/page" | -| `mode` | string | No | Analysis mode: domain \(entire domain\), prefix \(URL prefix\), subdomains \(include all subdomains\), exact \(exact URL match\). Example: "domain" | -| `date` | string | No | Date for historical data in YYYY-MM-DD format \(defaults to today\) | +| `mode` | string | No | Analysis mode: domain \(entire domain\), prefix \(URL prefix\), subdomains \(include all subdomains, default\), exact \(exact URL match\). Example: "domain" | +| `date` | string | No | Date to report metrics on, in YYYY-MM-DD format \(defaults to today\) | | `apiKey` | string | Yes | Ahrefs API Key | #### Output | Parameter | Type | Description | | --------- | ---- | ----------- | -| `stats` | object | Backlink statistics summary | -| ↳ `total` | number | Total number of live backlinks | -| ↳ `dofollow` | number | Number of dofollow backlinks | -| ↳ `nofollow` | number | Number of nofollow backlinks | -| ↳ `text` | number | Number of text backlinks | -| ↳ `image` | number | Number of image backlinks | -| ↳ `redirect` | number | Number of redirect backlinks | +| `stats` | object | Backlink and referring domain totals | +| ↳ `liveBacklinks` | number | Number of currently live backlinks | +| ↳ `liveReferringDomains` | number | Number of currently live referring domains | +| ↳ `allTimeBacklinks` | number | Total backlinks ever discovered, including lost ones | +| ↳ `allTimeReferringDomains` | number | Total referring domains ever discovered, including lost ones | ### `ahrefs_referring_domains` @@ -114,10 +139,9 @@ Get a list of domains that link to a target domain or URL. Returns unique referr | Parameter | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `target` | string | Yes | The target domain or URL to analyze. Example: "example.com" or "https://example.com/page" | -| `mode` | string | No | Analysis mode: domain \(entire domain\), prefix \(URL prefix\), subdomains \(include all subdomains\), exact \(exact URL match\). Example: "domain" | -| `date` | string | No | Date for historical data in YYYY-MM-DD format \(defaults to today\) | -| `limit` | number | No | Maximum number of results to return. Example: 50 \(default: 100\) | -| `offset` | number | No | Number of results to skip for pagination. Example: 100 | +| `mode` | string | No | Analysis mode: domain \(entire domain\), prefix \(URL prefix\), subdomains \(include all subdomains, default\), exact \(exact URL match\). Example: "domain" | +| `history` | string | No | Historical scope: "live" \(currently live\), "all_time" \(default, includes lost domains\), or "since:YYYY-MM-DD" \(domains found since a date\). | +| `limit` | number | No | Maximum number of results to return. Example: 50 \(default: 1000\) | | `apiKey` | string | Yes | Ahrefs API Key | #### Output @@ -127,10 +151,34 @@ Get a list of domains that link to a target domain or URL. Returns unique referr | `referringDomains` | array | List of domains linking to the target | | ↳ `domain` | string | The referring domain | | ↳ `domainRating` | number | Domain Rating of the referring domain | -| ↳ `backlinks` | number | Total number of backlinks from this domain | +| ↳ `backlinks` | number | Total number of backlinks from this domain to the target | | ↳ `dofollowBacklinks` | number | Number of dofollow backlinks from this domain | | ↳ `firstSeen` | string | When the domain was first seen linking | -| ↳ `lastVisited` | string | When the domain was last checked | +| ↳ `lastVisited` | string | When the domain was last seen linking \(null if never re-crawled\) | + +### `ahrefs_broken_backlinks` + +Get a list of broken backlinks pointing to a target domain or URL. Useful for identifying link reclamation opportunities. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `target` | string | Yes | The target domain or URL to analyze. Example: "example.com" or "https://example.com/page" | +| `mode` | string | No | Analysis mode: domain \(entire domain\), prefix \(URL prefix\), subdomains \(include all subdomains, default\), exact \(exact URL match\). Example: "domain" | +| `limit` | number | No | Maximum number of results to return. Example: 50 \(default: 1000\) | +| `apiKey` | string | Yes | Ahrefs API Key | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `brokenBacklinks` | array | List of broken backlinks | +| ↳ `urlFrom` | string | The URL of the page containing the broken link | +| ↳ `urlTo` | string | The broken URL being linked to | +| ↳ `httpCode` | number | HTTP status code of the broken target URL \(e.g., 404, 410\) | +| ↳ `anchor` | string | The anchor text of the link | +| ↳ `domainRatingSource` | number | Domain Rating of the linking domain | ### `ahrefs_organic_keywords` @@ -142,10 +190,9 @@ Get organic keywords that a target domain or URL ranks for in Google search resu | --------- | ---- | -------- | ----------- | | `target` | string | Yes | The target domain or URL to analyze. Example: "example.com" or "https://example.com/page" | | `country` | string | No | Country code for search results. Example: "us", "gb", "de" \(default: "us"\) | -| `mode` | string | No | Analysis mode: domain \(entire domain\), prefix \(URL prefix\), subdomains \(include all subdomains\), exact \(exact URL match\). Example: "domain" | -| `date` | string | No | Date for historical data in YYYY-MM-DD format \(defaults to today\) | -| `limit` | number | No | Maximum number of results to return. Example: 50 \(default: 100\) | -| `offset` | number | No | Number of results to skip for pagination. Example: 100 | +| `mode` | string | No | Analysis mode: domain \(entire domain\), prefix \(URL prefix\), subdomains \(include all subdomains, default\), exact \(exact URL match\). Example: "domain" | +| `date` | string | No | Date to report metrics on, in YYYY-MM-DD format \(defaults to today\) | +| `limit` | number | No | Maximum number of results to return. Example: 50 \(default: 1000\) | | `apiKey` | string | Yes | Ahrefs API Key | #### Output @@ -155,11 +202,38 @@ Get organic keywords that a target domain or URL ranks for in Google search resu | `keywords` | array | List of organic keywords the target ranks for | | ↳ `keyword` | string | The keyword | | ↳ `volume` | number | Monthly search volume | -| ↳ `position` | number | Current ranking position | -| ↳ `url` | string | The URL that ranks for this keyword | +| ↳ `position` | number | Best ranking position for this keyword | +| ↳ `url` | string | The URL that ranks at the best position for this keyword | | ↳ `traffic` | number | Estimated monthly organic traffic | | ↳ `keywordDifficulty` | number | Keyword difficulty score \(0-100\) | +### `ahrefs_organic_competitors` + +Get domains that compete with a target domain or URL for the same organic keywords, ranked by keyword overlap. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `target` | string | Yes | The target domain or URL to analyze. Example: "example.com" | +| `country` | string | No | Country code for search results. Example: "us", "gb", "de" \(default: "us"\) | +| `mode` | string | No | Analysis mode: domain \(entire domain\), prefix \(URL prefix\), subdomains \(include all subdomains, default\), exact \(exact URL match\). Example: "domain" | +| `date` | string | No | Date to report metrics on, in YYYY-MM-DD format \(defaults to today\) | +| `limit` | number | No | Maximum number of results to return. Example: 50 \(default: 1000\) | +| `apiKey` | string | Yes | Ahrefs API Key | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `competitors` | array | List of organic search competitors ranked by keyword overlap | +| ↳ `domain` | string | The competitor domain | +| ↳ `domainRating` | number | Domain Rating of the competitor | +| ↳ `commonKeywords` | number | Number of keywords the competitor and target both rank for | +| ↳ `targetKeywords` | number | Number of keywords the target ranks for | +| ↳ `competitorKeywords` | number | Number of keywords the competitor ranks for | +| ↳ `traffic` | number | Estimated monthly organic traffic for the competitor | + ### `ahrefs_top_pages` Get the top pages of a target domain sorted by organic traffic. Returns page URLs with their traffic, keyword counts, and estimated traffic value. @@ -170,11 +244,9 @@ Get the top pages of a target domain sorted by organic traffic. Returns page URL | --------- | ---- | -------- | ----------- | | `target` | string | Yes | The target domain to analyze. Example: "example.com" | | `country` | string | No | Country code for traffic data. Example: "us", "gb", "de" \(default: "us"\) | -| `mode` | string | No | Analysis mode: domain \(entire domain\), prefix \(URL prefix\), subdomains \(include all subdomains\). Example: "domain" | -| `date` | string | No | Date for historical data in YYYY-MM-DD format \(defaults to today\) | -| `limit` | number | No | Maximum number of results to return. Example: 50 \(default: 100\) | -| `offset` | number | No | Number of results to skip for pagination. Example: 100 | -| `select` | string | No | Comma-separated list of fields to return \(e.g., url,traffic,keywords,top_keyword,value\). Default: url,traffic,keywords,top_keyword,value | +| `mode` | string | No | Analysis mode: domain \(entire domain\), prefix \(URL prefix\), subdomains \(include all subdomains, default\). Example: "domain" | +| `date` | string | No | Date to report metrics on, in YYYY-MM-DD format \(defaults to today\) | +| `limit` | number | No | Maximum number of results to return. Example: 50 \(default: 1000\) | | `apiKey` | string | Yes | Ahrefs API Key | #### Output @@ -210,34 +282,15 @@ Get detailed metrics for a keyword including search volume, keyword difficulty, | ↳ `keywordDifficulty` | number | Keyword difficulty score \(0-100\) | | ↳ `cpc` | number | Cost per click in USD | | ↳ `clicks` | number | Estimated clicks per month | -| ↳ `clicksPercentage` | number | Percentage of searches that result in clicks | +| ↳ `clicksPercentage` | number | Percentage of searches that result in an organic click | | ↳ `parentTopic` | string | The parent topic for this keyword | | ↳ `trafficPotential` | number | Estimated traffic potential if ranking #1 | - -### `ahrefs_broken_backlinks` - -Get a list of broken backlinks pointing to a target domain or URL. Useful for identifying link reclamation opportunities. - -#### Input - -| Parameter | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `target` | string | Yes | The target domain or URL to analyze. Example: "example.com" or "https://example.com/page" | -| `mode` | string | No | Analysis mode: domain \(entire domain\), prefix \(URL prefix\), subdomains \(include all subdomains\), exact \(exact URL match\). Example: "domain" | -| `date` | string | No | Date for historical data in YYYY-MM-DD format \(defaults to today\) | -| `limit` | number | No | Maximum number of results to return. Example: 50 \(default: 100\) | -| `offset` | number | No | Number of results to skip for pagination. Example: 100 | -| `apiKey` | string | Yes | Ahrefs API Key | - -#### Output - -| Parameter | Type | Description | -| --------- | ---- | ----------- | -| `brokenBacklinks` | array | List of broken backlinks | -| ↳ `urlFrom` | string | The URL of the page containing the broken link | -| ↳ `urlTo` | string | The broken URL being linked to | -| ↳ `httpCode` | number | HTTP status code \(e.g., 404, 410\) | -| ↳ `anchor` | string | The anchor text of the link | -| ↳ `domainRatingSource` | number | Domain Rating of the linking domain | +| ↳ `intents` | object | Search intent flags \(informational, navigational, commercial, transactional, branded, local\) | +| ↳ `informational` | boolean | Query seeks information | +| ↳ `navigational` | boolean | Query seeks a specific site or page | +| ↳ `commercial` | boolean | Query researches a purchase decision | +| ↳ `transactional` | boolean | Query intends to complete a purchase | +| ↳ `branded` | boolean | Query references a specific brand | +| ↳ `local` | boolean | Query seeks local results | diff --git a/apps/docs/content/docs/en/integrations/algolia.mdx b/apps/docs/content/docs/en/integrations/algolia.mdx index 9d506105db4..72a4039b141 100644 --- a/apps/docs/content/docs/en/integrations/algolia.mdx +++ b/apps/docs/content/docs/en/integrations/algolia.mdx @@ -235,7 +235,7 @@ Perform batch add, update, partial update, or delete operations on records in an | `applicationId` | string | Yes | Algolia Application ID | | `apiKey` | string | Yes | Algolia Admin API Key | | `indexName` | string | Yes | Name of the Algolia index | -| `requests` | json | Yes | Array of batch operations. Each item has "action" \(addObject, updateObject, partialUpdateObject, partialUpdateObjectNoCreate, deleteObject, delete, clear\) and "body" \(the record data, must include objectID for update/delete; omit body for delete/clear\) | +| `requests` | json | Yes | Array of batch operations. Each item has "action" \(addObject, updateObject, partialUpdateObject, partialUpdateObjectNoCreate, deleteObject, delete, clear\) and "body" \(the record data; must include objectID for update/delete; use an empty object \{\} for the index-level delete/clear actions\) | #### Output diff --git a/apps/docs/content/docs/en/integrations/amplitude.mdx b/apps/docs/content/docs/en/integrations/amplitude.mdx index 45a806b31f6..53d0b88dc78 100644 --- a/apps/docs/content/docs/en/integrations/amplitude.mdx +++ b/apps/docs/content/docs/en/integrations/amplitude.mdx @@ -7,7 +7,7 @@ import { BlockInfoCard } from "@/components/ui/block-info-card" {/* MANUAL-CONTENT-START:intro */} @@ -31,7 +31,7 @@ In Sim, the Amplitude integration enables powerful analytics automation scenario ## Usage Instructions -Integrate Amplitude into your workflow to track events, identify users and groups, search for users, query analytics, and retrieve revenue data. +Integrate Amplitude into your workflow to track events, identify users and groups, search for users, query analytics, analyze funnels and retention, and retrieve revenue data. @@ -64,6 +64,7 @@ Track an event in Amplitude using the HTTP V2 API. | `revenue` | string | No | Revenue amount | | `productId` | string | No | Product identifier | | `revenueType` | string | No | Revenue type \(e.g., "purchase", "refund"\) | +| `dataResidency` | string | No | Data residency region: "us" \(default\) or "eu" | #### Output @@ -86,6 +87,7 @@ Set user properties in Amplitude using the Identify API. Supports $set, $setOnce | `userId` | string | No | User ID \(required if no device_id\) | | `deviceId` | string | No | Device ID \(required if no user_id\) | | `userProperties` | string | Yes | JSON object of user properties. Use operations like $set, $setOnce, $add, $append, $unset. | +| `dataResidency` | string | No | Data residency region: "us" \(default\) or "eu" | #### Output @@ -106,6 +108,7 @@ Set group-level properties in Amplitude. Supports $set, $setOnce, $add, $append, | `groupType` | string | Yes | Group classification \(e.g., "company", "org_id"\) | | `groupValue` | string | Yes | Specific group identifier \(e.g., "Acme Corp"\) | | `groupProperties` | string | Yes | JSON object of group properties. Use operations like $set, $setOnce, $add, $append, $unset. | +| `dataResidency` | string | No | Data residency region: "us" \(default\) or "eu" | #### Output @@ -125,6 +128,7 @@ Search for a user by User ID, Device ID, or Amplitude ID using the Dashboard RES | `apiKey` | string | Yes | Amplitude API Key | | `secretKey` | string | Yes | Amplitude Secret Key | | `user` | string | Yes | User ID, Device ID, or Amplitude ID to search for | +| `dataResidency` | string | No | Data residency region: "us" \(default\) or "eu" | #### Output @@ -149,6 +153,7 @@ Get the event stream for a specific user by their Amplitude ID. | `offset` | string | No | Offset for pagination \(default 0\) | | `limit` | string | No | Maximum number of events to return \(default 1000, max 1000\) | | `direction` | string | No | Sort direction: "latest" or "earliest" \(default: latest\) | +| `dataResidency` | string | No | Data residency region: "us" \(default\) or "eu" | #### Output @@ -170,10 +175,12 @@ Get the event stream for a specific user by their Amplitude ID. | ↳ `numSessions` | number | Total session count | | ↳ `platform` | string | Primary platform | | ↳ `country` | string | Country | +| ↳ `firstUsed` | string | Date the user first appeared | +| ↳ `lastUsed` | string | Date of most recent user activity | ### `amplitude_user_profile` -Get a user profile including properties, cohort memberships, and computed properties. +Get a user profile including properties, cohort memberships, and computed properties. Not available for EU data-residency projects. #### Input @@ -212,7 +219,12 @@ Query event analytics data with segmentation. Get event counts, uniques, average | `metric` | string | No | Metric type: uniques, totals, pct_dau, average, histogram, sums, value_avg, or formula \(default: uniques\) | | `interval` | string | No | Time interval: 1 \(daily\), 7 \(weekly\), or 30 \(monthly\) | | `groupBy` | string | No | Property name to group by \(prefix custom user properties with "gp:"\) | +| `groupBy2` | string | No | Second property name to group by \(prefix custom user properties with "gp:"\) | | `limit` | string | No | Maximum number of group-by values \(max 1000\) | +| `filters` | string | No | JSON array of filter objects applied to the event, e.g. \[\{"subprop_type":"event","subprop_key":"city","subprop_op":"is","subprop_value":\["San Francisco"\]\}\] | +| `formula` | string | No | Required when metric is "formula", e.g. "UNIQUES\(A\)/UNIQUES\(B\)" | +| `segment` | string | No | JSON segment definition\(s\) applied to the query | +| `dataResidency` | string | No | Data residency region: "us" \(default\) or "eu" | #### Output @@ -237,6 +249,9 @@ Get active or new user counts over a date range from the Dashboard REST API. | `end` | string | Yes | End date in YYYYMMDD format | | `metric` | string | No | Metric type: "active" or "new" \(default: active\) | | `interval` | string | No | Time interval: 1 \(daily\), 7 \(weekly\), or 30 \(monthly\) | +| `groupBy` | string | No | Property name to group by | +| `segment` | string | No | JSON segment definition\(s\) applied to the query | +| `dataResidency` | string | No | Data residency region: "us" \(default\) or "eu" | #### Output @@ -256,6 +271,7 @@ Get real-time active user counts at 5-minute granularity for the last 2 days. | --------- | ---- | -------- | ----------- | | `apiKey` | string | Yes | Amplitude API Key | | `secretKey` | string | Yes | Amplitude Secret Key | +| `dataResidency` | string | No | Data residency region: "us" \(default\) or "eu" | #### Output @@ -275,6 +291,7 @@ List all event types in the Amplitude project with their weekly totals and uniqu | --------- | ---- | -------- | ----------- | | `apiKey` | string | Yes | Amplitude API Key | | `secretKey` | string | Yes | Amplitude Secret Key | +| `dataResidency` | string | No | Data residency region: "us" \(default\) or "eu" | #### Output @@ -286,6 +303,8 @@ List all event types in the Amplitude project with their weekly totals and uniqu | ↳ `totals` | number | Weekly total count | | ↳ `hidden` | boolean | Whether the event is hidden | | ↳ `deleted` | boolean | Whether the event is deleted | +| ↳ `nonActive` | boolean | Whether the event is excluded from active user calculations | +| ↳ `flowHidden` | boolean | Whether the event is hidden from user flow charts | ### `amplitude_get_revenue` @@ -301,13 +320,83 @@ Get revenue LTV data including ARPU, ARPPU, total revenue, and paying user count | `end` | string | Yes | End date in YYYYMMDD format | | `metric` | string | No | Metric: 0 \(ARPU\), 1 \(ARPPU\), 2 \(Total Revenue\), 3 \(Paying Users\) | | `interval` | string | No | Time interval: 1 \(daily\), 7 \(weekly\), or 30 \(monthly\) | +| `groupBy` | string | No | Property name to group by \(limit: one\) | +| `segment` | string | No | JSON segment definition\(s\) applied to the query | +| `dataResidency` | string | No | Data residency region: "us" \(default\) or "eu" | #### Output | Parameter | Type | Description | | --------- | ---- | ----------- | -| `series` | json | Array of revenue data series | +| `series` | array | Revenue data series \[\{dates: \[YYYY-MM-DD\], values: \{<date>: \{r1d..r90d, count, paid, total_amount\}\}\}\] | +| ↳ `dates` | array | Dates covered by this series | +| ↳ `values` | json | Per-date metric values keyed by date \(r1d..r90d, count, paid, total_amount\) | | `seriesLabels` | array | Labels for each data series | -| `xValues` | array | Date values for the x-axis | + +### `amplitude_funnels` + +Analyze conversion rates and drop-off between a sequence of events. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Amplitude API Key | +| `secretKey` | string | Yes | Amplitude Secret Key | +| `events` | string | Yes | JSON array of event objects, one per funnel step in order, e.g. \[\{"event_type":"signup"\},\{"event_type":"purchase"\}\] | +| `start` | string | Yes | Start date in YYYYMMDD format | +| `end` | string | Yes | End date in YYYYMMDD format | +| `mode` | string | No | Funnel ordering: "ordered", "unordered", or "sequential" \(default: ordered\) | +| `userType` | string | No | User type: "new" or "active" \(default: active\) | +| `interval` | string | No | Time interval: -300000 \(real-time\), -3600000 \(hourly\), 1 \(daily\), 7 \(weekly\), or 30 \(monthly\) | +| `conversionWindowSeconds` | string | No | Conversion window in seconds \(default: 2592000, i.e. 30 days\) | +| `groupBy` | string | No | Property to group by \(limit: one; prefix custom properties with "gp:"\) | +| `limit` | string | No | Maximum number of group-by values \(default: 100, max: 1000\) | +| `segment` | string | No | JSON segment definition\(s\) applied to the query | +| `dataResidency` | string | No | Data residency region: "us" \(default\) or "eu" | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `funnels` | array | Funnel results, one entry per segment | +| ↳ `stepByStep` | json | Conversion count at each step | +| ↳ `cumulative` | json | Cumulative conversion percentage at each step | +| ↳ `cumulativeRaw` | json | Cumulative conversion count at each step | +| ↳ `medianTransTimes` | json | Median transition time between steps \(ms\) | +| ↳ `avgTransTimes` | json | Average transition time between steps \(ms\) | +| ↳ `events` | json | Event names for each funnel step | +| ↳ `dayFunnels` | json | Daily funnel breakdown \{series, xValues\} | + +### `amplitude_retention` + +Measure how many users return to perform an action after a starting action. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Amplitude API Key | +| `secretKey` | string | Yes | Amplitude Secret Key | +| `startEvent` | string | Yes | JSON starting event object, e.g. \{"event_type":"_new"\} or \{"event_type":"_active"\} | +| `returnEvent` | string | Yes | JSON returning event object, e.g. \{"event_type":"_all"\} or \{"event_type":"_active"\} | +| `start` | string | Yes | Start date in YYYYMMDD format | +| `end` | string | Yes | End date in YYYYMMDD format | +| `retentionMode` | string | No | Retention type: "bracket", "rolling", or "n-day" \(default: n-day\) | +| `retentionBrackets` | string | No | Required when Retention Mode is "bracket". Day ranges, e.g. \[\[0,4\]\] | +| `interval` | string | No | Time interval: 1 \(daily\), 7 \(weekly\), or 30 \(monthly\) | +| `groupBy` | string | No | Property to group by \(limit: one; prefix custom properties with "gp:"\) | +| `segment` | string | No | JSON segment definition\(s\) applied to the query | +| `dataResidency` | string | No | Data residency region: "us" \(default\) or "eu" | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `series` | array | Retention data series \[\{dates, values: \{<date>: \[\{count, outof, incomplete\}\]\}, combined: \[\{count, outof, incomplete\}\]\}\] | +| ↳ `dates` | array | Cohort dates | +| ↳ `values` | json | Per-cohort-date retention counts keyed by date | +| ↳ `combined` | json | Deduplicated aggregate retention across all cohorts | +| `seriesMeta` | array | Segment/event index metadata for each series entry | diff --git a/apps/docs/content/docs/en/integrations/brex.mdx b/apps/docs/content/docs/en/integrations/brex.mdx index 09b49faf55b..cd23dc79a51 100644 --- a/apps/docs/content/docs/en/integrations/brex.mdx +++ b/apps/docs/content/docs/en/integrations/brex.mdx @@ -724,6 +724,8 @@ List spend limits in the Brex account, optionally filtered by member user | ↳ `status` | string | Spend limit status | | ↳ `period_recurrence_type` | string | Period recurrence \(PER_WEEK, PER_MONTH, PER_QUARTER, PER_YEAR, ONE_TIME\) | | ↳ `spend_type` | string | Spend type of the limit | +| ↳ `start_date` | string | Spend limit start date | +| ↳ `end_date` | string | Spend limit end date | | ↳ `owner_user_ids` | array | User IDs of the spend limit owners | | ↳ `member_user_ids` | array | User IDs of the spend limit members | | ↳ `current_period_balance` | json | Spend and rollover amounts for the current period | @@ -737,6 +739,7 @@ List spend limits in the Brex account, optionally filtered by member user | ↳ `rollover_amount` | json | Amount rolled over from previous periods | | ↳ `amount` | number | Amount in the smallest unit of the currency \(e.g., cents for USD\) | | ↳ `currency` | string | ISO 4217 currency code \(e.g., USD\) | +| ↳ `authorization_settings` | json | Authorization settings \(base limit, authorization type, rollover refresh\) | | `nextCursor` | string | Cursor for fetching the next page of results | ### `brex_get_spend_limit` @@ -858,6 +861,7 @@ List money transfers in the Brex account | ↳ `created_at` | string | Creation timestamp | | ↳ `display_name` | string | Transfer display name | | ↳ `external_memo` | string | External memo | +| ↳ `is_ppro_enabled` | boolean | Whether Principal Protection \(PPRO\) is enabled | | `nextCursor` | string | Cursor for fetching the next page of results | ### `brex_get_transfer` @@ -891,5 +895,6 @@ Get a Brex money transfer by its ID | `createdAt` | string | Creation timestamp | | `displayName` | string | Transfer display name | | `externalMemo` | string | External memo | +| `isPproEnabled` | boolean | Whether Principal Protection \(PPRO\) is enabled | diff --git a/apps/docs/content/docs/en/integrations/clerk.mdx b/apps/docs/content/docs/en/integrations/clerk.mdx index 7a9df1a41fd..cfeba8ac3ae 100644 --- a/apps/docs/content/docs/en/integrations/clerk.mdx +++ b/apps/docs/content/docs/en/integrations/clerk.mdx @@ -28,7 +28,7 @@ The integration enables real-time, auditable management of your user base—all ## Usage Instructions -Integrate Clerk authentication and user management into your workflow. Create, update, delete, and list users. Manage organizations and their memberships. Monitor and control user sessions. +Integrate Clerk authentication and user management into your workflow. Create, update, delete, ban, lock, and list users. Manage organizations, their memberships, and invitations. Monitor and control user sessions. Maintain allowlist/blocklist identifiers, JWT templates, and actor tokens. @@ -251,6 +251,132 @@ Delete a user from your Clerk application | `deleted` | boolean | Whether the user was deleted | | `success` | boolean | Operation success status | +### `clerk_ban_user` + +Ban a user, preventing them from signing in + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `secretKey` | string | Yes | The Clerk Secret Key for API authentication | +| `userId` | string | Yes | The ID of the user to ban \(e.g., user_2NNEqL2nrIRdJ194ndJqAHwEfxC\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | User ID | +| `username` | string | Username | +| `firstName` | string | First name | +| `lastName` | string | Last name | +| `banned` | boolean | Whether the user is banned | +| `locked` | boolean | Whether the user is locked | +| `lockoutExpiresInSeconds` | number | Seconds until lockout expires | +| `updatedAt` | number | Last update timestamp | +| `success` | boolean | Operation success status | + +### `clerk_unban_user` + +Remove a ban from a user, allowing them to sign in again + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `secretKey` | string | Yes | The Clerk Secret Key for API authentication | +| `userId` | string | Yes | The ID of the user to unban \(e.g., user_2NNEqL2nrIRdJ194ndJqAHwEfxC\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | User ID | +| `username` | string | Username | +| `firstName` | string | First name | +| `lastName` | string | Last name | +| `banned` | boolean | Whether the user is banned | +| `locked` | boolean | Whether the user is locked | +| `lockoutExpiresInSeconds` | number | Seconds until lockout expires | +| `updatedAt` | number | Last update timestamp | +| `success` | boolean | Operation success status | + +### `clerk_lock_user` + +Lock a user account, blocking sign-in attempts + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `secretKey` | string | Yes | The Clerk Secret Key for API authentication | +| `userId` | string | Yes | The ID of the user to lock \(e.g., user_2NNEqL2nrIRdJ194ndJqAHwEfxC\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | User ID | +| `username` | string | Username | +| `firstName` | string | First name | +| `lastName` | string | Last name | +| `banned` | boolean | Whether the user is banned | +| `locked` | boolean | Whether the user is locked | +| `lockoutExpiresInSeconds` | number | Seconds until lockout expires | +| `updatedAt` | number | Last update timestamp | +| `success` | boolean | Operation success status | + +### `clerk_unlock_user` + +Unlock a previously locked user account + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `secretKey` | string | Yes | The Clerk Secret Key for API authentication | +| `userId` | string | Yes | The ID of the user to unlock \(e.g., user_2NNEqL2nrIRdJ194ndJqAHwEfxC\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | User ID | +| `username` | string | Username | +| `firstName` | string | First name | +| `lastName` | string | Last name | +| `banned` | boolean | Whether the user is banned | +| `locked` | boolean | Whether the user is locked | +| `lockoutExpiresInSeconds` | number | Seconds until lockout expires | +| `updatedAt` | number | Last update timestamp | +| `success` | boolean | Operation success status | + +### `clerk_get_user_oauth_token` + +Retrieve a user's OAuth access token for a connected external provider (e.g. Google, GitHub, Microsoft) obtained via Clerk SSO + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `secretKey` | string | Yes | The Clerk Secret Key for API authentication | +| `userId` | string | Yes | The ID of the user \(e.g., user_2NNEqL2nrIRdJ194ndJqAHwEfxC\) | +| `provider` | string | Yes | OAuth provider slug, e.g. google, github, microsoft, discord \(without the oauth_ prefix\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `accessTokens` | array | OAuth access tokens for the connected provider | +| ↳ `externalAccountId` | string | External account ID | +| ↳ `token` | string | OAuth access token | +| ↳ `expiresAt` | number | Expiration timestamp | +| ↳ `provider` | string | OAuth provider slug | +| ↳ `label` | string | Token label | +| ↳ `scopes` | array | OAuth scopes granted to the token | +| ↳ `publicMetadata` | json | Public metadata associated with the token | +| `success` | boolean | Operation success status | + ### `clerk_list_organizations` List all organizations in your Clerk application with optional filtering @@ -352,6 +478,278 @@ Create a new organization in your Clerk application | `publicMetadata` | json | Public metadata | | `success` | boolean | Operation success status | +### `clerk_update_organization` + +Update an existing organization in your Clerk application + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `secretKey` | string | Yes | The Clerk Secret Key for API authentication | +| `organizationId` | string | Yes | The ID of the organization to update \(e.g., org_2NNEqL2nrIRdJ194ndJqAHwEfxC\) | +| `name` | string | No | Name of the organization | +| `slug` | string | No | Slug identifier for the organization | +| `maxAllowedMemberships` | number | No | Maximum member capacity \(0 for unlimited\) | +| `adminDeleteEnabled` | boolean | No | Whether admins can delete the organization | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Organization ID | +| `name` | string | Organization name | +| `slug` | string | Organization slug | +| `imageUrl` | string | Organization image URL | +| `hasImage` | boolean | Whether organization has an image | +| `membersCount` | number | Number of members | +| `pendingInvitationsCount` | number | Number of pending invitations | +| `maxAllowedMemberships` | number | Max allowed memberships | +| `adminDeleteEnabled` | boolean | Whether admin delete is enabled | +| `createdBy` | string | Creator user ID | +| `createdAt` | number | Creation timestamp | +| `updatedAt` | number | Last update timestamp | +| `publicMetadata` | json | Public metadata | +| `success` | boolean | Operation success status | + +### `clerk_delete_organization` + +Delete an organization from your Clerk application + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `secretKey` | string | Yes | The Clerk Secret Key for API authentication | +| `organizationId` | string | Yes | The ID of the organization to delete \(e.g., org_2NNEqL2nrIRdJ194ndJqAHwEfxC\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Deleted organization ID | +| `object` | string | Object type \(organization\) | +| `deleted` | boolean | Whether the organization was deleted | +| `success` | boolean | Operation success status | + +### `clerk_list_organization_memberships` + +List members of a Clerk organization with optional filtering and pagination + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `secretKey` | string | Yes | The Clerk Secret Key for API authentication | +| `organizationId` | string | Yes | The ID of the organization \(e.g., org_2NNEqL2nrIRdJ194ndJqAHwEfxC\) | +| `limit` | number | No | Number of results per page \(e.g., 10, 50, 100; range: 1-500, default: 10\) | +| `offset` | number | No | Number of results to skip for pagination \(e.g., 0, 10, 20\) | +| `orderBy` | string | No | Sort field \(e.g., created_at\) with +/- prefix for direction | +| `role` | string | No | Filter by role, comma-separated for multiple \(e.g., org:admin,org:member\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `memberships` | array | Array of Clerk organization membership objects | +| ↳ `id` | string | Membership ID | +| ↳ `role` | string | Member role | +| ↳ `roleName` | string | Human-readable role name | +| ↳ `permissions` | array | Permissions granted by the role | +| ↳ `organizationId` | string | Organization ID | +| ↳ `userId` | string | Member user ID | +| ↳ `firstName` | string | Member first name | +| ↳ `lastName` | string | Member last name | +| ↳ `imageUrl` | string | Member profile image URL | +| ↳ `identifier` | string | Member identifier \(e.g., email\) | +| ↳ `username` | string | Member username | +| ↳ `banned` | boolean | Whether the member is banned | +| ↳ `publicMetadata` | json | Public metadata | +| ↳ `createdAt` | number | Creation timestamp | +| ↳ `updatedAt` | number | Last update timestamp | +| `totalCount` | number | Total number of memberships | +| `success` | boolean | Operation success status | + +### `clerk_add_organization_member` + +Add a user as a member of a Clerk organization with a given role + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `secretKey` | string | Yes | The Clerk Secret Key for API authentication | +| `organizationId` | string | Yes | The ID of the organization \(e.g., org_2NNEqL2nrIRdJ194ndJqAHwEfxC\) | +| `userId` | string | Yes | ID of the user to add as a member | +| `role` | string | Yes | Role to assign, e.g. org:admin or org:member | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Membership ID | +| `role` | string | Member role | +| `roleName` | string | Human-readable role name | +| `permissions` | array | Permissions granted by the role | +| `organizationId` | string | Organization ID | +| `userId` | string | Member user ID | +| `firstName` | string | Member first name | +| `lastName` | string | Member last name | +| `imageUrl` | string | Member profile image URL | +| `identifier` | string | Member identifier \(e.g., email\) | +| `username` | string | Member username | +| `banned` | boolean | Whether the member is banned | +| `publicMetadata` | json | Public metadata | +| `createdAt` | number | Creation timestamp | +| `updatedAt` | number | Last update timestamp | +| `success` | boolean | Operation success status | + +### `clerk_update_organization_membership` + +Change a member's role within a Clerk organization + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `secretKey` | string | Yes | The Clerk Secret Key for API authentication | +| `organizationId` | string | Yes | The ID of the organization \(e.g., org_2NNEqL2nrIRdJ194ndJqAHwEfxC\) | +| `userId` | string | Yes | ID of the member whose role is being changed | +| `role` | string | Yes | New role to assign, e.g. org:admin or org:member | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Membership ID | +| `role` | string | Member role | +| `roleName` | string | Human-readable role name | +| `permissions` | array | Permissions granted by the role | +| `organizationId` | string | Organization ID | +| `userId` | string | Member user ID | +| `firstName` | string | Member first name | +| `lastName` | string | Member last name | +| `imageUrl` | string | Member profile image URL | +| `identifier` | string | Member identifier \(e.g., email\) | +| `username` | string | Member username | +| `banned` | boolean | Whether the member is banned | +| `publicMetadata` | json | Public metadata | +| `createdAt` | number | Creation timestamp | +| `updatedAt` | number | Last update timestamp | +| `success` | boolean | Operation success status | + +### `clerk_remove_organization_member` + +Remove a member from a Clerk organization + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `secretKey` | string | Yes | The Clerk Secret Key for API authentication | +| `organizationId` | string | Yes | The ID of the organization \(e.g., org_2NNEqL2nrIRdJ194ndJqAHwEfxC\) | +| `userId` | string | Yes | ID of the member to remove | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Membership ID | +| `role` | string | Member role | +| `roleName` | string | Human-readable role name | +| `permissions` | array | Permissions granted by the role | +| `organizationId` | string | Organization ID | +| `userId` | string | Member user ID | +| `firstName` | string | Member first name | +| `lastName` | string | Member last name | +| `imageUrl` | string | Member profile image URL | +| `identifier` | string | Member identifier \(e.g., email\) | +| `username` | string | Member username | +| `banned` | boolean | Whether the member is banned | +| `publicMetadata` | json | Public metadata | +| `createdAt` | number | Creation timestamp | +| `updatedAt` | number | Last update timestamp | +| `success` | boolean | Operation success status | + +### `clerk_create_organization_invitation` + +Invite a user by email to join a Clerk organization with a given role + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `secretKey` | string | Yes | The Clerk Secret Key for API authentication | +| `organizationId` | string | Yes | The ID of the organization \(e.g., org_2NNEqL2nrIRdJ194ndJqAHwEfxC\) | +| `emailAddress` | string | Yes | Email address of the user to invite | +| `role` | string | Yes | Role to assign on acceptance, e.g. org:admin or org:member | +| `inviterUserId` | string | No | User ID of the inviter | +| `redirectUrl` | string | No | URL to redirect to after the invitation is accepted | +| `expiresInDays` | number | No | Days until the invitation expires \(1-365, default 30\) | +| `publicMetadata` | json | No | Public metadata \(JSON object\) | +| `privateMetadata` | json | No | Private metadata \(JSON object\) | +| `notify` | boolean | No | Whether Clerk sends the invitation email \(default true\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Invitation ID | +| `emailAddress` | string | Invited email address | +| `role` | string | Role to assign on acceptance | +| `roleName` | string | Human-readable role name | +| `organizationId` | string | Organization ID | +| `inviterId` | string | User ID of the inviter | +| `inviterEmail` | string | Inviter's email address | +| `inviterFirstName` | string | Inviter's first name | +| `inviterLastName` | string | Inviter's last name | +| `status` | string | Invitation status | +| `url` | string | Invitation URL | +| `expiresAt` | number | Expiration timestamp | +| `publicMetadata` | json | Public metadata | +| `createdAt` | number | Creation timestamp | +| `updatedAt` | number | Last update timestamp | +| `success` | boolean | Operation success status | + +### `clerk_list_organization_invitations` + +List pending and past invitations for a Clerk organization + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `secretKey` | string | Yes | The Clerk Secret Key for API authentication | +| `organizationId` | string | Yes | The ID of the organization \(e.g., org_2NNEqL2nrIRdJ194ndJqAHwEfxC\) | +| `status` | string | No | Filter by status: pending, accepted, revoked, or expired | +| `emailAddress` | string | No | Filter by invited email address | +| `orderBy` | string | No | Sort field \(created_at, email_address\) with +/- prefix \(default: -created_at\) | +| `limit` | number | No | Number of results per page \(e.g., 10, 50, 100; range: 1-500, default: 10\) | +| `offset` | number | No | Number of results to skip for pagination \(e.g., 0, 10, 20\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `invitations` | array | Array of Clerk organization invitation objects | +| ↳ `id` | string | Invitation ID | +| ↳ `emailAddress` | string | Invited email address | +| ↳ `role` | string | Role to assign on acceptance | +| ↳ `roleName` | string | Human-readable role name | +| ↳ `organizationId` | string | Organization ID | +| ↳ `inviterId` | string | User ID of the inviter | +| ↳ `inviterEmail` | string | Inviter's email address | +| ↳ `inviterFirstName` | string | Inviter's first name | +| ↳ `inviterLastName` | string | Inviter's last name | +| ↳ `status` | string | Invitation status | +| ↳ `url` | string | Invitation URL | +| ↳ `expiresAt` | number | Expiration timestamp | +| ↳ `publicMetadata` | json | Public metadata | +| ↳ `createdAt` | number | Creation timestamp | +| ↳ `updatedAt` | number | Last update timestamp | +| `totalCount` | number | Total number of invitations | +| `success` | boolean | Operation success status | + ### `clerk_list_sessions` List sessions for a user or client in your Clerk application @@ -439,27 +837,268 @@ Revoke a session to immediately invalidate it | `updatedAt` | number | Last update timestamp | | `success` | boolean | Operation success status | +### `clerk_list_allowlist_identifiers` +List email/phone/web3-wallet identifiers on your Clerk instance allowlist -## Triggers - -A **Trigger** is a block that starts a workflow when an event happens in this service. - -### Clerk Organization Created - -Trigger workflow when a Clerk organization is created - -#### Configuration +#### Input | Parameter | Type | Required | Description | | --------- | ---- | -------- | ----------- | -| `signingSecret` | string | Yes | Copy this from your Clerk webhook endpoint to verify event signatures. | +| `secretKey` | string | Yes | The Clerk Secret Key for API authentication | +| `limit` | number | No | Number of results per page \(e.g., 10, 50, 100; range: 1-500, default: 10\) | +| `offset` | number | No | Number of results to skip for pagination \(e.g., 0, 10, 20\) | #### Output | Parameter | Type | Description | | --------- | ---- | ----------- | -| `type` | string | Event type \(e.g., user.created, session.created\) | +| `identifiers` | array | Array of Clerk allowlist identifier objects | +| ↳ `id` | string | Allowlist identifier ID | +| ↳ `identifier` | string | Email, phone, or web3 wallet identifier | +| ↳ `identifierType` | string | Type of identifier | +| ↳ `invitationId` | string | Associated invitation ID | +| ↳ `createdAt` | number | Creation timestamp | +| ↳ `updatedAt` | number | Last update timestamp | +| `totalCount` | number | Total number of allowlist identifiers | +| `success` | boolean | Operation success status | + +### `clerk_create_allowlist_identifier` + +Add an email, phone number, or web3 wallet to your Clerk instance allowlist + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `secretKey` | string | Yes | The Clerk Secret Key for API authentication | +| `identifier` | string | Yes | Email address, phone number, or web3 wallet to allow \(wildcards like *@example.com supported for email\) | +| `notify` | boolean | No | Whether to notify the identifier owner by email \(default false\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Allowlist identifier ID | +| `identifier` | string | Email, phone, or web3 wallet identifier | +| `identifierType` | string | Type of identifier | +| `invitationId` | string | Associated invitation ID | +| `createdAt` | number | Creation timestamp | +| `updatedAt` | number | Last update timestamp | +| `success` | boolean | Operation success status | + +### `clerk_delete_allowlist_identifier` + +Remove an identifier from your Clerk instance allowlist + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `secretKey` | string | Yes | The Clerk Secret Key for API authentication | +| `identifierId` | string | Yes | ID of the allowlist identifier to delete | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Deleted allowlist identifier ID | +| `object` | string | Object type \(allowlist_identifier\) | +| `deleted` | boolean | Whether the identifier was deleted | +| `success` | boolean | Operation success status | + +### `clerk_list_blocklist_identifiers` + +List email/phone/web3-wallet identifiers on your Clerk instance blocklist + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `secretKey` | string | Yes | The Clerk Secret Key for API authentication | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `identifiers` | array | Array of Clerk blocklist identifier objects | +| ↳ `id` | string | Blocklist identifier ID | +| ↳ `identifier` | string | Email, phone, or web3 wallet identifier | +| ↳ `identifierType` | string | Type of identifier | +| ↳ `createdAt` | number | Creation timestamp | +| ↳ `updatedAt` | number | Last update timestamp | +| `totalCount` | number | Total number of blocklist identifiers | +| `success` | boolean | Operation success status | + +### `clerk_create_blocklist_identifier` + +Add an email, phone number, or web3 wallet to your Clerk instance blocklist to prevent sign-ups + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `secretKey` | string | Yes | The Clerk Secret Key for API authentication | +| `identifier` | string | Yes | Email address, phone number, or web3 wallet to block | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Blocklist identifier ID | +| `identifier` | string | Email, phone, or web3 wallet identifier | +| `identifierType` | string | Type of identifier | +| `createdAt` | number | Creation timestamp | +| `updatedAt` | number | Last update timestamp | +| `success` | boolean | Operation success status | + +### `clerk_delete_blocklist_identifier` + +Remove an identifier from your Clerk instance blocklist + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `secretKey` | string | Yes | The Clerk Secret Key for API authentication | +| `identifierId` | string | Yes | ID of the blocklist identifier to delete | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Deleted blocklist identifier ID | +| `object` | string | Object type \(blocklist_identifier\) | +| `deleted` | boolean | Whether the identifier was deleted | +| `success` | boolean | Operation success status | + +### `clerk_list_jwt_templates` + +List custom JWT templates configured on your Clerk instance + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `secretKey` | string | Yes | The Clerk Secret Key for API authentication | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `templates` | array | Array of Clerk JWT template objects | +| ↳ `id` | string | JWT template ID | +| ↳ `name` | string | JWT template name | +| ↳ `claims` | json | Custom claims defined on the template | +| ↳ `lifetime` | number | Token lifetime in seconds | +| ↳ `allowedClockSkew` | number | Allowed clock skew in seconds | +| ↳ `customSigningKey` | boolean | Whether a custom signing key is configured | +| ↳ `signingAlgorithm` | string | Signing algorithm used | +| ↳ `createdAt` | number | Creation timestamp | +| ↳ `updatedAt` | number | Last update timestamp | +| `totalCount` | number | Total number of JWT templates | +| `success` | boolean | Operation success status | + +### `clerk_get_jwt_template` + +Retrieve a single custom JWT template by ID from Clerk + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `secretKey` | string | Yes | The Clerk Secret Key for API authentication | +| `templateId` | string | Yes | ID of the JWT template to retrieve | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | JWT template ID | +| `name` | string | JWT template name | +| `claims` | json | Custom claims defined on the template | +| `lifetime` | number | Token lifetime in seconds | +| `allowedClockSkew` | number | Allowed clock skew in seconds | +| `customSigningKey` | boolean | Whether a custom signing key is configured | +| `signingAlgorithm` | string | Signing algorithm used | +| `createdAt` | number | Creation timestamp | +| `updatedAt` | number | Last update timestamp | +| `success` | boolean | Operation success status | + +### `clerk_create_actor_token` + +Create an actor token to impersonate a user (God Mode / act-as-user), e.g. for support tooling + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `secretKey` | string | Yes | The Clerk Secret Key for API authentication | +| `userId` | string | Yes | ID of the user to impersonate | +| `actor` | json | Yes | Actor JSON object identifying who is impersonating, must include a "sub" field, e.g. \{"sub": "user_support_agent_id"\} | +| `expiresInSeconds` | number | No | Seconds until the token expires \(default 3600\) | +| `sessionMaxDurationInSeconds` | number | No | Max duration in seconds for sessions created with this token \(default 1800\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Actor token ID | +| `status` | string | Actor token status | +| `userId` | string | ID of the impersonated user | +| `actor` | json | Actor object identifying who is impersonating | +| `token` | string | Signed actor token \(JWT\) | +| `url` | string | Sign-in URL for the actor token | +| `createdAt` | number | Creation timestamp | +| `updatedAt` | number | Last update timestamp | +| `success` | boolean | Operation success status | + +### `clerk_revoke_actor_token` + +Revoke an actor token before it is used or expires + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `secretKey` | string | Yes | The Clerk Secret Key for API authentication | +| `actorTokenId` | string | Yes | ID of the actor token to revoke | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Actor token ID | +| `status` | string | Actor token status \(should be revoked\) | +| `userId` | string | ID of the impersonated user | +| `actor` | json | Actor object identifying who is impersonating | +| `token` | string | Signed actor token \(JWT\) | +| `url` | string | Sign-in URL for the actor token | +| `createdAt` | number | Creation timestamp | +| `updatedAt` | number | Last update timestamp | +| `success` | boolean | Operation success status | + + + +## Triggers + +A **Trigger** is a block that starts a workflow when an event happens in this service. + +### Clerk Organization Created + +Trigger workflow when a Clerk organization is created + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `signingSecret` | string | Yes | Copy this from your Clerk webhook endpoint to verify event signatures. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `type` | string | Event type \(e.g., user.created, session.created\) | | `object` | string | Always "event" | | `timestamp` | number | Timestamp in milliseconds when the event occurred | | `instance_id` | string | Identifier of your Clerk instance | @@ -473,6 +1112,31 @@ Trigger workflow when a Clerk organization is created | `createdAt` | number | Organization creation timestamp \(data.created_at\) | +--- + +### Clerk Organization Deleted + +Trigger workflow when a Clerk organization is deleted + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `signingSecret` | string | Yes | Copy this from your Clerk webhook endpoint to verify event signatures. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `type` | string | Event type \(e.g., user.created, session.created\) | +| `object` | string | Always "event" | +| `timestamp` | number | Timestamp in milliseconds when the event occurred | +| `instance_id` | string | Identifier of your Clerk instance | +| `data` | json | Raw event `data` object \(shape varies by event type\) | +| `organizationId` | string | Deleted Clerk organization ID \(data.id\) | +| `deleted` | boolean | Whether the organization was deleted \(data.deleted\) | + + --- ### Clerk Organization Membership Created @@ -501,6 +1165,89 @@ Trigger workflow when a Clerk organization membership is created | `createdAt` | number | Membership creation timestamp \(data.created_at\) | +--- + +### Clerk Organization Membership Deleted + +Trigger workflow when a Clerk organization membership is deleted + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `signingSecret` | string | Yes | Copy this from your Clerk webhook endpoint to verify event signatures. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `type` | string | Event type \(e.g., user.created, session.created\) | +| `object` | string | Always "event" | +| `timestamp` | number | Timestamp in milliseconds when the event occurred | +| `instance_id` | string | Identifier of your Clerk instance | +| `data` | json | Raw event `data` object \(shape varies by event type\) | +| `membershipId` | string | Deleted membership ID \(data.id\) | +| `deleted` | boolean | Whether the membership was deleted \(data.deleted\) | + + +--- + +### Clerk Organization Membership Updated + +Trigger workflow when a Clerk organization membership is updated + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `signingSecret` | string | Yes | Copy this from your Clerk webhook endpoint to verify event signatures. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `type` | string | Event type \(e.g., user.created, session.created\) | +| `object` | string | Always "event" | +| `timestamp` | number | Timestamp in milliseconds when the event occurred | +| `instance_id` | string | Identifier of your Clerk instance | +| `data` | json | Raw event `data` object \(shape varies by event type\) | +| `membershipId` | string | Membership ID \(data.id\) | +| `role` | string | Membership role, e.g. org:admin \(data.role\) | +| `organizationId` | string | Organization ID \(data.organization.id\) | +| `userId` | string | User ID of the member \(data.public_user_data.user_id\) | +| `createdAt` | number | Membership creation timestamp \(data.created_at\) | + + +--- + +### Clerk Organization Updated + +Trigger workflow when a Clerk organization is updated + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `signingSecret` | string | Yes | Copy this from your Clerk webhook endpoint to verify event signatures. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `type` | string | Event type \(e.g., user.created, session.created\) | +| `object` | string | Always "event" | +| `timestamp` | number | Timestamp in milliseconds when the event occurred | +| `instance_id` | string | Identifier of your Clerk instance | +| `data` | json | Raw event `data` object \(shape varies by event type\) | +| `organizationId` | string | Clerk organization ID \(data.id\) | +| `name` | string | Organization name \(data.name\) | +| `slug` | string | Organization slug \(data.slug\) | +| `createdBy` | string | User ID of the creator \(data.created_by\) | +| `membersCount` | number | Number of members \(data.members_count\) | +| `maxAllowedMemberships` | number | Maximum allowed memberships \(data.max_allowed_memberships\) | +| `createdAt` | number | Organization creation timestamp \(data.created_at\) | + + --- ### Clerk Session Created @@ -529,6 +1276,90 @@ Trigger workflow when a Clerk session is created | `createdAt` | number | Session creation timestamp \(data.created_at\) | +--- + +### Clerk Session Ended + +Trigger workflow when a Clerk session ends + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `signingSecret` | string | Yes | Copy this from your Clerk webhook endpoint to verify event signatures. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `type` | string | Event type \(e.g., user.created, session.created\) | +| `object` | string | Always "event" | +| `timestamp` | number | Timestamp in milliseconds when the event occurred | +| `instance_id` | string | Identifier of your Clerk instance | +| `data` | json | Raw event `data` object \(shape varies by event type\) | +| `sessionId` | string | Clerk session ID \(data.id\) | +| `userId` | string | User the session belongs to \(data.user_id\) | +| `clientId` | string | Client ID for the session \(data.client_id\) | +| `status` | string | Session status \(data.status\) | +| `createdAt` | number | Session creation timestamp \(data.created_at\) | + + +--- + +### Clerk Session Removed + +Trigger workflow when a Clerk session is removed + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `signingSecret` | string | Yes | Copy this from your Clerk webhook endpoint to verify event signatures. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `type` | string | Event type \(e.g., user.created, session.created\) | +| `object` | string | Always "event" | +| `timestamp` | number | Timestamp in milliseconds when the event occurred | +| `instance_id` | string | Identifier of your Clerk instance | +| `data` | json | Raw event `data` object \(shape varies by event type\) | +| `sessionId` | string | Clerk session ID \(data.id\) | +| `userId` | string | User the session belongs to \(data.user_id\) | +| `clientId` | string | Client ID for the session \(data.client_id\) | +| `status` | string | Session status \(data.status\) | +| `createdAt` | number | Session creation timestamp \(data.created_at\) | + + +--- + +### Clerk Session Revoked + +Trigger workflow when a Clerk session is revoked + +#### Configuration + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `signingSecret` | string | Yes | Copy this from your Clerk webhook endpoint to verify event signatures. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `type` | string | Event type \(e.g., user.created, session.created\) | +| `object` | string | Always "event" | +| `timestamp` | number | Timestamp in milliseconds when the event occurred | +| `instance_id` | string | Identifier of your Clerk instance | +| `data` | json | Raw event `data` object \(shape varies by event type\) | +| `sessionId` | string | Clerk session ID \(data.id\) | +| `userId` | string | User the session belongs to \(data.user_id\) | +| `clientId` | string | Client ID for the session \(data.client_id\) | +| `status` | string | Session status \(data.status\) | +| `createdAt` | number | Session creation timestamp \(data.created_at\) | + + --- ### Clerk User Created diff --git a/apps/docs/content/docs/en/integrations/gong.mdx b/apps/docs/content/docs/en/integrations/gong.mdx index 55b2007411b..6d111ddc52c 100644 --- a/apps/docs/content/docs/en/integrations/gong.mdx +++ b/apps/docs/content/docs/en/integrations/gong.mdx @@ -769,6 +769,71 @@ List Gong Engage flows (sales engagement sequences). | `currentPageNumber` | number | Current page number | | `cursor` | string | Pagination cursor for retrieving the next page of records | +### `gong_assign_flow_prospects` + +Assign up to 200 CRM prospects (contacts or leads) to a Gong Engage flow. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `accessKey` | string | Yes | Gong API Access Key | +| `accessKeySecret` | string | Yes | Gong API Access Key Secret | +| `flowId` | string | Yes | The Gong Engage flow ID to assign the prospects to | +| `crmProspectsIds` | string | Yes | Comma-separated list of CRM prospect IDs \(contacts or leads\) to assign | +| `flowInstanceOwnerEmail` | string | Yes | Email of the Gong user who owns the flow instance and its to-dos | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `requestId` | string | A Gong request reference ID for troubleshooting purposes | +| `prospectsAssigned` | array | Prospects successfully assigned to the flow | +| ↳ `flowId` | string | The flow ID | +| ↳ `flowName` | string | The flow name | +| ↳ `crmProspectId` | string | The CRM prospect ID | +| ↳ `flowInstanceId` | string | The created flow instance ID | +| ↳ `flowInstanceOwnerEmail` | string | Email of the flow instance owner | +| ↳ `flowInstanceOwnerFullName` | string | Full name of the flow instance owner | +| ↳ `flowInstanceCreateDate` | string | Creation time of the flow instance in ISO-8601 format | +| ↳ `flowInstanceStatus` | string | Status of the flow instance | +| ↳ `workspaceId` | string | Workspace ID | +| ↳ `exclusive` | boolean | Whether this prospect can be added to other flows | +| `prospectsNotAssigned` | array | Prospects that failed to be assigned to the flow | +| ↳ `flowId` | string | The flow ID | +| ↳ `crmProspectId` | string | The CRM prospect ID | +| ↳ `errorCode` | string | Failure reason: InvalidArgument, InvalidState, or UnexpectedError | +| ↳ `errorMessage` | string | Human-readable failure message | + +### `gong_get_prospect_flows` + +Get the Gong Engage flows currently assigned to the given CRM prospects. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `accessKey` | string | Yes | Gong API Access Key | +| `accessKeySecret` | string | Yes | Gong API Access Key Secret | +| `crmProspectsIds` | string | Yes | Comma-separated list of CRM prospect IDs \(contacts or leads\) to look up | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `requestId` | string | A Gong request reference ID for troubleshooting purposes | +| `prospectsAssigned` | array | Flows currently assigned to the requested prospects | +| ↳ `flowId` | string | The flow ID | +| ↳ `flowName` | string | The flow name | +| ↳ `crmProspectId` | string | The CRM prospect ID | +| ↳ `flowInstanceId` | string | The flow instance ID | +| ↳ `flowInstanceOwnerEmail` | string | Email of the flow instance owner | +| ↳ `flowInstanceOwnerFullName` | string | Full name of the flow instance owner | +| ↳ `flowInstanceCreateDate` | string | Creation time of the flow instance in ISO-8601 format | +| ↳ `flowInstanceStatus` | string | Status of the flow instance | +| ↳ `workspaceId` | string | Workspace ID | +| ↳ `exclusive` | boolean | Whether this prospect can be added to other flows | + ### `gong_get_coaching` Retrieve coaching metrics for a manager from Gong. @@ -904,6 +969,42 @@ Find all references to a phone number in Gong (calls, email messages, meetings, | ↳ `name` | string | Field name | | ↳ `value` | json | Field value | +### `gong_purge_email_address` + +Erase all Gong data (calls, email messages, leads, contacts) referencing an email address. Asynchronous and irreversible. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `accessKey` | string | Yes | Gong API Access Key | +| `accessKeySecret` | string | Yes | Gong API Access Key Secret | +| `emailAddress` | string | Yes | Email address whose associated data should be permanently erased from Gong | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `requestId` | string | A Gong request reference ID for troubleshooting purposes | + +### `gong_purge_phone_number` + +Erase all Gong data (calls, leads, contacts) referencing a phone number. Asynchronous and irreversible. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `accessKey` | string | Yes | Gong API Access Key | +| `accessKeySecret` | string | Yes | Gong API Access Key Secret | +| `phoneNumber` | string | Yes | Phone number whose associated data should be permanently erased from Gong. Must include a leading "+" and country code \(e.g., +14255552671\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `requestId` | string | A Gong request reference ID for troubleshooting purposes | + ## Triggers diff --git a/apps/docs/content/docs/en/integrations/hex.mdx b/apps/docs/content/docs/en/integrations/hex.mdx index e728ab635ff..392e9935f23 100644 --- a/apps/docs/content/docs/en/integrations/hex.mdx +++ b/apps/docs/content/docs/en/integrations/hex.mdx @@ -34,7 +34,7 @@ Whether you’re empowering analysts, automating reporting, or embedding actiona ## Usage Instructions -Integrate Hex into your workflow. Run projects, check run status, manage collections and groups, list users, and view data connections. Requires a Hex API token. +Integrate Hex into your workflow. Run projects, check run status, manage collections and groups (including membership and deactivating users), list users, and view data connections. Requires a Hex API token. @@ -83,6 +83,62 @@ Create a new collection in the Hex workspace to organize projects. | ↳ `email` | string | Creator email | | ↳ `id` | string | Creator UUID | +### `hex_create_group` + +Create a new group in the Hex workspace, optionally with initial members. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Hex API token \(Personal or Workspace\) | +| `name` | string | Yes | Name for the new group | +| `memberUserIds` | json | No | JSON array of user UUIDs to add as initial group members \(e.g., \["uuid1", "uuid2"\]\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Newly created group UUID | +| `name` | string | Group name | +| `createdAt` | string | Creation timestamp | + +### `hex_deactivate_user` + +Deactivate a user in the Hex workspace. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Hex API token \(Personal or Workspace\) | +| `userId` | string | Yes | The UUID of the user to deactivate | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `success` | boolean | Whether the user was successfully deactivated | +| `userId` | string | User UUID that was deactivated | + +### `hex_delete_group` + +Delete a group from the Hex workspace. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Hex API token \(Personal or Workspace\) | +| `groupId` | string | Yes | The UUID of the group to delete | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `success` | boolean | Whether the group was successfully deleted | +| `groupId` | string | Group UUID that was deleted | + ### `hex_get_collection` Retrieve details for a specific Hex collection by its ID. @@ -194,6 +250,7 @@ Retrieve API-triggered runs for a Hex project with optional filtering by status | `limit` | number | No | Maximum number of runs to return \(1-100, default: 25\) | | `offset` | number | No | Offset for paginated results \(default: 0\) | | `statusFilter` | string | No | Filter by run status: PENDING, RUNNING, ERRORED, COMPLETED, KILLED, UNABLE_TO_ALLOCATE_KERNEL | +| `runTriggerFilter` | string | No | Filter by how the run was triggered: ALL, API, SCHEDULED, or APP_REFRESH | #### Output @@ -211,6 +268,8 @@ Retrieve API-triggered runs for a Hex project with optional filtering by status | ↳ `projectVersion` | number | Project version number | | `total` | number | Total number of runs returned | | `traceId` | string | Top-level trace ID | +| `nextPage` | string | Cursor for the next page of runs | +| `previousPage` | string | Cursor for the previous page of runs | ### `hex_get_queried_tables` @@ -271,6 +330,8 @@ List all collections in the Hex workspace. | `apiKey` | string | Yes | Hex API token \(Personal or Workspace\) | | `limit` | number | No | Maximum number of collections to return \(1-500, default: 25\) | | `sortBy` | string | No | Sort by field: NAME | +| `after` | string | No | Cursor to fetch the page of results after this value | +| `before` | string | No | Cursor to fetch the page of results before this value | #### Output @@ -284,6 +345,8 @@ List all collections in the Hex workspace. | ↳ `email` | string | Creator email | | ↳ `id` | string | Creator UUID | | `total` | number | Total number of collections returned | +| `after` | string | Cursor for the next page of results | +| `before` | string | Cursor for the previous page of results | ### `hex_list_data_connections` @@ -297,6 +360,8 @@ List all data connections in the Hex workspace (e.g., Snowflake, PostgreSQL, Big | `limit` | number | No | Maximum number of connections to return \(1-500, default: 25\) | | `sortBy` | string | No | Sort by field: CREATED_AT or NAME | | `sortDirection` | string | No | Sort direction: ASC or DESC | +| `after` | string | No | Cursor to fetch the page of results after this value | +| `before` | string | No | Cursor to fetch the page of results before this value | #### Output @@ -311,6 +376,8 @@ List all data connections in the Hex workspace (e.g., Snowflake, PostgreSQL, Big | ↳ `includeMagic` | boolean | Whether Magic AI features are enabled | | ↳ `allowWritebackCells` | boolean | Whether writeback cells are allowed | | `total` | number | Total number of connections returned | +| `after` | string | Cursor for the next page of results | +| `before` | string | Cursor for the previous page of results | ### `hex_list_groups` @@ -324,6 +391,8 @@ List all groups in the Hex workspace with optional sorting. | `limit` | number | No | Maximum number of groups to return \(1-500, default: 25\) | | `sortBy` | string | No | Sort by field: CREATED_AT or NAME | | `sortDirection` | string | No | Sort direction: ASC or DESC | +| `after` | string | No | Cursor to fetch the page of results after this value | +| `before` | string | No | Cursor to fetch the page of results before this value | #### Output @@ -334,6 +403,8 @@ List all groups in the Hex workspace with optional sorting. | ↳ `name` | string | Group name | | ↳ `createdAt` | string | Creation timestamp | | `total` | number | Total number of groups returned | +| `after` | string | Cursor for the next page of results | +| `before` | string | Cursor for the previous page of results | ### `hex_list_projects` @@ -347,6 +418,16 @@ List all projects in your Hex workspace with optional filtering by status. | `limit` | number | No | Maximum number of projects to return \(1-100\) | | `includeArchived` | boolean | No | Include archived projects in results | | `statusFilter` | string | No | Filter by status: PUBLISHED, DRAFT, or ALL | +| `includeComponents` | boolean | No | Include components in results | +| `includeTrashed` | boolean | No | Include trashed projects in results | +| `creatorEmail` | string | No | Filter by creator email | +| `ownerEmail` | string | No | Filter by owner email | +| `collectionId` | string | No | Filter by collection UUID | +| `categories` | json | No | JSON array of category names to filter by \(e.g., \["Marketing", "Finance"\]\) | +| `sortBy` | string | No | Sort by field: CREATED_AT, LAST_EDITED_AT, or LAST_PUBLISHED_AT | +| `sortDirection` | string | No | Sort direction: ASC or DESC | +| `after` | string | No | Cursor to fetch the page of results after this value | +| `before` | string | No | Cursor to fetch the page of results before this value | #### Output @@ -368,6 +449,8 @@ List all projects in your Hex workspace with optional filtering by status. | ↳ `createdAt` | string | Creation timestamp | | ↳ `archivedAt` | string | Archived timestamp | | `total` | number | Total number of projects returned | +| `after` | string | Cursor for the next page of results | +| `before` | string | Cursor for the previous page of results | ### `hex_list_users` @@ -382,6 +465,9 @@ List all users in the Hex workspace with optional filtering and sorting. | `sortBy` | string | No | Sort by field: NAME or EMAIL | | `sortDirection` | string | No | Sort direction: ASC or DESC | | `groupId` | string | No | Filter users by group UUID | +| `userIds` | string | No | Comma-separated list of user UUIDs to filter by | +| `after` | string | No | Cursor to fetch the page of results after this value | +| `before` | string | No | Cursor to fetch the page of results before this value | #### Output @@ -392,7 +478,10 @@ List all users in the Hex workspace with optional filtering and sorting. | ↳ `name` | string | User name | | ↳ `email` | string | User email | | ↳ `role` | string | User role \(ADMIN, MANAGER, EDITOR, EXPLORER, MEMBER, GUEST, EMBEDDED_USER, ANONYMOUS\) | +| ↳ `lastLoginDate` | string | Last login timestamp | | `total` | number | Total number of users returned | +| `after` | string | Cursor for the next page of results | +| `before` | string | Cursor for the previous page of results | ### `hex_run_project` @@ -409,6 +498,8 @@ Execute a published Hex project. Optionally pass input parameters and control ca | `updateCache` | boolean | No | \(Deprecated\) If true, update the cached results after execution | | `updatePublishedResults` | boolean | No | If true, update the published app results after execution | | `useCachedSqlResults` | boolean | No | If true, use cached SQL results instead of re-running queries | +| `viewId` | string | No | Optional SavedView ID to use for the project run | +| `notifications` | json | No | JSON array of notification details to deliver once the run completes \(e.g., \[\{"type": "FAILURE", "slackChannelIds": \["C0123456789"\], "userIds": \[\], "groupIds": \[\], "includeSuccessScreenshot": false\}\]\). type is ALL, SUCCESS, or FAILURE. | #### Output @@ -421,6 +512,52 @@ Execute a published Hex project. Optionally pass input parameters and control ca | `traceId` | string | Trace ID for debugging | | `projectVersion` | number | Project version number | +### `hex_update_collection` + +Update the name or description of an existing Hex collection. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Hex API token \(Personal or Workspace\) | +| `collectionId` | string | Yes | The UUID of the collection to update | +| `name` | string | No | New name for the collection | +| `description` | string | No | New description for the collection | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Collection UUID | +| `name` | string | Collection name | +| `description` | string | Collection description | +| `creator` | object | Collection creator | +| ↳ `email` | string | Creator email | +| ↳ `id` | string | Creator UUID | + +### `hex_update_group` + +Rename a Hex group or add/remove members from it. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Hex API token \(Personal or Workspace\) | +| `groupId` | string | Yes | The UUID of the group to update | +| `name` | string | No | New name for the group | +| `addUserIds` | json | No | JSON array of user UUIDs to add to the group \(e.g., \["uuid1", "uuid2"\]\) | +| `removeUserIds` | json | No | JSON array of user UUIDs to remove from the group \(e.g., \["uuid1", "uuid2"\]\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Group UUID | +| `name` | string | Group name | +| `createdAt` | string | Creation timestamp | + ### `hex_update_project` Update a Hex project status label (e.g., endorsement or custom workspace statuses). diff --git a/apps/docs/content/docs/en/integrations/langsmith.mdx b/apps/docs/content/docs/en/integrations/langsmith.mdx index caf4577f8a8..7e83f3d1eb4 100644 --- a/apps/docs/content/docs/en/integrations/langsmith.mdx +++ b/apps/docs/content/docs/en/integrations/langsmith.mdx @@ -91,4 +91,81 @@ Forward multiple runs to LangSmith in a single batch. | `message` | string | Response message from LangSmith | | `messages` | array | Per-run response messages, when provided | +### `langsmith_update_run` + +Patch an existing LangSmith run with outputs, status, or timing once it completes. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | LangSmith API key | +| `runId` | string | Yes | ID of the run to update | +| `name` | string | No | Corrected run name | + +#### Output + +This tool does not produce any outputs. + +### `langsmith_get_run` + +Retrieve a single LangSmith run by ID. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | LangSmith API key | +| `runId` | string | Yes | ID of the run to retrieve | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Run ID | +| `runId` | string | Run ID \(alias of id, for consistency with other operations\) | +| `name` | string | Run name | +| `runType` | string | Run type \(tool, chain, llm, retriever, embedding, prompt, parser\) | +| `status` | string | Run status | +| `startTime` | string | Run start time \(ISO\) | +| `endTime` | string | Run end time \(ISO\) | +| `inputs` | json | Run inputs payload | +| `outputs` | json | Run outputs payload | +| `error` | string | Error details, if the run failed | +| `tags` | array | Tags attached to the run | +| `sessionId` | string | Project \(session\) ID the run belongs to | +| `traceId` | string | Trace ID | +| `parentRunId` | string | Parent run ID | +| `totalTokens` | number | Total tokens consumed by the run | +| `totalCost` | string | Total cost of the run | + +### `langsmith_create_feedback` + +Attach a score, correction, or comment to a LangSmith run. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | LangSmith API key | +| `runId` | string | Yes | ID of the run to attach feedback to | +| `key` | string | Yes | Feedback metric name \(e.g. "correctness", "user_score"\) | +| `score` | number | No | Numeric score for the feedback metric | +| `value` | string | No | Categorical value for the feedback metric | +| `comment` | string | No | Free-text comment explaining the feedback | +| `correction` | json | No | Corrected output for the run | +| `feedbackSourceType` | string | No | Origin of the feedback \(api, app, or model\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Feedback ID | +| `key` | string | Feedback metric name | +| `runId` | string | ID of the run the feedback was attached to | +| `score` | number | Score recorded for the feedback | +| `value` | string | Categorical value recorded for the feedback | +| `comment` | string | Comment recorded for the feedback | +| `createdAt` | string | When the feedback was created \(ISO\) | + diff --git a/apps/docs/content/docs/en/integrations/loops.mdx b/apps/docs/content/docs/en/integrations/loops.mdx index d46ec807111..1a37c87b872 100644 --- a/apps/docs/content/docs/en/integrations/loops.mdx +++ b/apps/docs/content/docs/en/integrations/loops.mdx @@ -205,7 +205,7 @@ Retrieve all mailing lists from your Loops account. Returns each list with its I ### `loops_list_transactional_emails` -Retrieve a list of published transactional email templates from your Loops account. Returns each template with its ID, name, last updated timestamp, and data variables. +Retrieve a list of published transactional email templates from your Loops account. Returns each template with its ID, name, created/updated timestamps, and data variables. #### Input @@ -222,7 +222,9 @@ Retrieve a list of published transactional email templates from your Loops accou | `transactionalEmails` | array | Array of published transactional email templates | | ↳ `id` | string | The transactional email template ID | | ↳ `name` | string | The template name | -| ↳ `lastUpdated` | string | Last updated timestamp | +| ↳ `createdAt` | string | Creation timestamp \(ISO 8601\) | +| ↳ `updatedAt` | string | Last updated timestamp \(ISO 8601\) | +| ↳ `lastUpdated` | string | Deprecated alias of updatedAt, kept for backwards compatibility | | ↳ `dataVariables` | array | Template data variable names | | `pagination` | object | Pagination information | | ↳ `totalResults` | number | Total number of results | @@ -270,6 +272,74 @@ Retrieve a list of contact properties from your Loops account. Returns each prop | ↳ `label` | string | The property display label | | ↳ `type` | string | The property data type \(string, number, boolean, date\) | +### `loops_check_contact_suppression` + +Check whether a Loops contact is on the suppression list (bounced, complained, or unsubscribed) by email address or userId. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Loops API key for authentication | +| `email` | string | No | The contact email address to check \(at least one of email or userId is required\) | +| `userId` | string | No | The contact userId to check \(at least one of email or userId is required\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `contactId` | string | The Loops-assigned contact ID | +| `email` | string | The contact email address | +| `userId` | string | The contact userId | +| `isSuppressed` | boolean | Whether the contact is on the suppression list | +| `removalQuotaLimit` | number | Total suppression-removal quota for the team | +| `removalQuotaRemaining` | number | Remaining suppression-removal quota for the team | + +### `loops_remove_contact_suppression` + +Remove a Loops contact from the suppression list by email address or userId, allowing them to receive emails again. Subject to a team removal quota. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Loops API key for authentication | +| `email` | string | No | The contact email address to remove from suppression \(at least one of email or userId is required\) | +| `userId` | string | No | The contact userId to remove from suppression \(at least one of email or userId is required\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `success` | boolean | Whether the contact was removed from suppression successfully | +| `message` | string | Status message from the API | +| `removalQuotaLimit` | number | Total suppression-removal quota for the team | +| `removalQuotaRemaining` | number | Remaining suppression-removal quota for the team | + +### `loops_get_transactional_email` + +Retrieve a single transactional email template from your Loops account by its ID, including its data variables and draft/published message IDs. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Loops API key for authentication | +| `transactionalId` | string | Yes | The ID of the transactional email template to retrieve | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | The transactional email template ID | +| `name` | string | The template name | +| `draftEmailMessageId` | string | ID of the draft email message, if any | +| `publishedEmailMessageId` | string | ID of the published email message, if any | +| `transactionalGroupId` | string | ID of the transactional group this template belongs to, if any | +| `createdAt` | string | Creation timestamp \(ISO 8601\) | +| `updatedAt` | string | Last updated timestamp \(ISO 8601\) | +| `dataVariables` | array | Template data variable names | + ## Triggers diff --git a/apps/docs/content/docs/en/integrations/onepassword.mdx b/apps/docs/content/docs/en/integrations/onepassword.mdx index 33f1adea356..3cb2659076a 100644 --- a/apps/docs/content/docs/en/integrations/onepassword.mdx +++ b/apps/docs/content/docs/en/integrations/onepassword.mdx @@ -29,7 +29,7 @@ By connecting Sim with 1Password, you empower your agents to securely manage sec ## Usage Instructions -Access and manage secrets stored in 1Password vaults using the Connect API or Service Account SDK. List vaults, retrieve items with their fields and secrets, create new items, update existing ones, delete items, and resolve secret references. +Access and manage secrets stored in 1Password vaults using the Connect API or Service Account SDK. List vaults, retrieve items with their fields and secrets, download attached files, create new items, update existing ones, delete items, and resolve secret references. @@ -59,7 +59,7 @@ List all vaults accessible by the Connect token or Service Account | ↳ `description` | string | Vault description | | ↳ `attributeVersion` | number | Vault attribute version | | ↳ `contentVersion` | number | Vault content version | -| ↳ `type` | string | Vault type \(USER_CREATED, PERSONAL, EVERYONE, TRANSFER\) | +| ↳ `type` | string | Vault type \(USER_CREATED, PERSONAL, or EVERYONE\) | | ↳ `createdAt` | string | Creation timestamp | | ↳ `updatedAt` | string | Last update timestamp | @@ -87,7 +87,7 @@ Get details of a specific vault by ID | `attributeVersion` | number | Vault attribute version | | `contentVersion` | number | Vault content version | | `items` | number | Number of items in the vault | -| `type` | string | Vault type \(USER_CREATED, PERSONAL, EVERYONE, TRANSFER\) | +| `type` | string | Vault type \(USER_CREATED, PERSONAL, or EVERYONE\) | | `createdAt` | string | Creation timestamp | | `updatedAt` | string | Last update timestamp | @@ -123,7 +123,7 @@ List items in a vault. Returns summaries without field values. | ↳ `favorite` | boolean | Whether the item is favorited | | ↳ `tags` | array | Item tags | | ↳ `version` | number | Item version number | -| ↳ `state` | string | Item state \(ARCHIVED or DELETED\) | +| ↳ `state` | string | Item state \(ARCHIVED, or absent/null when active\) | | ↳ `createdAt` | string | Creation timestamp | | ↳ `updatedAt` | string | Last update timestamp | | ↳ `lastEditedBy` | string | ID of the last editor | @@ -147,7 +147,53 @@ Get full details of an item including all fields and secrets | Parameter | Type | Description | | --------- | ---- | ----------- | -| `response` | json | Operation response data | +| `response` | json | Deprecated — kept for backward compatibility with workflows saved before per-operation outputs were added below. Never populated; use the operation-specific outputs instead. | +| `vaults` | json | List of accessible vaults \[\{id, name, description, items, type, createdAt, updatedAt\}\] | +| `id` | string | Vault or item ID | +| `name` | string | Vault name | +| `description` | string | Vault description | +| `items` | json | Number of items in the vault \(Get Vault\) or item summaries \[\{id, title, category, tags, favorite, version, updatedAt\}\] \(List Items\) | +| `type` | string | Vault type \(USER_CREATED, PERSONAL, or EVERYONE\) | +| `title` | string | Item title | +| `category` | string | Item category \(e.g., LOGIN, API_CREDENTIAL, SECURE_NOTE\) | +| `vault` | json | Vault reference the item belongs to \{id\} | +| `fields` | json | Item fields including secrets \[\{id, label, type, purpose, value\}\] | +| `sections` | json | Item sections \[\{id, label\}\] | +| `files` | json | Files attached to the item \[\{id, name, size, section\}\] — fetch content with Get Item File | +| `tags` | json | Item tags | +| `urls` | json | URLs associated with the item \[\{href, label, primary\}\] | +| `favorite` | boolean | Whether the item is favorited | +| `version` | number | Item version number | +| `state` | string | Item state \(ARCHIVED, or absent/null when active\) | +| `lastEditedBy` | string | ID of the last editor | +| `createdAt` | string | Creation timestamp | +| `updatedAt` | string | Last update timestamp | +| `success` | boolean | Whether the item was successfully deleted | +| `value` | string | The resolved secret value | +| `reference` | string | The original secret reference URI | +| `file` | file | Downloaded file attachment | + +### `onepassword_get_item_file` + +Download the content of a file attached to an item + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `connectionMode` | string | No | Connection mode: "service_account" or "connect" | +| `serviceAccountToken` | string | No | 1Password Service Account token \(for Service Account mode\) | +| `apiKey` | string | No | 1Password Connect API token \(for Connect Server mode\) | +| `serverUrl` | string | No | 1Password Connect server URL \(for Connect Server mode\) | +| `vaultId` | string | Yes | The vault UUID | +| `itemId` | string | Yes | The item UUID the file is attached to | +| `fileId` | string | Yes | The file ID \(from the item\'s "files" array, e.g. via Get Item\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `file` | file | Downloaded file attachment | ### `onepassword_create_item` @@ -165,13 +211,37 @@ Create a new item in a vault | `category` | string | Yes | Item category \(e.g., LOGIN, PASSWORD, API_CREDENTIAL, SECURE_NOTE, SERVER, DATABASE\) | | `title` | string | No | Item title | | `tags` | string | No | Comma-separated list of tags | -| `fields` | string | No | JSON array of field objects \(e.g., \[\{"label":"username","value":"admin","type":"STRING","purpose":"USERNAME"\}\]\) | +| `fields` | string | No | JSON array of field objects \(e.g., \[\{"label":"username","value":"admin","type":"STRING","purpose":"USERNAME"\}\]\). "purpose" is honored in Connect Server mode; in Service Account mode 1Password infers it from the field label/type instead. | #### Output | Parameter | Type | Description | | --------- | ---- | ----------- | -| `response` | json | Operation response data | +| `response` | json | Deprecated — kept for backward compatibility with workflows saved before per-operation outputs were added below. Never populated; use the operation-specific outputs instead. | +| `vaults` | json | List of accessible vaults \[\{id, name, description, items, type, createdAt, updatedAt\}\] | +| `id` | string | Vault or item ID | +| `name` | string | Vault name | +| `description` | string | Vault description | +| `items` | json | Number of items in the vault \(Get Vault\) or item summaries \[\{id, title, category, tags, favorite, version, updatedAt\}\] \(List Items\) | +| `type` | string | Vault type \(USER_CREATED, PERSONAL, or EVERYONE\) | +| `title` | string | Item title | +| `category` | string | Item category \(e.g., LOGIN, API_CREDENTIAL, SECURE_NOTE\) | +| `vault` | json | Vault reference the item belongs to \{id\} | +| `fields` | json | Item fields including secrets \[\{id, label, type, purpose, value\}\] | +| `sections` | json | Item sections \[\{id, label\}\] | +| `files` | json | Files attached to the item \[\{id, name, size, section\}\] — fetch content with Get Item File | +| `tags` | json | Item tags | +| `urls` | json | URLs associated with the item \[\{href, label, primary\}\] | +| `favorite` | boolean | Whether the item is favorited | +| `version` | number | Item version number | +| `state` | string | Item state \(ARCHIVED, or absent/null when active\) | +| `lastEditedBy` | string | ID of the last editor | +| `createdAt` | string | Creation timestamp | +| `updatedAt` | string | Last update timestamp | +| `success` | boolean | Whether the item was successfully deleted | +| `value` | string | The resolved secret value | +| `reference` | string | The original secret reference URI | +| `file` | file | Downloaded file attachment | ### `onepassword_replace_item` @@ -193,7 +263,31 @@ Replace an entire item with new data (full update) | Parameter | Type | Description | | --------- | ---- | ----------- | -| `response` | json | Operation response data | +| `response` | json | Deprecated — kept for backward compatibility with workflows saved before per-operation outputs were added below. Never populated; use the operation-specific outputs instead. | +| `vaults` | json | List of accessible vaults \[\{id, name, description, items, type, createdAt, updatedAt\}\] | +| `id` | string | Vault or item ID | +| `name` | string | Vault name | +| `description` | string | Vault description | +| `items` | json | Number of items in the vault \(Get Vault\) or item summaries \[\{id, title, category, tags, favorite, version, updatedAt\}\] \(List Items\) | +| `type` | string | Vault type \(USER_CREATED, PERSONAL, or EVERYONE\) | +| `title` | string | Item title | +| `category` | string | Item category \(e.g., LOGIN, API_CREDENTIAL, SECURE_NOTE\) | +| `vault` | json | Vault reference the item belongs to \{id\} | +| `fields` | json | Item fields including secrets \[\{id, label, type, purpose, value\}\] | +| `sections` | json | Item sections \[\{id, label\}\] | +| `files` | json | Files attached to the item \[\{id, name, size, section\}\] — fetch content with Get Item File | +| `tags` | json | Item tags | +| `urls` | json | URLs associated with the item \[\{href, label, primary\}\] | +| `favorite` | boolean | Whether the item is favorited | +| `version` | number | Item version number | +| `state` | string | Item state \(ARCHIVED, or absent/null when active\) | +| `lastEditedBy` | string | ID of the last editor | +| `createdAt` | string | Creation timestamp | +| `updatedAt` | string | Last update timestamp | +| `success` | boolean | Whether the item was successfully deleted | +| `value` | string | The resolved secret value | +| `reference` | string | The original secret reference URI | +| `file` | file | Downloaded file attachment | ### `onepassword_update_item` @@ -215,7 +309,31 @@ Update an existing item using JSON Patch operations (RFC6902) | Parameter | Type | Description | | --------- | ---- | ----------- | -| `response` | json | Operation response data | +| `response` | json | Deprecated — kept for backward compatibility with workflows saved before per-operation outputs were added below. Never populated; use the operation-specific outputs instead. | +| `vaults` | json | List of accessible vaults \[\{id, name, description, items, type, createdAt, updatedAt\}\] | +| `id` | string | Vault or item ID | +| `name` | string | Vault name | +| `description` | string | Vault description | +| `items` | json | Number of items in the vault \(Get Vault\) or item summaries \[\{id, title, category, tags, favorite, version, updatedAt\}\] \(List Items\) | +| `type` | string | Vault type \(USER_CREATED, PERSONAL, or EVERYONE\) | +| `title` | string | Item title | +| `category` | string | Item category \(e.g., LOGIN, API_CREDENTIAL, SECURE_NOTE\) | +| `vault` | json | Vault reference the item belongs to \{id\} | +| `fields` | json | Item fields including secrets \[\{id, label, type, purpose, value\}\] | +| `sections` | json | Item sections \[\{id, label\}\] | +| `files` | json | Files attached to the item \[\{id, name, size, section\}\] — fetch content with Get Item File | +| `tags` | json | Item tags | +| `urls` | json | URLs associated with the item \[\{href, label, primary\}\] | +| `favorite` | boolean | Whether the item is favorited | +| `version` | number | Item version number | +| `state` | string | Item state \(ARCHIVED, or absent/null when active\) | +| `lastEditedBy` | string | ID of the last editor | +| `createdAt` | string | Creation timestamp | +| `updatedAt` | string | Last update timestamp | +| `success` | boolean | Whether the item was successfully deleted | +| `value` | string | The resolved secret value | +| `reference` | string | The original secret reference URI | +| `file` | file | Downloaded file attachment | ### `onepassword_delete_item` diff --git a/apps/docs/content/docs/en/integrations/sendgrid.mdx b/apps/docs/content/docs/en/integrations/sendgrid.mdx index 0b32ebc50af..a8cb7010e7e 100644 --- a/apps/docs/content/docs/en/integrations/sendgrid.mdx +++ b/apps/docs/content/docs/en/integrations/sendgrid.mdx @@ -206,13 +206,15 @@ Get all contact lists from SendGrid | Parameter | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `apiKey` | string | Yes | SendGrid API key | -| `pageSize` | number | No | Number of lists to return per page \(default: 100\) | +| `pageSize` | number | No | Number of lists to return per page \(default: 100, max: 1000\) | +| `pageToken` | string | No | Page token from a previous response \(nextPageToken\) to fetch the next page | #### Output | Parameter | Type | Description | | --------- | ---- | ----------- | | `lists` | json | Array of lists | +| `nextPageToken` | string | Token to pass as pageToken to fetch the next page, if more results exist | ### `sendgrid_delete_list` @@ -321,13 +323,17 @@ Get all email templates from SendGrid | --------- | ---- | -------- | ----------- | | `apiKey` | string | Yes | SendGrid API key | | `generations` | string | No | Filter by generation \(legacy, dynamic, or both\) | -| `pageSize` | number | No | Number of templates to return per page \(default: 20\) | +| `pageSize` | number | No | Number of templates to return per page \(default: 20, max: 200\). ' + + 'When paginating with pageToken, pass the same pageSize used on the first request ' + + 'to keep page boundaries consistent. | +| `pageToken` | string | No | Page token from a previous response \(nextPageToken\) to fetch the next page | #### Output | Parameter | Type | Description | | --------- | ---- | ----------- | | `templates` | json | Array of templates | +| `nextPageToken` | string | Token to pass as pageToken to fetch the next page, if more results exist | ### `sendgrid_delete_template` @@ -365,6 +371,7 @@ Delete an email template from SendGrid | `templates` | json | Array of templates | | `generation` | string | Template generation | | `versions` | json | Array of template versions | +| `nextPageToken` | string | Token for the next page of results \(list_all_lists, list_templates\) | | `templateId` | string | Template ID | | `active` | boolean | Whether template version is active | | `htmlContent` | string | HTML content | diff --git a/apps/docs/content/docs/en/integrations/sharepoint.mdx b/apps/docs/content/docs/en/integrations/sharepoint.mdx index bb9bc4df74b..9dcf1db6596 100644 --- a/apps/docs/content/docs/en/integrations/sharepoint.mdx +++ b/apps/docs/content/docs/en/integrations/sharepoint.mdx @@ -107,6 +107,71 @@ Read a specific page from a SharePoint site | `totalPages` | number | Total number of pages found | | `nextPageUrl` | string | Full Microsoft Graph @odata.nextLink URL for the next page of results | +### `sharepoint_update_page` + +Update the title and/or content of a SharePoint page + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `siteId` | string | No | The ID of the SharePoint site \(internal use\) | +| `siteSelector` | string | No | Select the SharePoint site | +| `pageId` | string | Yes | The ID of the page to update. Example: a GUID like 12345678-1234-1234-1234-123456789012 | +| `pageTitle` | string | No | The new title of the page | +| `pageContent` | string | No | The new text content of the page. Replaces the entire canvas layout of the page. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `page` | object | Updated SharePoint page information | +| ↳ `id` | string | The unique ID of the page | +| ↳ `name` | string | The name of the page | +| ↳ `title` | string | The title of the page | +| ↳ `webUrl` | string | The URL to access the page | +| ↳ `pageLayout` | string | The layout type of the page | +| ↳ `createdDateTime` | string | When the page was created | +| ↳ `lastModifiedDateTime` | string | When the page was last modified | + +### `sharepoint_publish_page` + +Publish the latest version of a SharePoint page, making it available to all users + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `siteSelector` | string | No | Select the SharePoint site | +| `siteId` | string | No | The ID of the SharePoint site \(internal use\) | +| `pageId` | string | Yes | The ID of the page to publish. Example: a GUID like 12345678-1234-1234-1234-123456789012 | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `published` | boolean | Whether the page was published | +| `pageId` | string | The ID of the published page | + +### `sharepoint_delete_page` + +Delete a page from a SharePoint site + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `siteSelector` | string | No | Select the SharePoint site | +| `siteId` | string | No | The ID of the SharePoint site \(internal use\) | +| `pageId` | string | Yes | The ID of the page to delete. Example: a GUID like 12345678-1234-1234-1234-123456789012 | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `deleted` | boolean | Whether the page was deleted | +| `pageId` | string | The ID of the deleted page | + ### `sharepoint_list_sites` List details of all SharePoint sites @@ -133,8 +198,7 @@ List details of all SharePoint sites | ↳ `createdDateTime` | string | When the site was created | | ↳ `lastModifiedDateTime` | string | When the site was last modified | | ↳ `isPersonalSite` | boolean | Whether this is a personal site | -| ↳ `root` | object | root output from the tool | -| ↳ `serverRelativeUrl` | string | Server relative URL | +| ↳ `root` | object | Present \(as an empty object\) only when this site is the root of its site collection | | ↳ `siteCollection` | object | siteCollection output from the tool | | ↳ `hostname` | string | Site collection hostname | | `sites` | array | List of all accessible SharePoint sites | @@ -252,6 +316,47 @@ Add a new item to a SharePoint list | ↳ `id` | string | Item ID | | ↳ `fields` | object | Field values for the new item | +### `sharepoint_get_list_item` + +Get a single item (with field values) from a SharePoint list + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `siteSelector` | string | No | Select the SharePoint site | +| `siteId` | string | No | The ID of the SharePoint site \(internal use\) | +| `listId` | string | Yes | The ID of the list containing the item. Example: b!abc123def456 or a GUID like 12345678-1234-1234-1234-123456789012 | +| `itemId` | string | Yes | The ID of the list item to retrieve. Example: 1, 42, or 123 | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `item` | object | SharePoint list item with field values | +| ↳ `id` | string | Item ID | +| ↳ `fields` | object | Field values for the item | + +### `sharepoint_delete_list_item` + +Delete an item from a SharePoint list + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `siteSelector` | string | No | Select the SharePoint site | +| `siteId` | string | No | The ID of the SharePoint site \(internal use\) | +| `listId` | string | Yes | The ID of the list containing the item. Example: b!abc123def456 or a GUID like 12345678-1234-1234-1234-123456789012 | +| `itemId` | string | Yes | The ID of the list item to delete. Example: 1, 42, or 123 | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `deleted` | boolean | Whether the list item was deleted | +| `itemId` | string | The ID of the deleted list item | + ### `sharepoint_upload_file` Upload files to a SharePoint document library @@ -289,4 +394,66 @@ Upload files to a SharePoint document library | ↳ `error` | string | Error message | | ↳ `status` | number | HTTP status from Microsoft Graph | +### `sharepoint_download_file` + +Download a file from a SharePoint document library + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `driveId` | string | Yes | The ID of the document library \(drive\). Example: b!abc123def456 | +| `driveItemId` | string | Yes | The ID of the file \(drive item\) to download | +| `fileName` | string | No | Optional filename override \(e.g., "report.pdf", "data.xlsx"\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `file` | file | Downloaded file stored in execution files | + +### `sharepoint_get_drive_item` + +Get metadata for a file or folder in a SharePoint document library + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `driveId` | string | Yes | The ID of the document library \(drive\). Example: b!abc123def456 | +| `driveItemId` | string | Yes | The ID of the file or folder \(drive item\) to retrieve | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `driveItem` | object | Metadata for the SharePoint file or folder | +| ↳ `id` | string | The unique ID of the drive item | +| ↳ `name` | string | The name of the file or folder | +| ↳ `webUrl` | string | The URL to access the item | +| ↳ `size` | number | The size of the item in bytes | +| ↳ `createdDateTime` | string | When the item was created | +| ↳ `lastModifiedDateTime` | string | When the item was last modified | +| ↳ `file` | object | Present if the item is a file \(contains mimeType\) | +| ↳ `folder` | object | Present if the item is a folder \(contains childCount\) | +| ↳ `parentReference` | object | Reference to the parent folder/drive | + +### `sharepoint_delete_file` + +Delete a file (or folder) from a SharePoint document library + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `driveId` | string | Yes | The ID of the document library \(drive\). Example: b!abc123def456 | +| `driveItemId` | string | Yes | The ID of the file \(drive item\) to delete | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `deleted` | boolean | Whether the file was deleted | +| `itemId` | string | The ID of the deleted file | + diff --git a/apps/docs/content/docs/en/integrations/similarweb.mdx b/apps/docs/content/docs/en/integrations/similarweb.mdx index cbdf82ddc28..b3091f7e947 100644 --- a/apps/docs/content/docs/en/integrations/similarweb.mdx +++ b/apps/docs/content/docs/en/integrations/similarweb.mdx @@ -180,4 +180,32 @@ Get average desktop visit duration over time (in seconds) | ↳ `date` | string | Date \(YYYY-MM-DD\) | | ↳ `durationSeconds` | number | Average visit duration in seconds | +### `similarweb_page_views` + +Get total page views over time (desktop and mobile combined) + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | SimilarWeb API key | +| `domain` | string | Yes | Website domain to analyze \(e.g., "example.com" without www or protocol\) | +| `country` | string | Yes | 2-letter ISO country code \(e.g., "us", "gb", "de"\) or "world" for worldwide data | +| `granularity` | string | Yes | Data granularity: daily, weekly, or monthly | +| `startDate` | string | No | Start date in YYYY-MM format \(e.g., "2024-01"\) | +| `endDate` | string | No | End date in YYYY-MM format \(e.g., "2024-12"\) | +| `mainDomainOnly` | boolean | No | Exclude subdomains from results | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `domain` | string | Analyzed domain | +| `country` | string | Country filter applied | +| `granularity` | string | Data granularity | +| `lastUpdated` | string | Data last updated timestamp | +| `pageViews` | array | Page view data over time | +| ↳ `date` | string | Date \(YYYY-MM-DD\) | +| ↳ `pageViews` | number | Total page views | + diff --git a/apps/docs/content/docs/en/integrations/supabase.mdx b/apps/docs/content/docs/en/integrations/supabase.mdx index 1741ceb55a1..e5c339c3dc6 100644 --- a/apps/docs/content/docs/en/integrations/supabase.mdx +++ b/apps/docs/content/docs/en/integrations/supabase.mdx @@ -288,7 +288,7 @@ Invoke a Supabase Edge Function over HTTP ### `supabase_introspect` -Introspect Supabase database schema to get table structures, columns, and relationships +Introspect Supabase database schema from its OpenAPI spec to get table and column structures (best-effort primary/foreign key detection) #### Input @@ -309,11 +309,11 @@ Introspect Supabase database schema to get table structures, columns, and relati | ↳ `columns` | array | Array of column definitions | | ↳ `name` | string | Column name | | ↳ `type` | string | Column data type | -| ↳ `nullable` | boolean | Whether the column allows null values | +| ↳ `nullable` | boolean | Whether the column allows null values — a NOT NULL column that has a default value is misreported as nullable, since the OpenAPI spec this is derived from omits it from the required list in that case | | ↳ `default` | string | Default value for the column | -| ↳ `isPrimaryKey` | boolean | Whether the column is a primary key | -| ↳ `isForeignKey` | boolean | Whether the column is a foreign key | -| ↳ `references` | object | Foreign key reference details | +| ↳ `isPrimaryKey` | boolean | Best-effort guess based on the column being named "id" \(not authoritative\) | +| ↳ `isForeignKey` | boolean | True only if the column has a "references table.column" SQL comment; most databases will show false even for real foreign keys | +| ↳ `references` | object | Foreign key reference details, when detected via SQL comment | | ↳ `table` | string | Referenced table name | | ↳ `column` | string | Referenced column name | | ↳ `primaryKey` | array | Array of primary key column names | @@ -321,7 +321,7 @@ Introspect Supabase database schema to get table structures, columns, and relati | ↳ `column` | string | Local column name | | ↳ `referencesTable` | string | Referenced table name | | ↳ `referencesColumn` | string | Referenced column name | -| ↳ `indexes` | array | Array of index definitions | +| ↳ `indexes` | array | Always empty — index definitions are not exposed by the OpenAPI spec this tool reads | | ↳ `name` | string | Index name | | ↳ `columns` | array | Columns included in the index | | ↳ `unique` | boolean | Whether the index enforces uniqueness | @@ -512,6 +512,49 @@ Create a new storage bucket in Supabase | `results` | object | Created bucket result \(name\) | | ↳ `name` | string | Created bucket name | +### `supabase_storage_update_bucket` + +Update the configuration of an existing Supabase storage bucket + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `projectId` | string | Yes | Your Supabase project ID \(e.g., jdrkgepadsdopsntdlom\) | +| `bucket` | string | Yes | The name of the bucket to update | +| `isPublic` | boolean | No | Whether the bucket should be publicly accessible \(leave unset to keep the current value\) | +| `fileSizeLimit` | number | No | Maximum file size in bytes \(leave unset to keep the current value\) | +| `allowedMimeTypes` | array | No | Array of allowed MIME types \(e.g., \["image/png", "image/jpeg"\]\) — leave unset to keep the current value | +| `apiKey` | string | Yes | Your Supabase service role secret key | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `message` | string | Operation status message | +| `results` | object | Update operation result | +| ↳ `message` | string | Operation status message | + +### `supabase_storage_empty_bucket` + +Delete all objects inside a Supabase storage bucket without deleting the bucket itself + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `projectId` | string | Yes | Your Supabase project ID \(e.g., jdrkgepadsdopsntdlom\) | +| `bucket` | string | Yes | The name of the bucket to empty | +| `apiKey` | string | Yes | Your Supabase service role secret key | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `message` | string | Operation status message | +| `results` | object | Empty bucket operation result | +| ↳ `message` | string | Operation status message | + ### `supabase_storage_list_buckets` List all storage buckets in Supabase @@ -570,7 +613,6 @@ Get the public URL for a file in a Supabase storage bucket | `bucket` | string | Yes | The name of the storage bucket | | `path` | string | Yes | The path to the file \(e.g., "folder/file.jpg"\) | | `download` | boolean | No | If true, forces download instead of inline display \(default: false\) | -| `output` | string | No | No description | #### Output @@ -601,4 +643,27 @@ Create a temporary signed URL for a file in a Supabase storage bucket | `message` | string | Operation status message | | `signedUrl` | string | The temporary signed URL to access the file | +### `supabase_storage_create_signed_upload_url` + +Create a temporary signed URL a client can use to upload directly to a Supabase storage bucket + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `projectId` | string | Yes | Your Supabase project ID \(e.g., jdrkgepadsdopsntdlom\) | +| `bucket` | string | Yes | The name of the storage bucket | +| `path` | string | Yes | The destination path for the uploaded file \(e.g., "folder/file.jpg"\) | +| `upsert` | boolean | No | If true, allows overwriting an existing file at this path \(default: false\) | +| `apiKey` | string | Yes | Your Supabase service role secret key | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `message` | string | Operation status message | +| `signedUrl` | string | The temporary signed URL a client can PUT the file to | +| `path` | string | The destination object path | +| `token` | string | The upload token embedded in the signed URL | + diff --git a/apps/docs/content/docs/en/integrations/tailscale.mdx b/apps/docs/content/docs/en/integrations/tailscale.mdx index e5e97f6b7fe..e1dfc2dbc01 100644 --- a/apps/docs/content/docs/en/integrations/tailscale.mdx +++ b/apps/docs/content/docs/en/integrations/tailscale.mdx @@ -67,7 +67,8 @@ List all devices in the tailnet | Parameter | Type | Description | | --------- | ---- | ----------- | | `devices` | array | List of devices in the tailnet | -| ↳ `id` | string | Device ID | +| ↳ `id` | string | Legacy device ID | +| ↳ `nodeId` | string | Preferred device ID | | ↳ `name` | string | Device name | | ↳ `hostname` | string | Device hostname | | ↳ `user` | string | Associated user | @@ -77,6 +78,8 @@ List all devices in the tailnet | ↳ `tags` | array | Device tags | | ↳ `authorized` | boolean | Whether the device is authorized | | ↳ `blocksIncomingConnections` | boolean | Whether the device blocks incoming connections | +| ↳ `keyExpiryDisabled` | boolean | Whether the device key is exempt from expiring | +| ↳ `expires` | string | The device's auth key expiration timestamp | | ↳ `lastSeen` | string | Last seen timestamp | | ↳ `created` | string | Creation timestamp | | `count` | number | Total number of devices | @@ -97,7 +100,8 @@ Get details of a specific device by ID | Parameter | Type | Description | | --------- | ---- | ----------- | -| `id` | string | Device ID | +| `id` | string | Legacy device ID | +| `nodeId` | string | Preferred device ID | | `name` | string | Device name | | `hostname` | string | Device hostname | | `user` | string | Associated user | @@ -107,6 +111,8 @@ Get details of a specific device by ID | `tags` | array | Device tags | | `authorized` | boolean | Whether the device is authorized | | `blocksIncomingConnections` | boolean | Whether the device blocks incoming connections | +| `keyExpiryDisabled` | boolean | Whether the device key is exempt from expiring | +| `expires` | string | The device's auth key expiration timestamp | | `lastSeen` | string | Last seen timestamp | | `created` | string | Creation timestamp | | `isExternal` | boolean | Whether the device is external | @@ -235,6 +241,25 @@ Enable or disable key expiry on a device | `deviceId` | string | Device ID | | `keyExpiryDisabled` | boolean | Whether key expiry is now disabled | +### `tailscale_expire_device_key` + +Immediately expire a device's node key, requiring it to re-authenticate before it can reconnect to the tailnet + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Tailscale API key | +| `tailnet` | string | Yes | Tailnet name \(e.g., example.com\) or "-" for default | +| `deviceId` | string | Yes | Device ID to expire the key for | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `success` | boolean | Whether the device's key was successfully expired | +| `deviceId` | string | Device ID | + ### `tailscale_list_dns_nameservers` Get the DNS nameservers configured for the tailnet @@ -251,7 +276,6 @@ Get the DNS nameservers configured for the tailnet | Parameter | Type | Description | | --------- | ---- | ----------- | | `dns` | array | List of DNS nameserver addresses | -| `magicDNS` | boolean | Whether MagicDNS is enabled | ### `tailscale_set_dns_nameservers` @@ -370,6 +394,44 @@ List all users in the tailnet | ↳ `deviceCount` | number | Number of devices owned by user | | `count` | number | Total number of users | +### `tailscale_suspend_user` + +Suspend a user's access to the tailnet + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Tailscale API key | +| `tailnet` | string | Yes | Tailnet name \(e.g., example.com\) or "-" for default | +| `userId` | string | Yes | User ID to suspend | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `success` | boolean | Whether the user was successfully suspended | +| `userId` | string | ID of the suspended user | + +### `tailscale_delete_user` + +Delete a user from the tailnet + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Tailscale API key | +| `tailnet` | string | Yes | Tailnet name \(e.g., example.com\) or "-" for default | +| `userId` | string | Yes | User ID to delete | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `success` | boolean | Whether the user was successfully deleted | +| `userId` | string | ID of the deleted user | + ### `tailscale_create_auth_key` Create a new auth key for the tailnet to pre-authorize devices @@ -495,4 +557,24 @@ Get the current ACL policy for the tailnet | `acl` | string | ACL policy as JSON string | | `etag` | string | ETag for the current ACL version \(use with If-Match header for updates\) | +### `tailscale_set_acl` + +Replace the ACL policy file for the tailnet + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `apiKey` | string | Yes | Tailscale API key | +| `tailnet` | string | Yes | Tailnet name \(e.g., example.com\) or "-" for default | +| `acl` | string | Yes | The new ACL policy file, as a JSON string | +| `ifMatch` | string | No | ETag from a prior Get ACL call to avoid overwriting concurrent updates. Use "ts-default" to only replace an untouched default policy file. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `acl` | string | Updated ACL policy as JSON string | +| `etag` | string | ETag for the new ACL version \(use with If-Match header for future updates\) | + diff --git a/apps/docs/content/docs/en/integrations/trello.mdx b/apps/docs/content/docs/en/integrations/trello.mdx index 86cdef85b99..c1f4b806418 100644 --- a/apps/docs/content/docs/en/integrations/trello.mdx +++ b/apps/docs/content/docs/en/integrations/trello.mdx @@ -1,6 +1,6 @@ --- title: Trello -description: Manage Trello lists, cards, and activity +description: Manage Trello lists, cards, checklists, and activity --- import { BlockInfoCard } from "@/components/ui/block-info-card" @@ -37,7 +37,7 @@ Trello's authorization flow redirects back to Sim using a `return_url`. If your {/* MANUAL-CONTENT-END */} -Integrate with Trello to list board lists, list cards, create cards, update cards, review activity, and add comments. +Integrate with Trello to list, search, create, update, and delete cards and lists, manage checklists and checklist items, assign labels and members, review activity, and add comments. @@ -52,6 +52,7 @@ List all lists on a Trello board | Parameter | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `boardId` | string | Yes | Trello board ID \(24-character hex string\) | +| `filter` | string | No | Which lists to return: open, closed, or all \(defaults to open\) | #### Output @@ -75,6 +76,7 @@ List cards from a Trello board or list | --------- | ---- | -------- | ----------- | | `boardId` | string | No | Trello board ID to list open cards from. Provide either boardId or listId | | `listId` | string | No | Trello list ID to list cards from. Provide either boardId or listId | +| `filter` | string | No | Which cards to return: open, closed, or all \(defaults to open\) | #### Output @@ -97,6 +99,40 @@ List cards from a Trello board or list | ↳ `dueComplete` | boolean | Whether the due date is complete | | `count` | number | Number of cards returned | +### `trello_search` + +Search Trello cards and boards by keyword + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `query` | string | Yes | Search text, supports Trello search operators \(e.g. board:, list:, due:\) | +| `idBoards` | array | No | Restrict the search to these board IDs | +| `modelTypes` | string | No | Comma-separated result types to search: cards, boards, or all \(default all\) | +| `cardsLimit` | number | No | Maximum number of cards to return \(1-1000, default 10\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `cards` | array | Cards matching the search query | +| ↳ `id` | string | Card ID | +| ↳ `name` | string | Card name | +| ↳ `desc` | string | Card description | +| ↳ `url` | string | Full card URL | +| ↳ `idBoard` | string | Board ID containing the card | +| ↳ `idList` | string | List ID containing the card | +| ↳ `closed` | boolean | Whether the card is archived | +| `boards` | array | Boards matching the search query | +| ↳ `id` | string | Board ID | +| ↳ `name` | string | Board name | +| ↳ `desc` | string | Board description | +| ↳ `url` | string | Full board URL | +| ↳ `closed` | boolean | Whether the board is archived | +| ↳ `idOrganization` | string | Workspace/organization ID that owns the board | +| `count` | number | Total number of cards and boards returned | + ### `trello_create_card` Create a new card in a Trello list @@ -112,6 +148,7 @@ Create a new card in a Trello list | `due` | string | No | Due date \(ISO 8601 format\) | | `dueComplete` | boolean | No | Whether the due date should be marked complete | | `labelIds` | array | No | Label IDs to attach to the card | +| `memberIds` | array | No | Member IDs to assign to the card | #### Output @@ -169,6 +206,22 @@ Update an existing card on Trello | ↳ `due` | string | Card due date in ISO 8601 format | | ↳ `dueComplete` | boolean | Whether the due date is complete | +### `trello_delete_card` + +Permanently delete a Trello card + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `cardId` | string | Yes | Trello card ID to permanently delete \(24-character hex string\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `success` | boolean | Whether the card was deleted | + ### `trello_get_actions` Get activity/actions from a board or card @@ -182,6 +235,8 @@ Get activity/actions from a board or card | `filter` | string | No | Filter actions by type \(e.g., "commentCard,updateCard,createCard" or "all"\) | | `limit` | number | No | Maximum number of board actions to return | | `page` | number | No | Page number for action results | +| `since` | string | No | Only return actions after this date \(ISO 8601 timestamp\) or action ID, for paging through long histories | +| `before` | string | No | Only return actions before this date \(ISO 8601 timestamp\) or action ID, for paging through long histories | #### Output @@ -321,6 +376,31 @@ Create a new list on a Trello board | ↳ `pos` | number | List position on the board | | ↳ `idBoard` | string | Board ID containing the list | +### `trello_update_list` + +Rename, move, archive, or reopen a Trello list + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `listId` | string | Yes | Trello list ID \(24-character hex string\) | +| `name` | string | No | New name of the list | +| `closed` | boolean | No | Archive the list \(true\) or reopen it \(false\) | +| `idBoard` | string | No | Board ID to move the list to \(24-character hex string\) | +| `pos` | string | No | New position of the list \(top, bottom, or positive float\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `list` | json | Updated list \(id, name, closed, pos, idBoard\) | +| ↳ `id` | string | List ID | +| ↳ `name` | string | List name | +| ↳ `closed` | boolean | Whether the list is archived | +| ↳ `pos` | number | List position on the board | +| ↳ `idBoard` | string | Board ID containing the list | + ### `trello_get_card` Retrieve a single Trello card by ID @@ -374,6 +454,54 @@ Add a checklist to a Trello card | ↳ `idBoard` | string | Board ID containing the checklist | | ↳ `pos` | number | Checklist position on the card | +### `trello_add_checklist_item` + +Add an item to a Trello checklist + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `checklistId` | string | Yes | Trello checklist ID to add the item to \(24-character hex string\) | +| `name` | string | Yes | Name of the checklist item | +| `pos` | string | No | Position of the item \(top, bottom, or positive float\) | +| `checked` | boolean | No | Whether the item should start checked off | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `item` | json | Created checklist item \(id, name, state, pos, idChecklist\) | +| ↳ `id` | string | Checklist item ID | +| ↳ `name` | string | Checklist item name | +| ↳ `state` | string | Item state \(complete or incomplete\) | +| ↳ `pos` | number | Item position on the checklist | +| ↳ `idChecklist` | string | Checklist ID containing the item | + +### `trello_update_checklist_item` + +Check off, uncheck, or rename a Trello checklist item + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `cardId` | string | Yes | Trello card ID that owns the checklist item \(24-character hex string\) | +| `checkItemId` | string | Yes | Checklist item ID to update \(24-character hex string\) | +| `state` | string | No | Set the item state to complete or incomplete | +| `name` | string | No | New name for the checklist item | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `item` | json | Updated checklist item \(id, name, state, pos, idChecklist\) | +| ↳ `id` | string | Checklist item ID | +| ↳ `name` | string | Checklist item name | +| ↳ `state` | string | Item state \(complete or incomplete\) | +| ↳ `pos` | number | Item position on the checklist | +| ↳ `idChecklist` | string | Checklist ID containing the item | + ### `trello_add_label` Attach an existing label to a Trello card @@ -391,6 +519,23 @@ Attach an existing label to a Trello card | --------- | ---- | ----------- | | `labelIds` | array | Label IDs now applied to the card | +### `trello_remove_label` + +Detach a label from a Trello card + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `cardId` | string | Yes | Trello card ID to detach the label from \(24-character hex string\) | +| `labelId` | string | Yes | ID of the label to detach \(24-character hex string\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `success` | boolean | Whether the label was removed from the card | + ### `trello_add_member` Assign a member to a Trello card @@ -408,4 +553,41 @@ Assign a member to a Trello card | --------- | ---- | ----------- | | `memberIds` | array | Member IDs now assigned to the card | +### `trello_remove_member` + +Unassign a member from a Trello card + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `cardId` | string | Yes | Trello card ID to unassign the member from \(24-character hex string\) | +| `memberId` | string | Yes | ID of the member to unassign \(24-character hex string\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `success` | boolean | Whether the member was removed from the card | + +### `trello_list_members` + +List members of a Trello board + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `boardId` | string | Yes | Trello board ID \(24-character hex string\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `members` | array | Members on the selected board | +| ↳ `id` | string | Member ID | +| ↳ `fullName` | string | Member full name | +| ↳ `username` | string | Member username | +| `count` | number | Number of members returned | + diff --git a/apps/docs/content/docs/en/integrations/vercel.mdx b/apps/docs/content/docs/en/integrations/vercel.mdx index 361ee626a5c..66b26629ca0 100644 --- a/apps/docs/content/docs/en/integrations/vercel.mdx +++ b/apps/docs/content/docs/en/integrations/vercel.mdx @@ -49,6 +49,7 @@ List deployments for a Vercel project or team | `until` | number | No | Get deployments created before this JavaScript timestamp | | `limit` | number | No | Maximum number of deployments to return per request | | `teamId` | string | No | Team ID to scope the request | +| `slug` | string | No | Team slug to scope the request \(alternative to teamId\) | #### Output @@ -87,6 +88,7 @@ Get details of a specific Vercel deployment | `deploymentId` | string | Yes | The unique deployment identifier or hostname | | `withGitRepoInfo` | string | No | Whether to add in gitRepo information \(true/false\) | | `teamId` | string | No | Team ID to scope the request | +| `slug` | string | No | Team slug to scope the request \(alternative to teamId\) | #### Output @@ -145,6 +147,7 @@ Create a new deployment or redeploy an existing one | `gitSource` | string | No | JSON string defining the Git Repository source to deploy \(e.g. \{"type":"github","repo":"owner/repo","ref":"main"\}\) | | `forceNew` | string | No | Forces a new deployment even if there is a previous similar deployment \(0 or 1\) | | `teamId` | string | No | Team ID to scope the request | +| `slug` | string | No | Team slug to scope the request \(alternative to teamId\) | #### Output @@ -174,6 +177,7 @@ Cancel a running Vercel deployment | `apiKey` | string | Yes | Vercel Access Token | | `deploymentId` | string | Yes | The deployment ID to cancel | | `teamId` | string | No | Team ID to scope the request | +| `slug` | string | No | Team slug to scope the request \(alternative to teamId\) | #### Output @@ -198,6 +202,7 @@ Delete a Vercel deployment | `apiKey` | string | Yes | Vercel Access Token | | `deploymentId` | string | Yes | The deployment ID or URL to delete | | `teamId` | string | No | Team ID to scope the request | +| `slug` | string | No | Team slug to scope the request \(alternative to teamId\) | #### Output @@ -222,6 +227,7 @@ Get build and runtime events for a Vercel deployment | `since` | number | No | Timestamp to start pulling build logs from | | `until` | number | No | Timestamp to stop pulling build logs at | | `teamId` | string | No | Team ID to scope the request | +| `slug` | string | No | Team slug to scope the request \(alternative to teamId\) | #### Output @@ -250,6 +256,7 @@ List files in a Vercel deployment | `apiKey` | string | Yes | Vercel Access Token | | `deploymentId` | string | Yes | The deployment ID to list files for | | `teamId` | string | No | Team ID to scope the request | +| `slug` | string | No | Team slug to scope the request \(alternative to teamId\) | #### Output @@ -279,6 +286,7 @@ Promote a deployment by pointing the production deployment to the given deployme | `projectId` | string | Yes | Project ID or name | | `deploymentId` | string | Yes | The ID of the deployment to promote to production | | `teamId` | string | No | Team ID to scope the request | +| `slug` | string | No | Team slug to scope the request \(alternative to teamId\) | #### Output @@ -297,7 +305,9 @@ List all projects in a Vercel team or account | `apiKey` | string | Yes | Vercel Access Token | | `search` | string | No | Search projects by name | | `limit` | number | No | Maximum number of projects to return | +| `from` | string | No | Continuation token for pagination, taken from the previous response's pagination.next value. Query only projects updated after this timestamp or continuation token. | | `teamId` | string | No | Team ID to scope the request | +| `slug` | string | No | Team slug to scope the request \(alternative to teamId\) | #### Output @@ -307,10 +317,13 @@ List all projects in a Vercel team or account | ↳ `id` | string | Project ID | | ↳ `name` | string | Project name | | ↳ `framework` | string | Framework | +| ↳ `rootDirectory` | string | Root directory of the project | +| ↳ `nodeVersion` | string | Node.js version | | ↳ `createdAt` | number | Creation timestamp | | ↳ `updatedAt` | number | Last updated timestamp | | `count` | number | Number of projects returned | | `hasMore` | boolean | Whether more projects are available | +| `nextFrom` | string | Continuation token to pass as `from` to fetch the next page | ### `vercel_get_project` @@ -323,6 +336,7 @@ Get details of a specific Vercel project | `apiKey` | string | Yes | Vercel Access Token | | `projectId` | string | Yes | Project ID or name | | `teamId` | string | No | Team ID to scope the request | +| `slug` | string | No | Team slug to scope the request \(alternative to teamId\) | #### Output @@ -331,6 +345,8 @@ Get details of a specific Vercel project | `id` | string | Project ID | | `name` | string | Project name | | `framework` | string | Project framework | +| `rootDirectory` | string | Root directory of the project | +| `nodeVersion` | string | Node.js version | | `createdAt` | number | Creation timestamp | | `updatedAt` | number | Last updated timestamp | | `link` | object | Git repository connection | @@ -353,7 +369,11 @@ Create a new Vercel project | `buildCommand` | string | No | Custom build command | | `outputDirectory` | string | No | Custom output directory | | `installCommand` | string | No | Custom install command | +| `rootDirectory` | string | No | Subdirectory of the repository the project lives in \(for monorepos\) | +| `nodeVersion` | string | No | Node.js version to use \(e.g. 22.x, 20.x, 18.x\) | +| `devCommand` | string | No | Custom dev server command | | `teamId` | string | No | Team ID to scope the request | +| `slug` | string | No | Team slug to scope the request \(alternative to teamId\) | #### Output @@ -380,7 +400,11 @@ Update an existing Vercel project | `buildCommand` | string | No | Custom build command | | `outputDirectory` | string | No | Custom output directory | | `installCommand` | string | No | Custom install command | +| `rootDirectory` | string | No | Subdirectory of the repository the project lives in \(for monorepos\) | +| `nodeVersion` | string | No | Node.js version to use \(e.g. 22.x, 20.x, 18.x\) | +| `devCommand` | string | No | Custom dev server command | | `teamId` | string | No | Team ID to scope the request | +| `slug` | string | No | Team slug to scope the request \(alternative to teamId\) | #### Output @@ -402,6 +426,7 @@ Delete a Vercel project | `apiKey` | string | Yes | Vercel Access Token | | `projectId` | string | Yes | Project ID or name | | `teamId` | string | No | Team ID to scope the request | +| `slug` | string | No | Team slug to scope the request \(alternative to teamId\) | #### Output @@ -420,6 +445,7 @@ Pause a Vercel project | `apiKey` | string | Yes | Vercel Access Token | | `projectId` | string | Yes | Project ID or name | | `teamId` | string | No | Team ID to scope the request | +| `slug` | string | No | Team slug to scope the request \(alternative to teamId\) | #### Output @@ -440,6 +466,7 @@ Unpause a Vercel project | `apiKey` | string | Yes | Vercel Access Token | | `projectId` | string | Yes | Project ID or name | | `teamId` | string | No | Team ID to scope the request | +| `slug` | string | No | Team slug to scope the request \(alternative to teamId\) | #### Output @@ -460,6 +487,7 @@ List all domains for a Vercel project | `apiKey` | string | Yes | Vercel Access Token | | `projectId` | string | Yes | Project ID or name | | `teamId` | string | No | Team ID to scope the request | +| `slug` | string | No | Team slug to scope the request \(alternative to teamId\) | | `limit` | number | No | Maximum number of domains to return | #### Output @@ -499,6 +527,7 @@ Add a domain to a Vercel project | `redirectStatusCode` | number | No | HTTP status code for redirect \(301, 302, 307, 308\) | | `gitBranch` | string | No | Git branch to link the domain to | | `teamId` | string | No | Team ID to scope the request | +| `slug` | string | No | Team slug to scope the request \(alternative to teamId\) | #### Output @@ -531,6 +560,7 @@ Remove a domain from a Vercel project | `projectId` | string | Yes | Project ID or name | | `domain` | string | Yes | Domain name to remove | | `teamId` | string | No | Team ID to scope the request | +| `slug` | string | No | Team slug to scope the request \(alternative to teamId\) | #### Output @@ -553,6 +583,7 @@ Update a project domain's configuration on Vercel | `redirectStatusCode` | number | No | HTTP status code for redirect \(301, 302, 307, 308\) | | `gitBranch` | string | No | Git branch to link the domain to | | `teamId` | string | No | Team ID to scope the request | +| `slug` | string | No | Team slug to scope the request \(alternative to teamId\) | #### Output @@ -585,6 +616,7 @@ Verify a Vercel project domain by checking its verification challenge | `projectId` | string | Yes | Project ID or name | | `domain` | string | Yes | Domain name to verify | | `teamId` | string | No | Team ID to scope the request | +| `slug` | string | No | Team slug to scope the request \(alternative to teamId\) | #### Output @@ -610,7 +642,10 @@ Retrieve environment variables for a Vercel project | --------- | ---- | -------- | ----------- | | `apiKey` | string | Yes | Vercel Access Token | | `projectId` | string | Yes | Project ID or name | +| `decrypt` | boolean | No | If true, decrypted variable values are returned instead of ciphertext | +| `gitBranch` | string | No | Filter results to the environment variables for this git branch \(must have target=preview\) | | `teamId` | string | No | Team ID to scope the request | +| `slug` | string | No | Team slug to scope the request \(alternative to teamId\) | #### Output @@ -645,6 +680,7 @@ Create an environment variable for a Vercel project | `gitBranch` | string | No | Git branch to associate with the variable \(requires target to include preview\) | | `comment` | string | No | Comment to add context to the variable \(max 500 characters\) | | `teamId` | string | No | Team ID to scope the request | +| `slug` | string | No | Team slug to scope the request \(alternative to teamId\) | #### Output @@ -678,6 +714,7 @@ Update an environment variable for a Vercel project | `gitBranch` | string | No | Git branch to associate with the variable \(requires target to include preview\) | | `comment` | string | No | Comment to add context to the variable \(max 500 characters\) | | `teamId` | string | No | Team ID to scope the request | +| `slug` | string | No | Team slug to scope the request \(alternative to teamId\) | #### Output @@ -705,6 +742,7 @@ Delete an environment variable from a Vercel project | `projectId` | string | Yes | Project ID or name | | `envId` | string | Yes | Environment variable ID to delete | | `teamId` | string | No | Team ID to scope the request | +| `slug` | string | No | Team slug to scope the request \(alternative to teamId\) | #### Output @@ -723,6 +761,7 @@ List all domains in a Vercel account or team | `apiKey` | string | Yes | Vercel Access Token | | `limit` | number | No | Maximum number of domains to return \(default 20\) | | `teamId` | string | No | Team ID to scope the request | +| `slug` | string | No | Team slug to scope the request \(alternative to teamId\) | #### Output @@ -744,6 +783,10 @@ List all domains in a Vercel account or team | ↳ `id` | string | Creator ID | | ↳ `username` | string | Creator username | | ↳ `email` | string | Creator email | +| ↳ `customNameservers` | array | Custom nameservers | +| ↳ `userId` | string | Owner user ID | +| ↳ `teamId` | string | Owner team ID | +| ↳ `transferStartedAt` | number | Transfer start timestamp | | `count` | number | Number of domains returned | | `hasMore` | boolean | Whether more domains are available | @@ -758,6 +801,7 @@ Get information about a specific domain in a Vercel account | `apiKey` | string | Yes | Vercel Access Token | | `domain` | string | Yes | The domain name to retrieve | | `teamId` | string | No | Team ID to scope the request | +| `slug` | string | No | Team slug to scope the request \(alternative to teamId\) | #### Output @@ -794,6 +838,7 @@ Add a new domain to a Vercel account or team | `apiKey` | string | Yes | Vercel Access Token | | `name` | string | Yes | The domain name to add | | `teamId` | string | No | Team ID to scope the request | +| `slug` | string | No | Team slug to scope the request \(alternative to teamId\) | #### Output @@ -827,6 +872,7 @@ Delete a domain from a Vercel account or team | `apiKey` | string | Yes | Vercel Access Token | | `domain` | string | Yes | The domain name to delete | | `teamId` | string | No | Team ID to scope the request | +| `slug` | string | No | Team slug to scope the request \(alternative to teamId\) | #### Output @@ -846,6 +892,7 @@ Get the configuration for a domain in a Vercel account | `apiKey` | string | Yes | Vercel Access Token | | `domain` | string | Yes | The domain name to get configuration for | | `teamId` | string | No | Team ID to scope the request | +| `slug` | string | No | Team slug to scope the request \(alternative to teamId\) | #### Output @@ -873,6 +920,7 @@ List all DNS records for a domain in a Vercel account | `domain` | string | Yes | The domain name to list records for | | `limit` | number | No | Maximum number of records to return | | `teamId` | string | No | Team ID to scope the request | +| `slug` | string | No | Team slug to scope the request \(alternative to teamId\) | #### Output @@ -906,10 +954,19 @@ Create a DNS record for a domain in a Vercel account | `domain` | string | Yes | The domain name to create the record for | | `recordName` | string | Yes | The subdomain or record name | | `recordType` | string | Yes | DNS record type \(A, AAAA, ALIAS, CAA, CNAME, HTTPS, MX, SRV, TXT, NS\) | -| `value` | string | Yes | The value of the DNS record | +| `value` | string | No | The value of the DNS record \(not used for SRV/HTTPS records\) | | `ttl` | number | No | Time to live in seconds | | `mxPriority` | number | No | Priority for MX records | +| `srvTarget` | string | No | Target hostname for SRV records \(required when recordType is SRV\) | +| `srvWeight` | number | No | Weight for SRV records \(required when recordType is SRV\) | +| `srvPort` | number | No | Port for SRV records \(required when recordType is SRV\) | +| `srvPriority` | number | No | Priority for SRV records \(required when recordType is SRV\) | +| `httpsTarget` | string | No | Target hostname for HTTPS records \(required when recordType is HTTPS\) | +| `httpsPriority` | number | No | Priority for HTTPS records \(required when recordType is HTTPS\) | +| `httpsParams` | string | No | Optional service parameters for HTTPS records \(e.g. "alpn=h2,h3"\) | +| `comment` | string | No | A comment to add context on what this DNS record is for \(max 500 characters\) | | `teamId` | string | No | Team ID to scope the request | +| `slug` | string | No | Team slug to scope the request \(alternative to teamId\) | #### Output @@ -933,8 +990,16 @@ Update an existing DNS record for a domain in a Vercel account | `type` | string | No | DNS record type \(A, AAAA, ALIAS, CAA, CNAME, HTTPS, MX, SRV, TXT, NS\) | | `ttl` | number | No | Time to live in seconds \(60 to 2147483647\) | | `mxPriority` | number | No | Priority for MX records | +| `srvTarget` | string | No | Target hostname for SRV records \(required together when updating SRV data\) | +| `srvWeight` | number | No | Weight for SRV records \(required together when updating SRV data\) | +| `srvPort` | number | No | Port for SRV records \(required together when updating SRV data\) | +| `srvPriority` | number | No | Priority for SRV records \(required together when updating SRV data\) | +| `httpsTarget` | string | No | Target hostname for HTTPS records \(required together when updating HTTPS data\) | +| `httpsPriority` | number | No | Priority for HTTPS records \(required together when updating HTTPS data\) | +| `httpsParams` | string | No | Optional service parameters for HTTPS records \(e.g. "alpn=h2,h3"\) | | `comment` | string | No | A comment to add context on what this DNS record is for \(max 500 characters\) | | `teamId` | string | No | Team ID to scope the request | +| `slug` | string | No | Team slug to scope the request \(alternative to teamId\) | #### Output @@ -963,6 +1028,7 @@ Delete a DNS record for a domain in a Vercel account | `domain` | string | Yes | The domain name the record belongs to | | `recordId` | string | Yes | The ID of the DNS record to delete | | `teamId` | string | No | Team ID to scope the request | +| `slug` | string | No | Team slug to scope the request \(alternative to teamId\) | #### Output @@ -983,6 +1049,7 @@ List aliases for a Vercel project or team | `domain` | string | No | Filter aliases by domain | | `limit` | number | No | Maximum number of aliases to return | | `teamId` | string | No | Team ID to scope the request | +| `slug` | string | No | Team slug to scope the request \(alternative to teamId\) | #### Output @@ -1014,6 +1081,7 @@ Get details about a specific alias by ID or hostname | `apiKey` | string | Yes | Vercel Access Token | | `aliasId` | string | Yes | Alias ID or hostname to look up | | `teamId` | string | No | Team ID to scope the request | +| `slug` | string | No | Team slug to scope the request \(alternative to teamId\) | #### Output @@ -1042,7 +1110,9 @@ Assign an alias (domain/subdomain) to a deployment | `apiKey` | string | Yes | Vercel Access Token | | `deploymentId` | string | Yes | Deployment ID to assign the alias to | | `alias` | string | Yes | The domain or subdomain to assign as an alias | +| `redirect` | string | No | Hostname to 307-redirect the alias to instead of serving the deployment directly | | `teamId` | string | No | Team ID to scope the request | +| `slug` | string | No | Team slug to scope the request \(alternative to teamId\) | #### Output @@ -1064,6 +1134,7 @@ Delete an alias by its ID | `apiKey` | string | Yes | Vercel Access Token | | `aliasId` | string | Yes | Alias ID to delete | | `teamId` | string | No | Team ID to scope the request | +| `slug` | string | No | Team slug to scope the request \(alternative to teamId\) | #### Output @@ -1322,6 +1393,7 @@ Create a new deployment check | `externalId` | string | No | External identifier for the check | | `rerequestable` | boolean | No | Whether the check can be rerequested | | `teamId` | string | No | Team ID to scope the request | +| `slug` | string | No | Team slug to scope the request \(alternative to teamId\) | #### Output @@ -1356,6 +1428,7 @@ Get details of a specific deployment check | `deploymentId` | string | Yes | Deployment ID the check belongs to | | `checkId` | string | Yes | Check ID to retrieve | | `teamId` | string | No | Team ID to scope the request | +| `slug` | string | No | Team slug to scope the request \(alternative to teamId\) | #### Output @@ -1389,6 +1462,7 @@ List all checks for a deployment | `apiKey` | string | Yes | Vercel Access Token | | `deploymentId` | string | Yes | Deployment ID to list checks for | | `teamId` | string | No | Team ID to scope the request | +| `slug` | string | No | Team slug to scope the request \(alternative to teamId\) | #### Output @@ -1432,6 +1506,7 @@ Update an existing deployment check | `path` | string | No | Page path being checked | | `output` | string | No | JSON string with check output metrics | | `teamId` | string | No | Team ID to scope the request | +| `slug` | string | No | Team slug to scope the request \(alternative to teamId\) | #### Output @@ -1466,6 +1541,8 @@ Rerequest a deployment check | `deploymentId` | string | Yes | Deployment ID the check belongs to | | `checkId` | string | Yes | Check ID to rerequest | | `teamId` | string | No | Team ID to scope the request | +| `slug` | string | No | Team slug to scope the request \(alternative to teamId\) | +| `autoUpdate` | boolean | No | Whether to mark the check as running immediately on rerequest | #### Output diff --git a/apps/docs/content/docs/en/integrations/wordpress.mdx b/apps/docs/content/docs/en/integrations/wordpress.mdx index 32bdf1606ed..432851c9a02 100644 --- a/apps/docs/content/docs/en/integrations/wordpress.mdx +++ b/apps/docs/content/docs/en/integrations/wordpress.mdx @@ -29,7 +29,7 @@ In Sim, the WordPress integration enables your agents to automate content publis ## Usage Instructions -Integrate with WordPress to create, update, and manage posts, pages, media, comments, categories, tags, and users. Supports WordPress.com sites via OAuth and self-hosted WordPress sites using Application Passwords authentication. +Integrate with WordPress.com to create, update, and manage posts, pages, media, comments, categories, tags, and users. Connects to WordPress.com sites via OAuth. @@ -507,7 +507,6 @@ Delete a media item from WordPress.com | --------- | ---- | -------- | ----------- | | `siteId` | string | Yes | WordPress.com site ID or domain \(e.g., 12345678 or mysite.wordpress.com\) | | `mediaId` | number | Yes | The ID of the media item to delete | -| `force` | boolean | No | Force delete \(media has no trash, so deletion is permanent\) | #### Output @@ -715,6 +714,86 @@ List categories from WordPress.com | `total` | number | Total number of categories | | `totalPages` | number | Total number of result pages | +### `wordpress_get_category` + +Get a single category from WordPress.com by ID + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `siteId` | string | Yes | WordPress.com site ID or domain \(e.g., 12345678 or mysite.wordpress.com\) | +| `categoryId` | number | Yes | The ID of the category to retrieve | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `category` | object | The retrieved category | +| ↳ `id` | number | Category ID | +| ↳ `count` | number | Number of posts in this category | +| ↳ `description` | string | Category description | +| ↳ `link` | string | Category archive URL | +| ↳ `name` | string | Category name | +| ↳ `slug` | string | Category slug | +| ↳ `taxonomy` | string | Taxonomy name | +| ↳ `parent` | number | Parent category ID | + +### `wordpress_update_category` + +Update an existing category in WordPress.com + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `siteId` | string | Yes | WordPress.com site ID or domain \(e.g., 12345678 or mysite.wordpress.com\) | +| `categoryId` | number | Yes | The ID of the category to update | +| `name` | string | No | Category name | +| `description` | string | No | Category description | +| `parent` | number | No | Parent category ID for hierarchical categories | +| `slug` | string | No | URL slug for the category | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `category` | object | The updated category | +| ↳ `id` | number | Category ID | +| ↳ `count` | number | Number of posts in this category | +| ↳ `description` | string | Category description | +| ↳ `link` | string | Category archive URL | +| ↳ `name` | string | Category name | +| ↳ `slug` | string | Category slug | +| ↳ `taxonomy` | string | Taxonomy name | +| ↳ `parent` | number | Parent category ID | + +### `wordpress_delete_category` + +Delete a category from WordPress.com + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `siteId` | string | Yes | WordPress.com site ID or domain \(e.g., 12345678 or mysite.wordpress.com\) | +| `categoryId` | number | Yes | The ID of the category to delete | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `deleted` | boolean | Whether the category was deleted | +| `category` | object | The deleted category | +| ↳ `id` | number | Category ID | +| ↳ `count` | number | Number of posts in this category | +| ↳ `description` | string | Category description | +| ↳ `link` | string | Category archive URL | +| ↳ `name` | string | Category name | +| ↳ `slug` | string | Category slug | +| ↳ `taxonomy` | string | Taxonomy name | +| ↳ `parent` | number | Parent category ID | + ### `wordpress_create_tag` Create a new tag in WordPress.com @@ -770,6 +849,82 @@ List tags from WordPress.com | `total` | number | Total number of tags | | `totalPages` | number | Total number of result pages | +### `wordpress_get_tag` + +Get a single tag from WordPress.com by ID + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `siteId` | string | Yes | WordPress.com site ID or domain \(e.g., 12345678 or mysite.wordpress.com\) | +| `tagId` | number | Yes | The ID of the tag to retrieve | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `tag` | object | The retrieved tag | +| ↳ `id` | number | Tag ID | +| ↳ `count` | number | Number of posts with this tag | +| ↳ `description` | string | Tag description | +| ↳ `link` | string | Tag archive URL | +| ↳ `name` | string | Tag name | +| ↳ `slug` | string | Tag slug | +| ↳ `taxonomy` | string | Taxonomy name | + +### `wordpress_update_tag` + +Update an existing tag in WordPress.com + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `siteId` | string | Yes | WordPress.com site ID or domain \(e.g., 12345678 or mysite.wordpress.com\) | +| `tagId` | number | Yes | The ID of the tag to update | +| `name` | string | No | Tag name | +| `description` | string | No | Tag description | +| `slug` | string | No | URL slug for the tag | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `tag` | object | The updated tag | +| ↳ `id` | number | Tag ID | +| ↳ `count` | number | Number of posts with this tag | +| ↳ `description` | string | Tag description | +| ↳ `link` | string | Tag archive URL | +| ↳ `name` | string | Tag name | +| ↳ `slug` | string | Tag slug | +| ↳ `taxonomy` | string | Taxonomy name | + +### `wordpress_delete_tag` + +Delete a tag from WordPress.com + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `siteId` | string | Yes | WordPress.com site ID or domain \(e.g., 12345678 or mysite.wordpress.com\) | +| `tagId` | number | Yes | The ID of the tag to delete | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `deleted` | boolean | Whether the tag was deleted | +| `tag` | object | The deleted tag | +| ↳ `id` | number | Tag ID | +| ↳ `count` | number | Number of posts with this tag | +| ↳ `description` | string | Tag description | +| ↳ `link` | string | Tag archive URL | +| ↳ `name` | string | Tag name | +| ↳ `slug` | string | Tag slug | +| ↳ `taxonomy` | string | Taxonomy name | + ### `wordpress_get_current_user` Get information about the currently authenticated WordPress.com user @@ -874,8 +1029,8 @@ Search across all content types in WordPress.com (posts, pages, media) | `query` | string | Yes | Search query | | `perPage` | number | No | Number of results per request \(default: 10, max: 100\) | | `page` | number | No | Page number for pagination | -| `type` | string | No | Filter by content type: post, page, attachment | -| `subtype` | string | No | Filter by post type slug \(e.g., post, page\) | +| `type` | string | No | Filter by search index type: post, term, or post-format | +| `subtype` | string | No | Filter by subtype within the selected type \(e.g., post or page when type is post\) | #### Output @@ -885,8 +1040,8 @@ Search across all content types in WordPress.com (posts, pages, media) | ↳ `id` | number | Content ID | | ↳ `title` | string | Content title | | ↳ `url` | string | Content URL | -| ↳ `type` | string | Content type \(post, page, attachment\) | -| ↳ `subtype` | string | Post type slug | +| ↳ `type` | string | Content type \(post, term, or post-format\) | +| ↳ `subtype` | string | Subtype within the content type \(e.g., post, page\) | | `total` | number | Total number of results | | `totalPages` | number | Total number of result pages | diff --git a/apps/sim/lib/integrations/integrations.json b/apps/sim/lib/integrations/integrations.json index d64e5926d1f..449e5c883d8 100644 --- a/apps/sim/lib/integrations/integrations.json +++ b/apps/sim/lib/integrations/integrations.json @@ -6,7 +6,7 @@ "slug": "1password", "name": "1Password", "description": "Manage secrets and items in 1Password vaults", - "longDescription": "Access and manage secrets stored in 1Password vaults using the Connect API or Service Account SDK. List vaults, retrieve items with their fields and secrets, create new items, update existing ones, delete items, and resolve secret references.", + "longDescription": "Access and manage secrets stored in 1Password vaults using the Connect API or Service Account SDK. List vaults, retrieve items with their fields and secrets, download attached files, create new items, update existing ones, delete items, and resolve secret references.", "bgColor": "#FFFFFF", "iconName": "OnePasswordIcon", "docsUrl": "https://docs.sim.ai/integrations/onepassword", @@ -27,6 +27,10 @@ "name": "Get Item", "description": "Get full details of an item including all fields and secrets" }, + { + "name": "Get Item File", + "description": "Download the content of a file attached to an item" + }, { "name": "Create Item", "description": "Create a new item in a vault" @@ -48,7 +52,7 @@ "description": "Resolve a secret reference (op://vault/item/field) to its value. Service Account mode only." } ], - "operationCount": 9, + "operationCount": 10, "triggers": [], "triggerCount": 0, "authType": "api-key", @@ -345,28 +349,40 @@ "longDescription": "Integrate Ahrefs SEO tools into your workflow. Analyze domain ratings, backlinks, organic keywords, top pages, and more. Requires an Ahrefs Enterprise plan with API access.", "bgColor": "#FFFFFF", "iconName": "AhrefsIcon", - "docsUrl": "https://docs.ahrefs.com/docs/api/reference/introduction", + "docsUrl": "https://docs.sim.ai/integrations/ahrefs", "operations": [ { "name": "Domain Rating", "description": "Get the Domain Rating (DR) and Ahrefs Rank for a target domain. Domain Rating shows the strength of a website's backlink profile on a scale from 0 to 100." }, + { + "name": "Metrics Overview", + "description": "Get a one-call organic and paid search overview for a target domain or URL: organic traffic, organic keywords, paid traffic, paid keywords, and estimated traffic cost." + }, { "name": "Backlinks", "description": "Get a list of backlinks pointing to a target domain or URL. Returns details about each backlink including source URL, anchor text, and domain rating." }, { "name": "Backlinks Stats", - "description": "Get backlink statistics for a target domain or URL. Returns totals for different backlink types including dofollow, nofollow, text, image, and redirect links." + "description": "Get backlink and referring domain totals for a target domain or URL, both currently live and across all time." }, { "name": "Referring Domains", "description": "Get a list of domains that link to a target domain or URL. Returns unique referring domains with their domain rating, backlink counts, and discovery dates." }, + { + "name": "Broken Backlinks", + "description": "Get a list of broken backlinks pointing to a target domain or URL. Useful for identifying link reclamation opportunities." + }, { "name": "Organic Keywords", "description": "Get organic keywords that a target domain or URL ranks for in Google search results. Returns keyword details including search volume, ranking position, and estimated traffic." }, + { + "name": "Organic Competitors", + "description": "Get domains that compete with a target domain or URL for the same organic keywords, ranked by keyword overlap." + }, { "name": "Top Pages", "description": "Get the top pages of a target domain sorted by organic traffic. Returns page URLs with their traffic, keyword counts, and estimated traffic value." @@ -374,13 +390,9 @@ { "name": "Keyword Overview", "description": "Get detailed metrics for a keyword including search volume, keyword difficulty, CPC, clicks, and traffic potential." - }, - { - "name": "Broken Backlinks", - "description": "Get a list of broken backlinks pointing to a target domain or URL. Useful for identifying link reclamation opportunities." } ], - "operationCount": 8, + "operationCount": 10, "triggers": [], "triggerCount": 0, "authType": "api-key", @@ -673,8 +685,8 @@ "slug": "amplitude", "name": "Amplitude", "description": "Track events and query analytics from Amplitude", - "longDescription": "Integrate Amplitude into your workflow to track events, identify users and groups, search for users, query analytics, and retrieve revenue data.", - "bgColor": "#1B1F3B", + "longDescription": "Integrate Amplitude into your workflow to track events, identify users and groups, search for users, query analytics, analyze funnels and retention, and retrieve revenue data.", + "bgColor": "#13294B", "iconName": "AmplitudeIcon", "docsUrl": "https://docs.sim.ai/integrations/amplitude", "operations": [ @@ -700,7 +712,7 @@ }, { "name": "User Profile", - "description": "Get a user profile including properties, cohort memberships, and computed properties." + "description": "Get a user profile including properties, cohort memberships, and computed properties. Not available for EU data-residency projects." }, { "name": "Event Segmentation", @@ -721,9 +733,17 @@ { "name": "Get Revenue", "description": "Get revenue LTV data including ARPU, ARPPU, total revenue, and paying user counts." + }, + { + "name": "Funnels", + "description": "Analyze conversion rates and drop-off between a sequence of events." + }, + { + "name": "Retention", + "description": "Measure how many users return to perform an action after a starting action." } ], - "operationCount": 11, + "operationCount": 13, "triggers": [], "triggerCount": 0, "authType": "api-key", @@ -2651,7 +2671,7 @@ "slug": "clerk", "name": "Clerk", "description": "Manage users, organizations, and sessions in Clerk", - "longDescription": "Integrate Clerk authentication and user management into your workflow. Create, update, delete, and list users. Manage organizations and their memberships. Monitor and control user sessions.", + "longDescription": "Integrate Clerk authentication and user management into your workflow. Create, update, delete, ban, lock, and list users. Manage organizations, their memberships, and invitations. Monitor and control user sessions. Maintain allowlist/blocklist identifiers, JWT templates, and actor tokens.", "bgColor": "#131316", "iconName": "ClerkIcon", "docsUrl": "https://docs.sim.ai/integrations/clerk", @@ -2676,6 +2696,26 @@ "name": "Delete User", "description": "Delete a user from your Clerk application" }, + { + "name": "Ban User", + "description": "Ban a user, preventing them from signing in" + }, + { + "name": "Unban User", + "description": "Remove a ban from a user, allowing them to sign in again" + }, + { + "name": "Lock User", + "description": "Lock a user account, blocking sign-in attempts" + }, + { + "name": "Unlock User", + "description": "Unlock a previously locked user account" + }, + { + "name": "Get User OAuth Token", + "description": "Retrieve a user's OAuth access token for a connected external provider (e.g. Google, GitHub, Microsoft) obtained via Clerk SSO" + }, { "name": "List Organizations", "description": "List all organizations in your Clerk application with optional filtering" @@ -2688,6 +2728,38 @@ "name": "Create Organization", "description": "Create a new organization in your Clerk application" }, + { + "name": "Update Organization", + "description": "Update an existing organization in your Clerk application" + }, + { + "name": "Delete Organization", + "description": "Delete an organization from your Clerk application" + }, + { + "name": "List Organization Memberships", + "description": "List members of a Clerk organization with optional filtering and pagination" + }, + { + "name": "Add Organization Member", + "description": "Add a user as a member of a Clerk organization with a given role" + }, + { + "name": "Update Organization Membership", + "description": "Change a member's role within a Clerk organization" + }, + { + "name": "Remove Organization Member", + "description": "Remove a member from a Clerk organization" + }, + { + "name": "Create Organization Invitation", + "description": "Invite a user by email to join a Clerk organization with a given role" + }, + { + "name": "List Organization Invitations", + "description": "List pending and past invitations for a Clerk organization" + }, { "name": "List Sessions", "description": "List sessions for a user or client in your Clerk application" @@ -2699,9 +2771,49 @@ { "name": "Revoke Session", "description": "Revoke a session to immediately invalidate it" + }, + { + "name": "List Allowlist Identifiers", + "description": "List email/phone/web3-wallet identifiers on your Clerk instance allowlist" + }, + { + "name": "Create Allowlist Identifier", + "description": "Add an email, phone number, or web3 wallet to your Clerk instance allowlist" + }, + { + "name": "Delete Allowlist Identifier", + "description": "Remove an identifier from your Clerk instance allowlist" + }, + { + "name": "List Blocklist Identifiers", + "description": "List email/phone/web3-wallet identifiers on your Clerk instance blocklist" + }, + { + "name": "Create Blocklist Identifier", + "description": "Add an email, phone number, or web3 wallet to your Clerk instance blocklist to prevent sign-ups" + }, + { + "name": "Delete Blocklist Identifier", + "description": "Remove an identifier from your Clerk instance blocklist" + }, + { + "name": "List JWT Templates", + "description": "List custom JWT templates configured on your Clerk instance" + }, + { + "name": "Get JWT Template", + "description": "Retrieve a single custom JWT template by ID from Clerk" + }, + { + "name": "Create Actor Token", + "description": "Create an actor token to impersonate a user (God Mode / act-as-user), e.g. for support tooling" + }, + { + "name": "Revoke Actor Token", + "description": "Revoke an actor token before it is used or expires" } ], - "operationCount": 11, + "operationCount": 34, "triggers": [ { "id": "clerk_user_created", @@ -2723,23 +2835,58 @@ "name": "Clerk Session Created", "description": "Trigger workflow when a Clerk session is created" }, + { + "id": "clerk_session_ended", + "name": "Clerk Session Ended", + "description": "Trigger workflow when a Clerk session ends" + }, + { + "id": "clerk_session_removed", + "name": "Clerk Session Removed", + "description": "Trigger workflow when a Clerk session is removed" + }, + { + "id": "clerk_session_revoked", + "name": "Clerk Session Revoked", + "description": "Trigger workflow when a Clerk session is revoked" + }, { "id": "clerk_organization_created", "name": "Clerk Organization Created", "description": "Trigger workflow when a Clerk organization is created" }, + { + "id": "clerk_organization_updated", + "name": "Clerk Organization Updated", + "description": "Trigger workflow when a Clerk organization is updated" + }, + { + "id": "clerk_organization_deleted", + "name": "Clerk Organization Deleted", + "description": "Trigger workflow when a Clerk organization is deleted" + }, { "id": "clerk_organization_membership_created", "name": "Clerk Organization Membership Created", "description": "Trigger workflow when a Clerk organization membership is created" }, + { + "id": "clerk_organization_membership_updated", + "name": "Clerk Organization Membership Updated", + "description": "Trigger workflow when a Clerk organization membership is updated" + }, + { + "id": "clerk_organization_membership_deleted", + "name": "Clerk Organization Membership Deleted", + "description": "Trigger workflow when a Clerk organization membership is deleted" + }, { "id": "clerk_webhook", "name": "Clerk Webhook", "description": "Trigger workflow on any Clerk webhook event" } ], - "triggerCount": 7, + "triggerCount": 14, "authType": "none", "category": "tools", "integrationType": "security", @@ -6105,6 +6252,14 @@ "name": "List Flows", "description": "List Gong Engage flows (sales engagement sequences)." }, + { + "name": "Assign Flow Prospects", + "description": "Assign up to 200 CRM prospects (contacts or leads) to a Gong Engage flow." + }, + { + "name": "Get Prospect Flows", + "description": "Get the Gong Engage flows currently assigned to the given CRM prospects." + }, { "name": "Get Coaching", "description": "Retrieve coaching metrics for a manager from Gong." @@ -6116,9 +6271,17 @@ { "name": "Lookup Phone", "description": "Find all references to a phone number in Gong (calls, email messages, meetings, CRM data, and associated contacts)." + }, + { + "name": "Purge Email Address", + "description": "Erase all Gong data (calls, email messages, leads, contacts) referencing an email address. Asynchronous and irreversible." + }, + { + "name": "Purge Phone Number", + "description": "Erase all Gong data (calls, leads, contacts) referencing a phone number. Asynchronous and irreversible." } ], - "operationCount": 21, + "operationCount": 25, "triggers": [ { "id": "gong_webhook", @@ -7739,7 +7902,7 @@ "slug": "hex", "name": "Hex", "description": "Run and manage Hex projects", - "longDescription": "Integrate Hex into your workflow. Run projects, check run status, manage collections and groups, list users, and view data connections. Requires a Hex API token.", + "longDescription": "Integrate Hex into your workflow. Run projects, check run status, manage collections and groups (including membership and deactivating users), list users, and view data connections. Requires a Hex API token.", "bgColor": "#14151A", "iconName": "HexIcon", "docsUrl": "https://docs.sim.ai/integrations/hex", @@ -7800,6 +7963,10 @@ "name": "Create Collection", "description": "Create a new collection in the Hex workspace to organize projects." }, + { + "name": "Update Collection", + "description": "Update the name or description of an existing Hex collection." + }, { "name": "List Data Connections", "description": "List all data connections in the Hex workspace (e.g., Snowflake, PostgreSQL, BigQuery)." @@ -7807,9 +7974,25 @@ { "name": "Get Data Connection", "description": "Retrieve details for a specific data connection including type, description, and configuration flags." + }, + { + "name": "Create Group", + "description": "Create a new group in the Hex workspace, optionally with initial members." + }, + { + "name": "Update Group", + "description": "Rename a Hex group or add/remove members from it." + }, + { + "name": "Delete Group", + "description": "Delete a group from the Hex workspace." + }, + { + "name": "Deactivate User", + "description": "Deactivate a user in the Hex workspace." } ], - "operationCount": 16, + "operationCount": 21, "triggers": [], "triggerCount": 0, "authType": "api-key", @@ -9316,9 +9499,21 @@ { "name": "Create Runs Batch", "description": "Forward multiple runs to LangSmith in a single batch." + }, + { + "name": "Update Run", + "description": "Patch an existing LangSmith run with outputs, status, or timing once it completes." + }, + { + "name": "Get Run", + "description": "Retrieve a single LangSmith run by ID." + }, + { + "name": "Create Feedback", + "description": "Attach a score, correction, or comment to a LangSmith run." } ], - "operationCount": 2, + "operationCount": 5, "triggers": [], "triggerCount": 0, "authType": "api-key", @@ -10240,7 +10435,7 @@ }, { "name": "List Transactional Emails", - "description": "Retrieve a list of published transactional email templates from your Loops account. Returns each template with its ID, name, last updated timestamp, and data variables." + "description": "Retrieve a list of published transactional email templates from your Loops account. Returns each template with its ID, name, created/updated timestamps, and data variables." }, { "name": "Create Contact Property", @@ -10249,9 +10444,21 @@ { "name": "List Contact Properties", "description": "Retrieve a list of contact properties from your Loops account. Returns each property with its key, label, and data type. Can filter to show all properties or only custom ones." + }, + { + "name": "Check Contact Suppression", + "description": "Check whether a Loops contact is on the suppression list (bounced, complained, or unsubscribed) by email address or userId." + }, + { + "name": "Remove Contact Suppression", + "description": "Remove a Loops contact from the suppression list by email address or userId, allowing them to receive emails again. Subject to a team removal quota." + }, + { + "name": "Get Transactional Email", + "description": "Retrieve a single transactional email template from your Loops account by its ID, including its data variables and draft/published message IDs." } ], - "operationCount": 10, + "operationCount": 13, "triggers": [ { "id": "loops_email_delivered", @@ -15318,6 +15525,18 @@ "name": "Read Page", "description": "Read a specific page from a SharePoint site" }, + { + "name": "Update Page", + "description": "Update the title and/or content of a SharePoint page" + }, + { + "name": "Publish Page", + "description": "Publish the latest version of a SharePoint page, making it available to all users" + }, + { + "name": "Delete Page", + "description": "Delete a page from a SharePoint site" + }, { "name": "List Sites", "description": "List details of all SharePoint sites" @@ -15338,12 +15557,32 @@ "name": "Add List Item", "description": "Add a new item to a SharePoint list" }, + { + "name": "Get List Item", + "description": "Get a single item (with field values) from a SharePoint list" + }, + { + "name": "Delete List Item", + "description": "Delete an item from a SharePoint list" + }, { "name": "Upload File", "description": "Upload files to a SharePoint document library" + }, + { + "name": "Download File", + "description": "Download a file from a SharePoint document library" + }, + { + "name": "Get Drive Item", + "description": "Get metadata for a file or folder in a SharePoint document library" + }, + { + "name": "Delete File", + "description": "Delete a file (or folder) from a SharePoint document library" } ], - "operationCount": 8, + "operationCount": 16, "triggers": [], "triggerCount": 0, "authType": "oauth", @@ -15485,9 +15724,13 @@ { "name": "Visit Duration (Desktop)", "description": "Get average desktop visit duration over time (in seconds)" + }, + { + "name": "Page Views", + "description": "Get total page views over time (desktop and mobile combined)" } ], - "operationCount": 5, + "operationCount": 6, "triggers": [], "triggerCount": 0, "authType": "api-key", @@ -17208,7 +17451,7 @@ }, { "name": "Introspect Schema", - "description": "Introspect Supabase database schema to get table structures, columns, and relationships" + "description": "Introspect Supabase database schema from its OpenAPI spec to get table and column structures (best-effort primary/foreign key detection)" }, { "name": "Storage: Upload File", @@ -17242,10 +17485,22 @@ "name": "Storage: Create Signed URL", "description": "Create a temporary signed URL for a file in a Supabase storage bucket" }, + { + "name": "Storage: Create Signed Upload URL", + "description": "Create a temporary signed URL a client can use to upload directly to a Supabase storage bucket" + }, { "name": "Storage: Create Bucket", "description": "Create a new storage bucket in Supabase" }, + { + "name": "Storage: Update Bucket", + "description": "Update the configuration of an existing Supabase storage bucket" + }, + { + "name": "Storage: Empty Bucket", + "description": "Delete all objects inside a Supabase storage bucket without deleting the bucket itself" + }, { "name": "Storage: List Buckets", "description": "List all storage buckets in Supabase" @@ -17255,7 +17510,7 @@ "description": "Delete a storage bucket in Supabase" } ], - "operationCount": 23, + "operationCount": 26, "triggers": [], "triggerCount": 0, "authType": "api-key", @@ -17305,6 +17560,10 @@ "name": "Update Device Key", "description": "Enable or disable key expiry on a device" }, + { + "name": "Expire Device Key", + "description": "Immediately expire a device's node key, requiring it to re-authenticate before it can reconnect to the tailnet" + }, { "name": "List DNS Nameservers", "description": "Get the DNS nameservers configured for the tailnet" @@ -17333,6 +17592,14 @@ "name": "List Users", "description": "List all users in the tailnet" }, + { + "name": "Suspend User", + "description": "Suspend a user's access to the tailnet" + }, + { + "name": "Delete User", + "description": "Delete a user from the tailnet" + }, { "name": "Create Auth Key", "description": "Create a new auth key for the tailnet to pre-authorize devices" @@ -17352,9 +17619,13 @@ { "name": "Get ACL", "description": "Get the current ACL policy for the tailnet" + }, + { + "name": "Set ACL", + "description": "Replace the ACL policy file for the tailnet" } ], - "operationCount": 20, + "operationCount": 24, "triggers": [], "triggerCount": 0, "authType": "api-key", @@ -17851,8 +18122,8 @@ "type": "trello", "slug": "trello", "name": "Trello", - "description": "Manage Trello lists, cards, and activity", - "longDescription": "Integrate with Trello to list board lists, list cards, create cards, update cards, review activity, and add comments.", + "description": "Manage Trello lists, cards, checklists, and activity", + "longDescription": "Integrate with Trello to list, search, create, update, and delete cards and lists, manage checklists and checklist items, assign labels and members, review activity, and add comments.", "bgColor": "#0052CC", "iconName": "TrelloIcon", "docsUrl": "https://docs.sim.ai/integrations/trello", @@ -17865,6 +18136,10 @@ "name": "List Cards", "description": "List cards from a Trello board or list" }, + { + "name": "Search", + "description": "Search Trello cards and boards by keyword" + }, { "name": "Create Card", "description": "Create a new card in a Trello list" @@ -17877,6 +18152,10 @@ "name": "Update Card", "description": "Update an existing card on Trello" }, + { + "name": "Delete Card", + "description": "Permanently delete a Trello card" + }, { "name": "Get Actions", "description": "Get activity/actions from a board or card" @@ -17889,14 +18168,34 @@ "name": "Add Checklist", "description": "Add a checklist to a Trello card" }, + { + "name": "Add Checklist Item", + "description": "Add an item to a Trello checklist" + }, + { + "name": "Update Checklist Item", + "description": "Check off, uncheck, or rename a Trello checklist item" + }, { "name": "Add Label", "description": "Attach an existing label to a Trello card" }, + { + "name": "Remove Label", + "description": "Detach a label from a Trello card" + }, { "name": "Add Member", "description": "Assign a member to a Trello card" }, + { + "name": "Remove Member", + "description": "Unassign a member from a Trello card" + }, + { + "name": "List Members", + "description": "List members of a Trello board" + }, { "name": "Create Board", "description": "Create a new Trello board" @@ -17908,9 +18207,13 @@ { "name": "Create List", "description": "Create a new list on a Trello board" + }, + { + "name": "Update List", + "description": "Rename, move, archive, or reopen a Trello list" } ], - "operationCount": 13, + "operationCount": 21, "triggers": [], "triggerCount": 0, "authType": "oauth", @@ -19083,7 +19386,7 @@ "slug": "wordpress", "name": "WordPress", "description": "Manage WordPress content", - "longDescription": "Integrate with WordPress to create, update, and manage posts, pages, media, comments, categories, tags, and users. Supports WordPress.com sites via OAuth and self-hosted WordPress sites using Application Passwords authentication.", + "longDescription": "Integrate with WordPress.com to create, update, and manage posts, pages, media, comments, categories, tags, and users. Connects to WordPress.com sites via OAuth.", "bgColor": "#21759B", "iconName": "WordpressIcon", "docsUrl": "https://docs.sim.ai/integrations/wordpress", @@ -19164,6 +19467,18 @@ "name": "Create Category", "description": "Create a new category in WordPress.com" }, + { + "name": "Update Category", + "description": "Update an existing category in WordPress.com" + }, + { + "name": "Delete Category", + "description": "Delete a category from WordPress.com" + }, + { + "name": "Get Category", + "description": "Get a single category from WordPress.com by ID" + }, { "name": "List Categories", "description": "List categories from WordPress.com" @@ -19172,6 +19487,18 @@ "name": "Create Tag", "description": "Create a new tag in WordPress.com" }, + { + "name": "Update Tag", + "description": "Update an existing tag in WordPress.com" + }, + { + "name": "Delete Tag", + "description": "Delete a tag from WordPress.com" + }, + { + "name": "Get Tag", + "description": "Get a single tag from WordPress.com by ID" + }, { "name": "List Tags", "description": "List tags from WordPress.com" @@ -19193,7 +19520,7 @@ "description": "Search across all content types in WordPress.com (posts, pages, media)" } ], - "operationCount": 26, + "operationCount": 32, "triggers": [], "triggerCount": 0, "authType": "oauth",