diff --git a/apps/docs/content/docs/integrations/gmail.mdx b/apps/docs/content/docs/integrations/gmail.mdx index f5928706260..3379d3ba308 100644 --- a/apps/docs/content/docs/integrations/gmail.mdx +++ b/apps/docs/content/docs/integrations/gmail.mdx @@ -51,9 +51,10 @@ Send emails using Gmail. | `body` | string | Yes | Email body content | | `contentType` | string | No | Content type for the email body \(text or html\) | | `threadId` | string | No | Thread ID to reply to \(for threading\) | -| `replyToMessageId` | string | No | Gmail message ID to reply to - use the "id" field from Gmail Read results \(not the RFC "messageId"\) | +| `replyToMessageId` | string | No | Gmail message ID to reply to - use the "id" field from Gmail Read results \(not "rfcMessageId"\) | | `cc` | string | No | CC recipients \(comma-separated\) | | `bcc` | string | No | BCC recipients \(comma-separated\) | +| `replyTo` | string | No | Reply-To address that replies should go to \(e.g., support@example.com\) | | `attachments` | file[] | No | Files to attach to the email | #### Output @@ -81,9 +82,10 @@ Draft emails using Gmail. | `body` | string | Yes | Email body content | | `contentType` | string | No | Content type for the email body \(text or html\) | | `threadId` | string | No | Thread ID to reply to \(for threading\) | -| `replyToMessageId` | string | No | Gmail message ID to reply to - use the "id" field from Gmail Read results \(not the RFC "messageId"\) | +| `replyToMessageId` | string | No | Gmail message ID to reply to - use the "id" field from Gmail Read results \(not "rfcMessageId"\) | | `cc` | string | No | CC recipients \(comma-separated\) | | `bcc` | string | No | BCC recipients \(comma-separated\) | +| `replyTo` | string | No | Reply-To address that replies should go to \(e.g., support@example.com\) | | `attachments` | file[] | No | Files to attach to the email draft | #### Output @@ -113,9 +115,10 @@ Update an existing Gmail draft in place without deleting and recreating it. | `body` | string | Yes | Email body content | | `contentType` | string | No | Content type for the email body \(text or html\) | | `threadId` | string | No | Thread ID to associate the draft with \(for threading\) | -| `replyToMessageId` | string | No | Gmail message ID to reply to - use the "id" field from Gmail Read results \(not the RFC "messageId"\) | +| `replyToMessageId` | string | No | Gmail message ID to reply to - use the "id" field from Gmail Read results \(not "rfcMessageId"\) | | `cc` | string | No | CC recipients \(comma-separated\) | | `bcc` | string | No | BCC recipients \(comma-separated\) | +| `replyTo` | string | No | Reply-To address that replies should go to \(e.g., support@example.com\) | | `attachments` | file[] | No | Files to attach to the email draft | #### Output @@ -154,13 +157,21 @@ Read emails from Gmail. | `labelIds` | array | Email labels | | `from` | string | Sender email address | | `to` | string | Recipient email address | +| `cc` | string | Cc recipients \(raw Cc header\) | +| `bcc` | string | Bcc recipients \(only present on messages you sent or drafted\) | +| `replyTo` | string | Reply-To header | | `subject` | string | Email subject | | `date` | string | Email date | +| `rfcMessageId` | string | RFC Message-ID header \(not the Gmail message id\) | +| `inReplyTo` | string | In-Reply-To header | +| `references` | string | References header | +| `snippet` | string | Short excerpt of the message text | +| `internalDate` | string | Gmail internal creation timestamp in epoch milliseconds | | `body` | string | Email body text \(best-effort plain text\) | | `hasAttachments` | boolean | Whether the email has attachments | | `attachmentCount` | number | Number of attachments | | `attachments` | file[] | Downloaded attachments \(if enabled\) | -| `results` | json | Summary results when reading multiple messages | +| `results` | json | Summary results when reading multiple messages \(id, threadId, subject, from, to, cc, bcc, replyTo, date, rfcMessageId, inReplyTo, references, snippet, internalDate\) | @@ -175,13 +186,16 @@ Search emails in Gmail. | Parameter | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `query` | string | Yes | Search query for emails | -| `maxResults` | number | No | Maximum number of results to return \(e.g., 10, 25, 50\) | +| `maxResults` | number | No | Maximum number of results to return \(e.g., 10, 25, 50; Gmail default: 100, max: 500\) | +| `pageToken` | string | No | Page token from a previous search \(nextPageToken\) to fetch the next page | #### Output | Parameter | Type | Description | | --------- | ---- | ----------- | -| `results` | json | Array of search results | +| `results` | json | Array of search results \(id, threadId, subject, from, to, cc, bcc, replyTo, date, snippet, rfcMessageId, inReplyTo, references, internalDate\) | +| `nextPageToken` | string | Token for fetching the next page of results | +| `resultSizeEstimate` | number | Estimated total number of results | @@ -384,6 +398,251 @@ List all labels in a Gmail account +### Gmail Create Label + +Create a new label in Gmail + + + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `name` | string | Yes | Display name for the new label | +| `messageListVisibility` | string | No | Visibility of messages with this label in the message list \(show or hide\) | +| `labelListVisibility` | string | No | Visibility of the label in the label list \(labelShow, labelShowIfUnread, or labelHide\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Label ID | +| `name` | string | Label display name | +| `messageListVisibility` | string | Visibility of messages with this label | +| `labelListVisibility` | string | Visibility of the label in the label list | +| `type` | string | Label type \(system or user\) | + + + +### Gmail Update Label + +Update a Gmail label in place (rename or change visibility) without recreating it + + + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `labelId` | string | Yes | ID of the label to update \(from Gmail List Labels\) | +| `name` | string | No | New display name for the label | +| `messageListVisibility` | string | No | Visibility of messages with this label in the message list \(show or hide\) | +| `labelListVisibility` | string | No | Visibility of the label in the label list \(labelShow, labelShowIfUnread, or labelHide\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Label ID | +| `name` | string | Label display name | +| `messageListVisibility` | string | Visibility of messages with this label | +| `labelListVisibility` | string | Visibility of the label in the label list | +| `type` | string | Label type \(system or user\) | + + + +### Gmail Delete Label + +Delete a label from Gmail + + + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `labelId` | string | Yes | ID of the label to delete | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `deleted` | boolean | Whether the label was successfully deleted | +| `labelId` | string | ID of the deleted label | + + + +### Gmail List Drafts + +List all drafts in a Gmail account + + + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `maxResults` | number | No | Maximum number of drafts to return \(default: 100, max: 500\) | +| `pageToken` | string | No | Page token for paginated results | +| `query` | string | No | Search query to filter drafts \(same syntax as Gmail search\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `drafts` | json | Array of draft objects with id, messageId, and threadId | +| `resultSizeEstimate` | number | Estimated total number of drafts | +| `nextPageToken` | string | Token for fetching the next page of results | + + + +### Gmail Get Draft + +Get a specific draft from Gmail by its ID + + + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `draftId` | string | Yes | ID of the draft to retrieve | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Draft ID | +| `messageId` | string | Gmail message ID | +| `threadId` | string | Gmail thread ID | +| `to` | string | Recipient email address | +| `from` | string | Sender email address | +| `cc` | string | Cc recipients | +| `bcc` | string | Bcc recipients | +| `replyTo` | string | Reply-To header | +| `subject` | string | Draft subject | +| `date` | string | Date header | +| `rfcMessageId` | string | RFC Message-ID header \(not the Gmail message id\) | +| `inReplyTo` | string | In-Reply-To header | +| `references` | string | References header | +| `snippet` | string | Short excerpt of the draft text | +| `body` | string | Draft body text | +| `labelIds` | array | Draft labels | + + + +### Gmail Delete Draft + +Delete a specific draft from Gmail + + + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `draftId` | string | Yes | ID of the draft to delete | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `deleted` | boolean | Whether the draft was successfully deleted | +| `draftId` | string | ID of the deleted draft | + + + +### Gmail List Threads + +List email threads in a Gmail account + + + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `maxResults` | number | No | Maximum number of threads to return \(default: 100, max: 500\) | +| `pageToken` | string | No | Page token for paginated results | +| `query` | string | No | Search query to filter threads \(same syntax as Gmail search\) | +| `labelIds` | string | No | Comma-separated label IDs to filter threads by | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `threads` | json | Array of thread objects with id, snippet, and historyId | +| `resultSizeEstimate` | number | Estimated total number of threads | +| `nextPageToken` | string | Token for fetching the next page of results | + + + +### Gmail Get Thread + +Get a specific email thread from Gmail, including all messages in the thread + + + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `threadId` | string | Yes | ID of the thread to retrieve | +| `format` | string | No | Format to return the messages in \(full, metadata, or minimal\). Defaults to full. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Thread ID | +| `historyId` | string | History ID | +| `snippet` | string | Short excerpt of the thread | +| `messages` | json | Array of messages in the thread with id, threadId, labelIds, snippet, from, to, cc, bcc, replyTo, subject, date, rfcMessageId, inReplyTo, references, internalDate, and body | + + + +### Gmail Trash Thread + +Move an email thread to trash in Gmail + + + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `threadId` | string | Yes | ID of the thread to trash | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Thread ID | +| `trashed` | boolean | Whether the thread was successfully trashed | + + + +### Gmail Untrash Thread + +Remove an email thread from trash in Gmail + + + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `threadId` | string | Yes | ID of the thread to untrash | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `id` | string | Thread ID | +| `untrashed` | boolean | Whether the thread was successfully removed from trash | + + + ## Triggers @@ -420,6 +679,12 @@ Triggers when new emails are received in Gmail (requires Gmail credentials) | ↳ `from` | string | Sender email address | | ↳ `to` | string | Recipient email address | | ↳ `cc` | string | CC recipients | +| ↳ `bcc` | string | BCC recipients \(only present on messages you sent\) | +| ↳ `replyTo` | string | Reply-To header | +| ↳ `rfcMessageId` | string | RFC Message-ID header \(not the Gmail message ID\) | +| ↳ `inReplyTo` | string | In-Reply-To header \(RFC Message-ID of the parent message\) | +| ↳ `references` | string | References header \(RFC Message-IDs in the thread\) | +| ↳ `snippet` | string | Short excerpt of the message text | | ↳ `date` | string | Email date in ISO format | | ↳ `bodyText` | string | Plain text email body | | ↳ `bodyHtml` | string | HTML email body | diff --git a/apps/docs/content/docs/integrations/google_calendar.mdx b/apps/docs/content/docs/integrations/google_calendar.mdx index 726ce527d4d..a9758248fdc 100644 --- a/apps/docs/content/docs/integrations/google_calendar.mdx +++ b/apps/docs/content/docs/integrations/google_calendar.mdx @@ -52,22 +52,39 @@ Create a new event in Google Calendar. | `endDateTime` | string | Yes | End time. Use a datetime with timezone offset \(2025-06-03T11:00:00-08:00\) or a date \(2025-06-04\) for an all-day event | | `timeZone` | string | No | IANA time zone \(e.g., America/Los_Angeles\). Used as-is when provided. For recurring events a time zone is required to expand the recurrence correctly; for one-off events it is only needed when the datetime omits a UTC offset \(a naive datetime defaults to America/Los_Angeles\). | | `attendees` | array | No | Array of attendee email addresses | +| `optionalAttendees` | array | No | Array of attendee email addresses to invite as optional guests \(comma-separated string also accepted\) | | `recurrence` | string | No | Recurrence rule\(s\) in RFC 5545 format \(e.g., RRULE:FREQ=WEEKLY;BYDAY=MO,WE,FR\). Separate multiple rules with newlines. | | `addGoogleMeet` | boolean | No | Attach a Google Meet video conference link to the event | | `sendUpdates` | string | No | How to send updates to attendees: all, externalOnly, or none | +| `visibility` | string | No | Event visibility: default, public, private, or confidential | +| `transparency` | string | No | Show as: opaque \(busy, the default\) or transparent \(free\) | +| `colorId` | string | No | Event color ID \("1" to "11", from the Calendar colors endpoint\) | +| `reminders` | json | No | Custom reminders replacing the calendar default, as a JSON array of up to 5 \{ method: "email" \| "popup", minutes \} objects \(e.g., \[\{"method":"popup","minutes":10\}\]\). Pass \[\] for no reminders. | #### Output | Parameter | Type | Description | | --------- | ---- | ----------- | +| `hangoutLink` | string | Google Meet link | +| `conferenceData` | json | Conference details: conferenceId, conferenceSolution \{ name, key.type \}, entryPoints \[\{ entryPointType \(video, phone, sip, more\), uri, label, pin, meetingCode, passcode \}\], notes | +| `recurrence` | json | Recurrence rules | +| `recurringEventId` | string | For an instance of a recurring event, the ID of the recurring series | +| `originalStartTime` | json | For an instance of a recurring event, its original start time in the series | +| `reminders` | json | Reminders: useDefault and overrides \[\{ method \(email or popup\), minutes \}\] | +| `visibility` | string | Visibility: default, public, private, or confidential | +| `transparency` | string | Show as: opaque \(busy\) or transparent \(free\) | +| `colorId` | string | Event color ID | +| `eventType` | string | Event type: default, outOfOffice, focusTime, workingLocation, fromGmail, or birthday | +| `iCalUID` | string | iCalendar UID \(RFC 5545\), shared across calendars | +| `created` | string | Creation time \(RFC3339\) | +| `updated` | string | Last modification time \(RFC3339\) | +| `attachments` | json | File attachments \[\{ fileUrl, title, mimeType, iconLink, fileId \}\] | | `id` | string | Event ID | | `htmlLink` | string | Event link | -| `hangoutLink` | string | Google Meet link | | `status` | string | Event status | | `summary` | string | Event title | | `description` | string | Event description | | `location` | string | Event location | -| `recurrence` | json | Recurrence rules | | `start` | json | Event start | | `end` | json | Event end | | `attendees` | json | Event attendees | @@ -93,14 +110,42 @@ List events from Google Calendar. | `maxResults` | number | No | Maximum number of events to return \(max 2500\) | | `pageToken` | string | No | Token for retrieving the next page of results | | `orderBy` | string | No | Order of events: startTime \(chronological, the default\) or updated \(last-modified\). startTime is always valid here because singleEvents is set. | +| `timeZone` | string | No | IANA time zone used for times in the response \(e.g., America/New_York\). Defaults to the calendar's time zone. | +| `updatedMin` | string | No | Only return events modified at or after this time \(RFC3339 timestamp, e.g., 2025-06-03T00:00:00Z\) | #### Output | Parameter | Type | Description | | --------- | ---- | ----------- | | `nextPageToken` | string | Next page token | +| `nextSyncToken` | string | Sync token for incremental sync, returned on the last page | | `timeZone` | string | Calendar time zone | -| `events` | json | List of events | +| `events` | array | List of events | +| ↳ `hangoutLink` | string | Google Meet link | +| ↳ `conferenceData` | json | Conference details: conferenceId, conferenceSolution \{ name, key.type \}, entryPoints \[\{ entryPointType \(video, phone, sip, more\), uri, label, pin, meetingCode, passcode \}\], notes | +| ↳ `recurrence` | json | Recurrence rules \(RRULE/EXRULE/RDATE/EXDATE\) | +| ↳ `recurringEventId` | string | For an instance of a recurring event, the ID of the recurring series | +| ↳ `originalStartTime` | json | For an instance of a recurring event, its original start time in the series | +| ↳ `reminders` | json | Reminders: useDefault and overrides \[\{ method \(email or popup\), minutes \}\] | +| ↳ `visibility` | string | Visibility: default, public, private, or confidential | +| ↳ `transparency` | string | Show as: opaque \(busy\) or transparent \(free\) | +| ↳ `colorId` | string | Event color ID | +| ↳ `eventType` | string | Event type: default, outOfOffice, focusTime, workingLocation, fromGmail, or birthday | +| ↳ `iCalUID` | string | iCalendar UID \(RFC 5545\), shared across calendars | +| ↳ `created` | string | Creation time \(RFC3339\) | +| ↳ `updated` | string | Last modification time \(RFC3339\) | +| ↳ `attachments` | json | File attachments \[\{ fileUrl, title, mimeType, iconLink, fileId \}\] | +| ↳ `id` | string | Event ID | +| ↳ `htmlLink` | string | Event link | +| ↳ `status` | string | Event status \(confirmed, tentative, cancelled\) | +| ↳ `summary` | string | Event title | +| ↳ `description` | string | Event description | +| ↳ `location` | string | Event location | +| ↳ `start` | json | Event start \{ dateTime \| date, timeZone \} | +| ↳ `end` | json | Event end \{ dateTime \| date, timeZone \} | +| ↳ `attendees` | json | Attendees \[\{ email, displayName, responseStatus \(needsAction, declined, tentative, accepted\), optional, organizer, self, resource, comment \}\] | +| ↳ `creator` | json | Event creator \{ email, displayName, self \} | +| ↳ `organizer` | json | Event organizer \{ email, displayName, self \} | @@ -121,6 +166,20 @@ Get a specific event from Google Calendar. | Parameter | Type | Description | | --------- | ---- | ----------- | +| `hangoutLink` | string | Google Meet link | +| `conferenceData` | json | Conference details: conferenceId, conferenceSolution \{ name, key.type \}, entryPoints \[\{ entryPointType \(video, phone, sip, more\), uri, label, pin, meetingCode, passcode \}\], notes | +| `recurrence` | json | Recurrence rules \(RRULE/EXRULE/RDATE/EXDATE\) | +| `recurringEventId` | string | For an instance of a recurring event, the ID of the recurring series | +| `originalStartTime` | json | For an instance of a recurring event, its original start time in the series | +| `reminders` | json | Reminders: useDefault and overrides \[\{ method \(email or popup\), minutes \}\] | +| `visibility` | string | Visibility: default, public, private, or confidential | +| `transparency` | string | Show as: opaque \(busy\) or transparent \(free\) | +| `colorId` | string | Event color ID | +| `eventType` | string | Event type: default, outOfOffice, focusTime, workingLocation, fromGmail, or birthday | +| `iCalUID` | string | iCalendar UID \(RFC 5545\), shared across calendars | +| `created` | string | Creation time \(RFC3339\) | +| `updated` | string | Last modification time \(RFC3339\) | +| `attachments` | json | File attachments \[\{ fileUrl, title, mimeType, iconLink, fileId \}\] | | `id` | string | Event ID | | `htmlLink` | string | Event link | | `status` | string | Event status | @@ -157,19 +216,35 @@ Update an existing event in Google Calendar. | `recurrence` | string | No | Recurrence rule\(s\) in RFC 5545 format \(e.g., RRULE:FREQ=WEEKLY;BYDAY=MO,WE,FR\). Separate multiple rules with newlines. When provided, replaces the event's recurrence; leaving it empty keeps the existing recurrence unchanged. Requires a timeZone for timed events. | | `addGoogleMeet` | boolean | No | Attach a Google Meet video conference link to the event | | `sendUpdates` | string | No | How to send updates to attendees: all, externalOnly, or none | +| `visibility` | string | No | Event visibility: default, public, private, or confidential | +| `transparency` | string | No | Show as: opaque \(busy, the default\) or transparent \(free\) | +| `colorId` | string | No | Event color ID \("1" to "11", from the Calendar colors endpoint\) | +| `reminders` | json | No | Custom reminders replacing the calendar default, as a JSON array of up to 5 \{ method: "email" \| "popup", minutes \} objects \(e.g., \[\{"method":"popup","minutes":10\}\]\). Pass \[\] for no reminders. | #### Output | Parameter | Type | Description | | --------- | ---- | ----------- | +| `hangoutLink` | string | Google Meet link | +| `conferenceData` | json | Conference details: conferenceId, conferenceSolution \{ name, key.type \}, entryPoints \[\{ entryPointType \(video, phone, sip, more\), uri, label, pin, meetingCode, passcode \}\], notes | +| `recurrence` | json | Recurrence rules | +| `recurringEventId` | string | For an instance of a recurring event, the ID of the recurring series | +| `originalStartTime` | json | For an instance of a recurring event, its original start time in the series | +| `reminders` | json | Reminders: useDefault and overrides \[\{ method \(email or popup\), minutes \}\] | +| `visibility` | string | Visibility: default, public, private, or confidential | +| `transparency` | string | Show as: opaque \(busy\) or transparent \(free\) | +| `colorId` | string | Event color ID | +| `eventType` | string | Event type: default, outOfOffice, focusTime, workingLocation, fromGmail, or birthday | +| `iCalUID` | string | iCalendar UID \(RFC 5545\), shared across calendars | +| `created` | string | Creation time \(RFC3339\) | +| `updated` | string | Last modification time \(RFC3339\) | +| `attachments` | json | File attachments \[\{ fileUrl, title, mimeType, iconLink, fileId \}\] | | `id` | string | Event ID | | `htmlLink` | string | Event link | -| `hangoutLink` | string | Google Meet link | | `status` | string | Event status | | `summary` | string | Event title | | `description` | string | Event description | | `location` | string | Event location | -| `recurrence` | json | Recurrence rules | | `start` | json | Event start | | `end` | json | Event end | | `attendees` | json | Event attendees | @@ -220,6 +295,20 @@ Move an event to a different calendar. | Parameter | Type | Description | | --------- | ---- | ----------- | +| `hangoutLink` | string | Google Meet link | +| `conferenceData` | json | Conference details: conferenceId, conferenceSolution \{ name, key.type \}, entryPoints \[\{ entryPointType \(video, phone, sip, more\), uri, label, pin, meetingCode, passcode \}\], notes | +| `recurrence` | json | Recurrence rules \(RRULE/EXRULE/RDATE/EXDATE\) | +| `recurringEventId` | string | For an instance of a recurring event, the ID of the recurring series | +| `originalStartTime` | json | For an instance of a recurring event, its original start time in the series | +| `reminders` | json | Reminders: useDefault and overrides \[\{ method \(email or popup\), minutes \}\] | +| `visibility` | string | Visibility: default, public, private, or confidential | +| `transparency` | string | Show as: opaque \(busy\) or transparent \(free\) | +| `colorId` | string | Event color ID | +| `eventType` | string | Event type: default, outOfOffice, focusTime, workingLocation, fromGmail, or birthday | +| `iCalUID` | string | iCalendar UID \(RFC 5545\), shared across calendars | +| `created` | string | Creation time \(RFC3339\) | +| `updated` | string | Last modification time \(RFC3339\) | +| `attachments` | json | File attachments \[\{ fileUrl, title, mimeType, iconLink, fileId \}\] | | `id` | string | Event ID | | `htmlLink` | string | Event link | | `status` | string | Event status | @@ -314,6 +403,20 @@ Create events from natural language text. | Parameter | Type | Description | | --------- | ---- | ----------- | +| `hangoutLink` | string | Google Meet link | +| `conferenceData` | json | Conference details: conferenceId, conferenceSolution \{ name, key.type \}, entryPoints \[\{ entryPointType \(video, phone, sip, more\), uri, label, pin, meetingCode, passcode \}\], notes | +| `recurrence` | json | Recurrence rules \(RRULE/EXRULE/RDATE/EXDATE\) | +| `recurringEventId` | string | For an instance of a recurring event, the ID of the recurring series | +| `originalStartTime` | json | For an instance of a recurring event, its original start time in the series | +| `reminders` | json | Reminders: useDefault and overrides \[\{ method \(email or popup\), minutes \}\] | +| `visibility` | string | Visibility: default, public, private, or confidential | +| `transparency` | string | Show as: opaque \(busy\) or transparent \(free\) | +| `colorId` | string | Event color ID | +| `eventType` | string | Event type: default, outOfOffice, focusTime, workingLocation, fromGmail, or birthday | +| `iCalUID` | string | iCalendar UID \(RFC 5545\), shared across calendars | +| `created` | string | Creation time \(RFC3339\) | +| `updated` | string | Last modification time \(RFC3339\) | +| `attachments` | json | File attachments \[\{ fileUrl, title, mimeType, iconLink, fileId \}\] | | `id` | string | Event ID | | `htmlLink` | string | Event link | | `status` | string | Event status | @@ -348,6 +451,20 @@ Invite attendees to an existing Google Calendar event. | Parameter | Type | Description | | --------- | ---- | ----------- | +| `hangoutLink` | string | Google Meet link | +| `conferenceData` | json | Conference details: conferenceId, conferenceSolution \{ name, key.type \}, entryPoints \[\{ entryPointType \(video, phone, sip, more\), uri, label, pin, meetingCode, passcode \}\], notes | +| `recurrence` | json | Recurrence rules \(RRULE/EXRULE/RDATE/EXDATE\) | +| `recurringEventId` | string | For an instance of a recurring event, the ID of the recurring series | +| `originalStartTime` | json | For an instance of a recurring event, its original start time in the series | +| `reminders` | json | Reminders: useDefault and overrides \[\{ method \(email or popup\), minutes \}\] | +| `visibility` | string | Visibility: default, public, private, or confidential | +| `transparency` | string | Show as: opaque \(busy\) or transparent \(free\) | +| `colorId` | string | Event color ID | +| `eventType` | string | Event type: default, outOfOffice, focusTime, workingLocation, fromGmail, or birthday | +| `iCalUID` | string | iCalendar UID \(RFC 5545\), shared across calendars | +| `created` | string | Creation time \(RFC3339\) | +| `updated` | string | Last modification time \(RFC3339\) | +| `attachments` | json | File attachments \[\{ fileUrl, title, mimeType, iconLink, fileId \}\] | | `id` | string | Event ID | | `htmlLink` | string | Event link | | `status` | string | Event status | @@ -382,16 +499,33 @@ RSVP to a Google Calendar event (accept, decline, or tentative) as the connected | Parameter | Type | Description | | --------- | ---- | ----------- | +| `hangoutLink` | string | Google Meet link | +| `conferenceData` | json | Conference details: conferenceId, conferenceSolution \{ name, key.type \}, entryPoints \[\{ entryPointType \(video, phone, sip, more\), uri, label, pin, meetingCode, passcode \}\], notes | +| `recurrence` | json | Recurrence rules \(RRULE/EXRULE/RDATE/EXDATE\) | +| `recurringEventId` | string | For an instance of a recurring event, the ID of the recurring series | +| `originalStartTime` | json | For an instance of a recurring event, its original start time in the series | +| `reminders` | json | Reminders: useDefault and overrides \[\{ method \(email or popup\), minutes \}\] | +| `visibility` | string | Visibility: default, public, private, or confidential | +| `transparency` | string | Show as: opaque \(busy\) or transparent \(free\) | +| `colorId` | string | Event color ID | +| `eventType` | string | Event type: default, outOfOffice, focusTime, workingLocation, fromGmail, or birthday | +| `iCalUID` | string | iCalendar UID \(RFC 5545\), shared across calendars | +| `created` | string | Creation time \(RFC3339\) | +| `updated` | string | Last modification time \(RFC3339\) | +| `attachments` | json | File attachments \[\{ fileUrl, title, mimeType, iconLink, fileId \}\] | | `id` | string | Event ID | | `htmlLink` | string | Event link | | `status` | string | Event status | | `summary` | string | Event title | +| `description` | string | Event description | +| `location` | string | Event location | | `start` | json | Event start | | `end` | json | Event end | | `responseStatus` | string | Your confirmed response \(accepted, declined, or tentative\) | | `comment` | string | Your response comment | | `attendees` | json | Event attendees | | `organizer` | json | Event organizer | +| `creator` | json | Event creator | @@ -636,9 +770,16 @@ Triggers when events are created, updated, or cancelled in Google Calendar | ↳ `end` | json | Event end time | | ↳ `created` | string | Event creation time | | ↳ `updated` | string | Event last updated time | -| ↳ `attendees` | json | Event attendees | -| ↳ `creator` | json | Event creator | -| ↳ `organizer` | json | Event organizer | +| ↳ `attendees` | json | Event attendees \[\{ email, displayName, responseStatus \(needsAction, declined, tentative, accepted\), optional, organizer, self \}\] | +| ↳ `creator` | json | Event creator \{ email, displayName, self \} | +| ↳ `organizer` | json | Event organizer \{ email, displayName, self \} | +| ↳ `hangoutLink` | string | Google Meet link | +| ↳ `conferenceData` | json | Conference details: conferenceId, conferenceSolution \{ name \}, entryPoints \[\{ entryPointType, uri, label, pin, meetingCode, passcode \}\] | +| ↳ `recurringEventId` | string | Recurring series ID when the event is an instance of a recurring event | +| ↳ `originalStartTime` | json | Original start time of a recurring event instance | +| ↳ `visibility` | string | Visibility: default, public, private, or confidential | +| ↳ `transparency` | string | Show as: opaque \(busy\) or transparent \(free\) | +| ↳ `iCalUID` | string | iCalendar UID | | `calendarId` | string | Calendar ID | | `timestamp` | string | Event processing timestamp in ISO format | diff --git a/apps/docs/content/docs/integrations/google_contacts.mdx b/apps/docs/content/docs/integrations/google_contacts.mdx index 90220a0443a..e351573043e 100644 --- a/apps/docs/content/docs/integrations/google_contacts.mdx +++ b/apps/docs/content/docs/integrations/google_contacts.mdx @@ -53,13 +53,14 @@ Create a new contact in Google Contacts | `organization` | string | No | Organization/company name | | `jobTitle` | string | No | Job title at the organization | | `notes` | string | No | Notes or biography for the contact | +| `birthday` | string | No | Birthday as YYYY-MM-DD, or MM-DD when the year is unknown | #### Output | Parameter | Type | Description | | --------- | ---- | ----------- | | `content` | string | Contact creation confirmation message | -| `metadata` | json | Created contact metadata including resource name and details | +| `metadata` | json | Created contact \(resourceName, etag, displayName, givenName, familyName, middleName, emails, phones, organizations, addresses, biographies, urls, photos, birthdays, events, nicknames, relations, userDefined, contactGroupResourceNames\) | @@ -80,7 +81,7 @@ Get a specific contact from Google Contacts | Parameter | Type | Description | | --------- | ---- | ----------- | | `content` | string | Contact retrieval confirmation message | -| `metadata` | json | Contact details including name, email, phone, and organization | +| `metadata` | json | Contact details \(resourceName, etag, displayName, givenName, familyName, middleName, emails, phones, organizations, addresses, biographies, urls, photos, birthdays, events, nicknames, relations, userDefined, contactGroupResourceNames\) | @@ -103,7 +104,7 @@ List contacts from Google Contacts | Parameter | Type | Description | | --------- | ---- | ----------- | | `content` | string | Summary of found contacts count | -| `metadata` | json | List of contacts with pagination tokens | +| `metadata` | json | totalItems, nextPageToken, and contacts: \[\{resourceName, etag, displayName, givenName, familyName, middleName, emails, phones, organizations, addresses, biographies, urls, photos, birthdays, events, nicknames, relations, userDefined, contactGroupResourceNames\}\] | @@ -125,7 +126,7 @@ Search contacts in Google Contacts by name, email, phone, or organization | Parameter | Type | Description | | --------- | ---- | ----------- | | `content` | string | Summary of search results count | -| `metadata` | json | Search results with matching contacts | +| `metadata` | json | contacts: \[\{resourceName, etag, displayName, givenName, familyName, middleName, emails, phones, organizations, addresses, biographies, urls, photos, birthdays, events, nicknames, relations, userDefined, contactGroupResourceNames\}\] | @@ -150,13 +151,14 @@ Update an existing contact in Google Contacts | `organization` | string | No | Updated organization/company name | | `jobTitle` | string | No | Updated job title | | `notes` | string | No | Updated notes or biography | +| `birthday` | string | No | Birthday as YYYY-MM-DD, or MM-DD when the year is unknown | #### Output | Parameter | Type | Description | | --------- | ---- | ----------- | | `content` | string | Contact update confirmation message | -| `metadata` | json | Updated contact metadata | +| `metadata` | json | Updated contact \(resourceName, etag, displayName, givenName, familyName, middleName, emails, phones, organizations, addresses, biographies, urls, photos, birthdays, events, nicknames, relations, userDefined, contactGroupResourceNames\) | diff --git a/apps/docs/content/docs/integrations/google_docs.mdx b/apps/docs/content/docs/integrations/google_docs.mdx index 1b1da760614..7e6cd24826d 100644 --- a/apps/docs/content/docs/integrations/google_docs.mdx +++ b/apps/docs/content/docs/integrations/google_docs.mdx @@ -46,6 +46,8 @@ Read content from a Google Docs document | Parameter | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `documentId` | string | Yes | Google Docs document ID | +| `includeTabsContent` | boolean | No | When true, reads every tab of the document: content holds the text of all tabs in order and tabs lists each tab with its own text. Default: false \(only the first tab is read\). | +| `suggestionsViewMode` | string | No | How suggested edits appear in the returned text. One of: DEFAULT_FOR_CURRENT_ACCESS \(default\), SUGGESTIONS_INLINE, PREVIEW_SUGGESTIONS_ACCEPTED, PREVIEW_WITHOUT_SUGGESTIONS. | #### Output @@ -57,6 +59,14 @@ Read content from a Google Docs document | ↳ `title` | string | Document title | | ↳ `mimeType` | string | Document MIME type | | ↳ `url` | string | Document URL | +| ↳ `revisionId` | string | Revision ID of the document as read | +| `tabs` | array | Every tab in the document, depth-first \(populated only when includeTabsContent is true\) | +| ↳ `tabId` | string | Tab ID | +| ↳ `title` | string | Tab title | +| ↳ `parentTabId` | string | Parent tab ID | +| ↳ `index` | number | Zero-based index within the parent | +| ↳ `nestingLevel` | number | Depth of the tab | +| ↳ `content` | string | Extracted text content of the tab | @@ -72,6 +82,7 @@ Append content to a Google Docs document. Content is inserted literally; Markdow | --------- | ---- | -------- | ----------- | | `documentId` | string | Yes | The ID of the document to write to | | `content` | string | Yes | The content to write to the document | +| `tabId` | string | No | ID of the tab to append the content to \(from Read with includeTabsContent\). When omitted, the first tab is used. | #### Output @@ -127,6 +138,7 @@ Insert text at a specific index in a Google Docs document. When no index is prov | `documentId` | string | Yes | The ID of the document to insert text into | | `text` | string | Yes | The text to insert | | `index` | number | No | The character index \(the document body starts at index 1\) at which to insert the text. When omitted, text is appended to the end of the document. | +| `tabId` | string | No | ID of the tab to insert the text into \(from Read with includeTabsContent\). When omitted, the first tab is used. | #### Output @@ -155,6 +167,8 @@ Replace all occurrences of a search string with new text across a Google Docs do | `searchText` | string | Yes | The text to find | | `replaceText` | string | No | The text to replace matches with. Use an empty string to delete matches. | | `matchCase` | boolean | No | Whether the search should be case sensitive. Defaults to false. | +| `searchByRegex` | boolean | No | When true, the search text is treated as a regular expression. Defaults to false. | +| `tabId` | string | No | ID of a tab to limit the replacement to \(from Read with includeTabsContent\). When omitted, matches are replaced in all tabs. | #### Output @@ -183,6 +197,7 @@ Insert an empty table with the given number of rows and columns into a Google Do | `rows` | number | Yes | The number of rows in the table | | `columns` | number | Yes | The number of columns in the table | | `index` | number | No | The character index \(the document body starts at index 1\) at which to insert the table. When omitted, the table is appended to the end of the document. | +| `tabId` | string | No | ID of the tab to insert the table into \(from Read with includeTabsContent\). When omitted, the first tab is used. | #### Output @@ -212,6 +227,7 @@ Insert an inline image from a public URL into a Google Docs document. The image | `index` | number | No | The character index \(the document body starts at index 1\) at which to insert the image. When omitted, the image is appended to the end of the document. | | `width` | number | No | Optional image width in points \(PT\) | | `height` | number | No | Optional image height in points \(PT\) | +| `tabId` | string | No | ID of the tab to insert the image into \(from Read with includeTabsContent\). When omitted, the first tab is used. | #### Output @@ -238,6 +254,7 @@ Insert a page break into a Google Docs document. When no index is provided, the | --------- | ---- | -------- | ----------- | | `documentId` | string | Yes | The ID of the document to insert the page break into | | `index` | number | No | The character index \(the document body starts at index 1\) at which to insert the page break. When omitted, the page break is appended to the end of the document. | +| `tabId` | string | No | ID of the tab to insert the page break into \(from Read with includeTabsContent\). When omitted, the first tab is used. | #### Output diff --git a/apps/docs/content/docs/integrations/google_drive.mdx b/apps/docs/content/docs/integrations/google_drive.mdx index f70b5e1c0c0..04d2b442436 100644 --- a/apps/docs/content/docs/integrations/google_drive.mdx +++ b/apps/docs/content/docs/integrations/google_drive.mdx @@ -50,6 +50,8 @@ List files and folders in Google Drive with complete metadata | `query` | string | No | Search term to filter files by name \(e.g. "budget" finds files with "budget" in the name\). Do NOT use Google Drive query syntax here - just provide a plain search term. | | `pageSize` | number | No | The maximum number of files to return \(default: 100\) | | `pageToken` | string | No | The page token to use for pagination | +| `orderBy` | string | No | Comma-separated sort keys: createdTime, folder, modifiedByMeTime, modifiedTime, name, name_natural, quotaBytesUsed, recency, sharedWithMeTime, starred, viewedByMeTime. Append " desc" to reverse \(e.g., "modifiedTime desc"\) | +| `driveId` | string | No | ID of a shared drive to restrict results to \(default: search My Drive and all shared drives\) | #### Output @@ -109,6 +111,7 @@ List files and folders in Google Drive with complete metadata | ↳ `contentRestrictions` | json | Content restrictions | | ↳ `linkShareMetadata` | json | Link share metadata | | `nextPageToken` | string | Page token for the next page of files; absent from the response when the end of the files list has been reached | +| `incompleteSearch` | boolean | Whether the search was incomplete and some results may be missing \(can happen when searching all drives; set driveId to narrow the search\) | @@ -152,6 +155,11 @@ Get metadata for a specific file in Google Drive by its ID | ↳ `capabilities` | json | User capabilities on file | | ↳ `md5Checksum` | string | MD5 hash | | ↳ `version` | string | Version number | +| ↳ `driveId` | string | ID of the shared drive the file is in | +| ↳ `fileExtension` | string | File extension | +| ↳ `exportLinks` | json | Export format links for Google Workspace files | +| ↳ `sharingUser` | json | User who shared the file with the current user | +| ↳ `headRevisionId` | string | Head revision ID | @@ -521,6 +529,8 @@ Search for files in Google Drive using advanced query syntax (e.g., fullText con | `query` | string | Yes | Google Drive query string using advanced search syntax \(e.g., "fullText contains 'budget'", "mimeType = 'application/pdf'", "modifiedTime > '2024-01-01'"\) | | `pageSize` | number | No | Maximum number of files to return \(default: 100\) | | `pageToken` | string | No | Token for fetching the next page of results | +| `orderBy` | string | No | Comma-separated sort keys: createdTime, folder, modifiedByMeTime, modifiedTime, name, name_natural, quotaBytesUsed, recency, sharedWithMeTime, starred, viewedByMeTime. Append " desc" to reverse \(e.g., "modifiedTime desc"\) | +| `driveId` | string | No | ID of a shared drive to restrict results to \(default: search My Drive and all shared drives\) | #### Output @@ -554,6 +564,7 @@ Search for files in Google Drive using advanced query syntax (e.g., fullText con | ↳ `capabilities` | json | User capabilities on file | | ↳ `version` | string | Version number | | `nextPageToken` | string | Page token for the next page of files; absent from the response when the end of the files list has been reached | +| `incompleteSearch` | boolean | Whether the search was incomplete and some results may be missing \(can happen when searching all drives; set driveId to narrow the search\) | @@ -685,6 +696,8 @@ Share a file with a user, group, domain, or make it public | `moveToNewOwnersRoot` | boolean | No | When transferring ownership, move the file to the new owner's My Drive root folder. | | `sendNotification` | boolean | No | Whether to send an email notification \(default: true\) | | `emailMessage` | string | No | Custom message to include in the notification email | +| `expirationTime` | string | No | RFC 3339 time when the permission expires \(e.g., 2025-12-31T23:59:59Z\). Only for user and group permissions; must be in the future and at most one year out | +| `allowFileDiscovery` | boolean | No | Whether the file can be discovered through search. Only for domain and anyone permissions | #### Output @@ -699,6 +712,8 @@ Share a file with a user, group, domain, or make it public | ↳ `domain` | string | Domain of the grantee | | ↳ `expirationTime` | string | Expiration time | | ↳ `deleted` | boolean | Whether grantee is deleted | +| ↳ `allowFileDiscovery` | boolean | Whether the file is discoverable through search \(domain and anyone only\) | +| ↳ `pendingOwner` | boolean | Whether the grantee is a pending owner of the file | @@ -737,6 +752,7 @@ List all permissions (who has access) for a file in Google Drive | --------- | ---- | -------- | ----------- | | `fileId` | string | Yes | The ID of the file to list permissions for | | `pageToken` | string | No | The page token to use for pagination | +| `pageSize` | number | No | Maximum number of permissions to return \(1-100\). Omit to return the full list for My Drive files and up to 100 for shared drive files | #### Output diff --git a/apps/docs/content/docs/integrations/google_forms.mdx b/apps/docs/content/docs/integrations/google_forms.mdx index e72ba1e3319..8f606fa2d50 100644 --- a/apps/docs/content/docs/integrations/google_forms.mdx +++ b/apps/docs/content/docs/integrations/google_forms.mdx @@ -61,12 +61,16 @@ Retrieve a single response or list responses from a Google Form | ↳ `createTime` | string | When the response was created | | ↳ `lastSubmittedTime` | string | When the response was last submitted | | ↳ `answers` | json | Map of question IDs to answer values | +| ↳ `respondentEmail` | string | Respondent email address \(only when the form collects emails\) | +| ↳ `totalScore` | number | Total points awarded \(only for graded quizzes\) | | `nextPageToken` | string | Token to fetch the next page of responses \(null when no more pages\) | | `response` | object | Single form response \(when responseId is provided\) | | ↳ `responseId` | string | Unique response ID | | ↳ `createTime` | string | When the response was created | | ↳ `lastSubmittedTime` | string | When the response was last submitted | | ↳ `answers` | json | Map of question IDs to answer values | +| ↳ `respondentEmail` | string | Respondent email address \(only when the form collects emails\) | +| ↳ `totalScore` | number | Total points awarded \(only for graded quizzes\) | | `raw` | json | Raw API response data | @@ -335,6 +339,7 @@ Trigger workflow from Google Form submissions (via Apps Script forwarder) | `createTime` | string | Response creation timestamp | | `lastSubmittedTime` | string | Last submitted timestamp | | `formId` | string | Google Form ID | +| `respondentEmail` | string | Respondent email address \(only when the form collects emails and the forwarder script sends it\) | | `answers` | object | Normalized map of question -> answer | | `raw` | object | Original payload \(when enabled\) | diff --git a/apps/docs/content/docs/integrations/google_groups.mdx b/apps/docs/content/docs/integrations/google_groups.mdx index 7adad944561..6267b1a1800 100644 --- a/apps/docs/content/docs/integrations/google_groups.mdx +++ b/apps/docs/content/docs/integrations/google_groups.mdx @@ -52,12 +52,15 @@ List all groups in a Google Workspace domain | `maxResults` | number | No | Maximum number of results to return \(1-200\). Example: 50 | | `pageToken` | string | No | Token for fetching the next page of results | | `query` | string | No | Search query to filter groups \(e.g., "email:admin*"\) | +| `userKey` | string | No | Only list groups this user or group is a direct member of \(email or immutable ID\). Cannot be combined with customer | +| `orderBy` | string | No | Column to sort results by. Only "email" is supported | +| `sortOrder` | string | No | Sort direction when orderBy is set: ASCENDING or DESCENDING | #### Output | Parameter | Type | Description | | --------- | ---- | ----------- | -| `groups` | json | Array of group objects | +| `groups` | json | Array of group objects \(id, email, name, description, directMembersCount, adminCreated, aliases, nonEditableAliases, etag, kind\) | | `nextPageToken` | string | Token for fetching next page of results | @@ -161,12 +164,13 @@ List all members of a Google Group | `maxResults` | number | No | Maximum number of results to return \(1-200\). Example: 50 | | `pageToken` | string | No | Token for fetching the next page of results | | `roles` | string | No | Filter by roles \(comma-separated: OWNER, MANAGER, MEMBER\) | +| `includeDerivedMembership` | boolean | No | Whether to also list indirect members inherited through nested groups \(default false\) | #### Output | Parameter | Type | Description | | --------- | ---- | ----------- | -| `members` | json | Array of member objects | +| `members` | json | Array of member objects \(id, email, role, type, status, etag, kind\) | | `nextPageToken` | string | Token for fetching next page of results | @@ -365,6 +369,7 @@ Get the settings for a Google Group including access permissions, moderation, an | Parameter | Type | Description | | --------- | ---- | ----------- | +| `settings` | json | All returned group settings as one object, with the same fields as the top-level outputs \(email, name, description, whoCanJoin, whoCanViewMembership, whoCanViewGroup, whoCanPostMessage, allowExternalMembers, ..., defaultSender\) | | `email` | string | The group's email address | | `name` | string | The group name \(max 75 characters\) | | `description` | string | The group description \(max 4096 characters\) | @@ -449,6 +454,7 @@ Update the settings for a Google Group including access permissions, moderation, | Parameter | Type | Description | | --------- | ---- | ----------- | +| `settings` | json | All returned group settings as one object, with the same fields as the top-level outputs \(email, name, description, whoCanJoin, whoCanViewMembership, whoCanViewGroup, whoCanPostMessage, allowExternalMembers, ..., defaultSender\) | | `email` | string | The group's email address | | `name` | string | The group name | | `description` | string | The group description | diff --git a/apps/docs/content/docs/integrations/google_meet.mdx b/apps/docs/content/docs/integrations/google_meet.mdx index 87a35b8f48d..aff7852ad50 100644 --- a/apps/docs/content/docs/integrations/google_meet.mdx +++ b/apps/docs/content/docs/integrations/google_meet.mdx @@ -52,6 +52,9 @@ Create a new Google Meet meeting space | Parameter | Type | Description | | --------- | ---- | ----------- | +| `moderation` | string | Host moderation: ON or OFF | +| `attendanceReportGenerationType` | string | Attendance report: GENERATE_REPORT or DO_NOT_GENERATE | +| `artifactConfig` | json | Auto-generated artifacts: recordingConfig.autoRecordingGeneration, transcriptionConfig.autoTranscriptionGeneration, smartNotesConfig.autoSmartNotesGeneration \(ON or OFF\) | | `name` | string | Resource name of the space \(e.g., spaces/abc123\) | | `meetingUri` | string | Meeting URL \(e.g., https://meet.google.com/abc-defg-hij) | | `meetingCode` | string | Meeting code \(e.g., abc-defg-hij\) | @@ -76,6 +79,9 @@ Get details of a Google Meet meeting space by name or meeting code | Parameter | Type | Description | | --------- | ---- | ----------- | +| `moderation` | string | Host moderation: ON or OFF | +| `attendanceReportGenerationType` | string | Attendance report: GENERATE_REPORT or DO_NOT_GENERATE | +| `artifactConfig` | json | Auto-generated artifacts: recordingConfig.autoRecordingGeneration, transcriptionConfig.autoTranscriptionGeneration, smartNotesConfig.autoSmartNotesGeneration \(ON or OFF\) | | `name` | string | Resource name of the space | | `meetingUri` | string | Meeting URL | | `meetingCode` | string | Meeting code | @@ -171,7 +177,7 @@ List participants of a conference record | Parameter | Type | Description | | --------- | ---- | ----------- | -| `participants` | json | List of participants with name, times, display name, and user type | +| `participants` | json | List of participants \[\{ name, earliestStartTime, latestEndTime, displayName, userType \(signed_in, anonymous, phone\), user \(users/\{userId\} for signed-in participants, otherwise null\) \}\] | | `nextPageToken` | string | Token for next page of results | | `totalSize` | number | Total number of participants | diff --git a/apps/docs/content/docs/integrations/google_sheets.mdx b/apps/docs/content/docs/integrations/google_sheets.mdx index 97fa3d0edce..a38a9c55487 100644 --- a/apps/docs/content/docs/integrations/google_sheets.mdx +++ b/apps/docs/content/docs/integrations/google_sheets.mdx @@ -50,6 +50,9 @@ Read data from a specific sheet in a Google Sheets spreadsheet | `spreadsheetId` | string | Yes | Google Sheets spreadsheet ID | | `sheetName` | string | Yes | The name of the sheet/tab to read from | | `cellRange` | string | No | The cell range to read \(e.g. "A1:D10"\). Defaults to "A1:Z1000" if not specified. | +| `majorDimension` | string | No | The major dimension of the returned values: "ROWS" \(default\) or "COLUMNS" | +| `valueRenderOption` | string | No | How values should be rendered: "FORMATTED_VALUE" \(default, as displayed\), "UNFORMATTED_VALUE" \(raw numbers/booleans\), or "FORMULA" \(formulas instead of results\) | +| `dateTimeRenderOption` | string | No | How dates, times, and durations should be rendered: "SERIAL_NUMBER" \(default, days since 1899-12-30\) or "FORMATTED_STRING" \(as displayed\). Ignored when the value render option is "FORMATTED_VALUE". | | `filterColumn` | string | No | Column name \(from the header row\) to filter on. Filtering is applied to the rows returned by the read range \(the default is A1:Z1000\), not the entire sheet. If not provided, no filtering is applied. | | `filterValue` | string | No | Value to match against the filter column. | | `filterMatchType` | string | No | How to match the filter value. Text: "contains", "not_contains", "exact", "not_equals", "starts_with", "ends_with". Numeric/ordering: "gt", "gte", "lt", "lte" \(numeric when both values are numbers, otherwise lexicographic\). Defaults to "contains". | @@ -61,6 +64,7 @@ Read data from a specific sheet in a Google Sheets spreadsheet | `sheetName` | string | Name of the sheet that was read | | `range` | string | The range of cells that was read | | `values` | array | The cell values as a 2D array | +| `majorDimension` | string | Major dimension of the returned values \(ROWS or COLUMNS\) | | `metadata` | json | Spreadsheet metadata including ID and URL | | ↳ `spreadsheetId` | string | Google Sheets spreadsheet ID | | ↳ `spreadsheetUrl` | string | Spreadsheet URL | @@ -82,6 +86,9 @@ Write data to a specific sheet in a Google Sheets spreadsheet | `cellRange` | string | No | The cell range to write to \(e.g. "A1:D10", "A1"\). Defaults to "A1" if not specified. | | `values` | array | Yes | The data to write as a 2D array \(e.g. \[\["Name", "Age"\], \["Alice", 30\], \["Bob", 25\]\]\) or array of objects. | | `valueInputOption` | string | No | The format of the data to write | +| `includeValuesInResponse` | boolean | No | Whether to include the written values in the response | +| `responseValueRenderOption` | string | No | How values in updatedData should be rendered \(only with includeValuesInResponse\): "FORMATTED_VALUE" \(default, as displayed\), "UNFORMATTED_VALUE" \(raw numbers/booleans\), or "FORMULA" \(formulas instead of results\) | +| `responseDateTimeRenderOption` | string | No | How dates in updatedData should be rendered \(only with includeValuesInResponse\): "SERIAL_NUMBER" \(default, days since 1899-12-30\) or "FORMATTED_STRING" \(as displayed\). Ignored when the value render option is "FORMATTED_VALUE". | #### Output @@ -112,6 +119,9 @@ Update data in a specific sheet in a Google Sheets spreadsheet | `cellRange` | string | No | The cell range to update \(e.g. "A1:D10", "A1"\). Defaults to "A1" if not specified. | | `values` | array | Yes | The data to update as a 2D array \(e.g. \[\["Name", "Age"\], \["Alice", 30\]\]\) or array of objects. | | `valueInputOption` | string | No | The format of the data to update | +| `includeValuesInResponse` | boolean | No | Whether to include the updated values in the response | +| `responseValueRenderOption` | string | No | How values in updatedData should be rendered \(only with includeValuesInResponse\): "FORMATTED_VALUE" \(default, as displayed\), "UNFORMATTED_VALUE" \(raw numbers/booleans\), or "FORMULA" \(formulas instead of results\) | +| `responseDateTimeRenderOption` | string | No | How dates in updatedData should be rendered \(only with includeValuesInResponse\): "SERIAL_NUMBER" \(default, days since 1899-12-30\) or "FORMATTED_STRING" \(as displayed\). Ignored when the value render option is "FORMATTED_VALUE". | #### Output @@ -142,6 +152,9 @@ Append data to the end of a specific sheet in a Google Sheets spreadsheet | `values` | array | Yes | The data to append as a 2D array \(e.g. \[\["Alice", 30\], \["Bob", 25\]\]\) or array of objects. | | `valueInputOption` | string | No | The format of the data to append | | `insertDataOption` | string | No | How to insert the data \(OVERWRITE or INSERT_ROWS\) | +| `includeValuesInResponse` | boolean | No | Whether to include the appended values in the response | +| `responseValueRenderOption` | string | No | How values in updatedData should be rendered \(only with includeValuesInResponse\): "FORMATTED_VALUE" \(default, as displayed\), "UNFORMATTED_VALUE" \(raw numbers/booleans\), or "FORMULA" \(formulas instead of results\) | +| `responseDateTimeRenderOption` | string | No | How dates in updatedData should be rendered \(only with includeValuesInResponse\): "SERIAL_NUMBER" \(default, days since 1899-12-30\) or "FORMATTED_STRING" \(as displayed\). Ignored when the value render option is "FORMATTED_VALUE". | #### Output @@ -259,6 +272,7 @@ Read multiple ranges from a Google Sheets spreadsheet in a single request | `ranges` | json | Yes | Array of ranges to read \(e.g., \["Sheet1!A1:D10", "Sheet2!A1:B5"\]\). Each range should include sheet name. | | `majorDimension` | string | No | The major dimension of values: "ROWS" \(default\) or "COLUMNS" | | `valueRenderOption` | string | No | How values should be rendered: "FORMATTED_VALUE" \(default\), "UNFORMATTED_VALUE", or "FORMULA" | +| `dateTimeRenderOption` | string | No | How dates, times, and durations should be rendered: "SERIAL_NUMBER" \(default, days since 1899-12-30\) or "FORMATTED_STRING" \(as displayed\). Ignored when the value render option is "FORMATTED_VALUE". | #### Output @@ -286,8 +300,11 @@ Update multiple ranges in a Google Sheets spreadsheet in a single request | Parameter | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `spreadsheetId` | string | Yes | Google Sheets spreadsheet ID | -| `data` | json | Yes | Array of value ranges to update. Each item should have "range" \(e.g., "Sheet1!A1:D10"\) and "values" \(2D array\). | +| `data` | json | Yes | Array of value ranges to update. Each item should have "range" \(e.g., "Sheet1!A1:D10"\), "values" \(2D array\), and optionally "majorDimension" \("ROWS" default, or "COLUMNS"\). | | `valueInputOption` | string | No | How input data should be interpreted: "RAW" or "USER_ENTERED" \(default\). USER_ENTERED parses formulas. | +| `includeValuesInResponse` | boolean | No | Whether each entry in responses should include updatedData with the values of the updated cells. Defaults to false. | +| `responseValueRenderOption` | string | No | How values in updatedData should be rendered \(only with includeValuesInResponse\): "FORMATTED_VALUE" \(default, as displayed\), "UNFORMATTED_VALUE" \(raw numbers/booleans\), or "FORMULA" \(formulas instead of results\) | +| `responseDateTimeRenderOption` | string | No | How dates in updatedData should be rendered \(only with includeValuesInResponse\): "SERIAL_NUMBER" \(default, days since 1899-12-30\) or "FORMATTED_STRING" \(as displayed\). Ignored when the value render option is "FORMATTED_VALUE". | #### Output diff --git a/apps/docs/content/docs/integrations/google_slides.mdx b/apps/docs/content/docs/integrations/google_slides.mdx index 5c5aa00df9b..511cc42560f 100644 --- a/apps/docs/content/docs/integrations/google_slides.mdx +++ b/apps/docs/content/docs/integrations/google_slides.mdx @@ -52,6 +52,12 @@ Read content from a Google Slides presentation | Parameter | Type | Description | | --------- | ---- | ----------- | | `slides` | json | Array of slides with their content | +| `slideContents` | array | Plain-text view of each slide in order, including speaker notes | +| ↳ `objectId` | string | Slide object ID | +| ↳ `index` | number | Zero-based slide position | +| ↳ `text` | string | Text from the slide shapes, tables, and groups, one block per line | +| ↳ `speakerNotes` | string | Speaker notes text \(empty if none\) | +| ↳ `isSkipped` | boolean | Whether the slide is skipped in presentation mode | | `metadata` | json | Presentation metadata including ID, title, and URL | | ↳ `presentationId` | string | The presentation ID | | ↳ `title` | string | The presentation title | @@ -60,6 +66,8 @@ Read content from a Google Slides presentation | ↳ `height` | json | Page height as a Dimension object | | ↳ `mimeType` | string | The mime type of the presentation | | ↳ `url` | string | URL to open the presentation | +| ↳ `revisionId` | string | Revision ID of the presentation \(only for users with edit access\); pass as requiredRevisionId in a batch update writeControl | +| ↳ `locale` | string | Presentation locale as an IETF BCP 47 language tag | @@ -259,6 +267,14 @@ Get detailed information about a specific slide/page in a Google Slides presenta | ↳ `layoutObjectId` | string | Object ID of the layout this slide is based on | | ↳ `masterObjectId` | string | Object ID of the master this slide is based on | | ↳ `notesPage` | json | The notes page associated with the slide | +| ↳ `isSkipped` | boolean | Whether the slide is skipped in presentation mode | +| `revisionId` | string | Revision ID of the presentation; pass as requiredRevisionId in a batch update writeControl | +| `pageProperties` | json | Page properties \(background fill, color scheme\) | +| `layoutProperties` | json | Layout properties \(masterObjectId, name, displayName\); set only for LAYOUT pages | +| `notesProperties` | json | Notes properties \(speakerNotesObjectId\); set only for NOTES pages | +| `masterProperties` | json | Master properties \(displayName\); set only for MASTER pages | +| `pageText` | string | Text from the page shapes, tables, and groups, one block per line | +| `speakerNotes` | string | Speaker notes text of the slide \(empty if none\) | | `metadata` | object | Operation metadata including presentation ID and URL | | ↳ `presentationId` | string | The presentation ID | | ↳ `url` | string | URL to the presentation | diff --git a/apps/docs/content/docs/integrations/google_tasks.mdx b/apps/docs/content/docs/integrations/google_tasks.mdx index 85f987a6465..be354522021 100644 --- a/apps/docs/content/docs/integrations/google_tasks.mdx +++ b/apps/docs/content/docs/integrations/google_tasks.mdx @@ -47,7 +47,7 @@ Create a new task in a Google Tasks list | `taskListId` | string | No | Task list ID \(defaults to primary task list "@default"\) | | `title` | string | Yes | Title of the task \(max 1024 characters\) | | `notes` | string | No | Notes/description for the task \(max 8192 characters\) | -| `due` | string | No | Due date in RFC 3339 format \(e.g., 2025-06-03T00:00:00.000Z\) | +| `due` | string | No | Due date in RFC 3339 format \(e.g., 2025-06-03T00:00:00.000Z\). Google Tasks stores only the date; the time is discarded | | `status` | string | No | Task status: "needsAction" or "completed" | | `parent` | string | No | Parent task ID to create this task as a subtask. Omit for top-level tasks. | | `previous` | string | No | Previous sibling task ID to position after. Omit to place first among siblings. | @@ -56,6 +56,11 @@ Create a new task in a Google Tasks list | Parameter | Type | Description | | --------- | ---- | ----------- | +| `links` | array | Read-only links attached to the task | +| ↳ `type` | string | Link type \(e.g., "email", "generic", "chat_message", "keep_note"\) | +| ↳ `description` | string | Link description | +| ↳ `link` | string | The URL | +| `assignmentInfo` | json | Source of a task assigned to the current user from Google Docs or Chat \(linkToTask, surfaceType, driveResourceInfo, spaceInfo\) | | `id` | string | Task ID | | `title` | string | Task title | | `notes` | string | Task notes | @@ -68,6 +73,7 @@ Create a new task in a Google Tasks list | `position` | string | Position among sibling tasks | | `completed` | string | Completion date | | `deleted` | boolean | Whether the task is deleted | +| `hidden` | boolean | Whether the task was hidden when its list was cleared | @@ -84,7 +90,7 @@ List all tasks in a Google Tasks list | `taskListId` | string | No | Task list ID \(defaults to primary task list "@default"\) | | `maxResults` | number | No | Maximum number of tasks to return \(default 20, max 100\) | | `pageToken` | string | No | Token for pagination | -| `showCompleted` | boolean | No | Whether to show completed tasks \(default true\) | +| `showCompleted` | boolean | No | Whether to show completed tasks \(default true\). Tasks completed in the Google Tasks apps are also hidden, so set showHidden to true to include them | | `showDeleted` | boolean | No | Whether to show deleted tasks \(default false\) | | `showHidden` | boolean | No | Whether to show hidden tasks \(default false\) | | `dueMin` | string | No | Lower bound for due date filter \(RFC 3339 timestamp\) | @@ -92,12 +98,18 @@ List all tasks in a Google Tasks list | `completedMin` | string | No | Lower bound for task completion date \(RFC 3339 timestamp\) | | `completedMax` | string | No | Upper bound for task completion date \(RFC 3339 timestamp\) | | `updatedMin` | string | No | Lower bound for last modification time \(RFC 3339 timestamp\) | +| `showAssigned` | boolean | No | Whether to include tasks assigned to the current user from Google Docs or Chat \(default false\) | #### Output | Parameter | Type | Description | | --------- | ---- | ----------- | | `tasks` | array | List of tasks | +| ↳ `links` | array | Read-only links attached to the task | +| ↳ `type` | string | Link type \(e.g., "email", "generic", "chat_message", "keep_note"\) | +| ↳ `description` | string | Link description | +| ↳ `link` | string | The URL | +| ↳ `assignmentInfo` | json | Source of a task assigned to the current user from Google Docs or Chat \(linkToTask, surfaceType, driveResourceInfo, spaceInfo\) | | ↳ `id` | string | Task identifier | | ↳ `title` | string | Title of the task | | ↳ `notes` | string | Notes/description for the task | @@ -111,10 +123,6 @@ List all tasks in a Google Tasks list | ↳ `position` | string | Position among sibling tasks \(string-based ordering\) | | ↳ `hidden` | boolean | Whether the task is hidden | | ↳ `deleted` | boolean | Whether the task is deleted | -| ↳ `links` | array | Collection of links associated with the task | -| ↳ `type` | string | Link type \(e.g., "email", "generic", "chat_message"\) | -| ↳ `description` | string | Link description | -| ↳ `link` | string | The URL | | `nextPageToken` | string | Token for retrieving the next page of results | @@ -136,6 +144,11 @@ Retrieve a specific task by ID from a Google Tasks list | Parameter | Type | Description | | --------- | ---- | ----------- | +| `links` | array | Read-only links attached to the task | +| ↳ `type` | string | Link type \(e.g., "email", "generic", "chat_message", "keep_note"\) | +| ↳ `description` | string | Link description | +| ↳ `link` | string | The URL | +| `assignmentInfo` | json | Source of a task assigned to the current user from Google Docs or Chat \(linkToTask, surfaceType, driveResourceInfo, spaceInfo\) | | `id` | string | Task ID | | `title` | string | Task title | | `notes` | string | Task notes | @@ -148,6 +161,7 @@ Retrieve a specific task by ID from a Google Tasks list | `position` | string | Position among sibling tasks | | `completed` | string | Completion date | | `deleted` | boolean | Whether the task is deleted | +| `hidden` | boolean | Whether the task was hidden when its list was cleared | @@ -165,13 +179,18 @@ Update an existing task in a Google Tasks list | `taskId` | string | Yes | The ID of the task to update | | `title` | string | No | New title for the task | | `notes` | string | No | New notes for the task | -| `due` | string | No | New due date in RFC 3339 format | +| `due` | string | No | New due date in RFC 3339 format. Google Tasks stores only the date; the time is discarded | | `status` | string | No | New status: "needsAction" or "completed" | #### Output | Parameter | Type | Description | | --------- | ---- | ----------- | +| `links` | array | Read-only links attached to the task | +| ↳ `type` | string | Link type \(e.g., "email", "generic", "chat_message", "keep_note"\) | +| ↳ `description` | string | Link description | +| ↳ `link` | string | The URL | +| `assignmentInfo` | json | Source of a task assigned to the current user from Google Docs or Chat \(linkToTask, surfaceType, driveResourceInfo, spaceInfo\) | | `id` | string | Task ID | | `title` | string | Task title | | `notes` | string | Task notes | @@ -184,6 +203,7 @@ Update an existing task in a Google Tasks list | `position` | string | Position among sibling tasks | | `completed` | string | Completion date | | `deleted` | boolean | Whether the task is deleted | +| `hidden` | boolean | Whether the task was hidden when its list was cleared | @@ -219,7 +239,7 @@ Retrieve all task lists for the authenticated user | Parameter | Type | Required | Description | | --------- | ---- | -------- | ----------- | -| `maxResults` | number | No | Maximum number of task lists to return \(default 20, max 100\) | +| `maxResults` | number | No | Maximum number of task lists to return \(default 1000, max 1000\) | | `pageToken` | string | No | Token for pagination | #### Output diff --git a/apps/docs/content/docs/integrations/google_vault.mdx b/apps/docs/content/docs/integrations/google_vault.mdx index 34c1842c41b..2d0280175ca 100644 --- a/apps/docs/content/docs/integrations/google_vault.mdx +++ b/apps/docs/content/docs/integrations/google_vault.mdx @@ -54,12 +54,15 @@ Create an export in a matter | `startTime` | string | No | Start time for date filtering \(ISO 8601 format, e.g., "2024-01-01T00:00:00Z"\) | | `endTime` | string | No | End time for date filtering \(ISO 8601 format, e.g., "2024-12-31T23:59:59Z"\) | | `terms` | string | No | Search query terms to filter exported content \(e.g., "from:sender@example.com subject:invoice"\) | +| `includeSharedDrives` | boolean | No | Set to true to include files in shared drives \(DRIVE corpus only\) | +| `exportFormat` | string | No | File format for exported messages: MBOX or PST \(MAIL, GROUPS, HANGOUTS_CHAT, and VOICE corpus; ignored for DRIVE\) | +| `dataScope` | string | No | Data to search: ALL_DATA \(default\), HELD_DATA \(only data on hold\), or UNPROCESSED_DATA \(MAIL and GROUPS only\) | #### Output | Parameter | Type | Description | | --------- | ---- | ----------- | -| `export` | json | Created export object | +| `export` | json | Created export object \(id, matterId, name, status, createTime, query, exportOptions, requester, stats, cloudStorageSink once completed\) | @@ -75,15 +78,15 @@ List exports for a matter | --------- | ---- | -------- | ----------- | | `matterId` | string | Yes | The matter ID \(e.g., "12345678901234567890"\) | | `pageSize` | number | No | Number of exports to return per page | -| `pageToken` | string | No | Token for pagination | +| `pageToken` | string | No | Token for pagination \(nextPageToken from a previous response\) | | `exportId` | string | No | Optional export ID to fetch a specific export \(e.g., "exportId123456"\) | #### Output | Parameter | Type | Description | | --------- | ---- | ----------- | -| `exports` | json | Array of export objects | -| `export` | json | Single export object \(when exportId is provided\) | +| `exports` | json | Array of export objects \(id, name, status, createTime, query, exportOptions, requester, stats, cloudStorageSink.files with bucketName/objectName/size/md5Hash\) | +| `export` | json | Single export object \(when exportId is provided\), with the same fields as each exports entry | | `nextPageToken` | string | Token for fetching next page of results | @@ -172,14 +175,14 @@ List holds for a matter | --------- | ---- | -------- | ----------- | | `matterId` | string | Yes | The matter ID \(e.g., "12345678901234567890"\) | | `pageSize` | number | No | Number of holds to return per page | -| `pageToken` | string | No | Token for pagination | +| `pageToken` | string | No | Token for pagination \(nextPageToken from a previous response\) | | `holdId` | string | No | Optional hold ID to fetch a specific hold \(e.g., "holdId123456"\) | #### Output | Parameter | Type | Description | | --------- | ---- | ----------- | -| `holds` | json | Array of hold objects | +| `holds` | json | Array of hold objects \(holdId, name, corpus, updateTime, query, accounts with accountId/email/firstName/lastName/holdTime, or orgUnit\) | | `hold` | json | Single hold object \(when holdId is provided\) | | `nextPageToken` | string | Token for fetching next page of results | @@ -313,15 +316,17 @@ List matters, or get a specific matter if matterId is provided | Parameter | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `pageSize` | number | No | Number of matters to return per page | -| `pageToken` | string | No | Token for pagination | +| `pageToken` | string | No | Token for pagination \(nextPageToken from a previous response\) | | `matterId` | string | No | Optional matter ID to fetch a specific matter \(e.g., "12345678901234567890"\) | +| `view` | string | No | Amount of detail to return: BASIC \(ID, name, description, state; the default\) or FULL \(also includes matterPermissions, the owners and collaborators\) | +| `state` | string | No | Only list matters in this state: OPEN, CLOSED, or DELETED \(default lists all states; ignored when matterId is provided\) | #### Output | Parameter | Type | Description | | --------- | ---- | ----------- | -| `matters` | json | Array of matter objects | -| `matter` | json | Single matter object \(when matterId is provided\) | +| `matters` | json | Array of matter objects \(matterId, name, description, state; matterPermissions when view is FULL\) | +| `matter` | json | Single matter object \(when matterId is provided\): matterId, name, description, state; matterPermissions when view is FULL | | `nextPageToken` | string | Token for fetching next page of results | @@ -491,6 +496,8 @@ Save a reusable search query in a matter | `startTime` | string | No | Start time for date filtering \(ISO 8601 format, e.g., "2024-01-01T00:00:00Z"\) | | `endTime` | string | No | End time for date filtering \(ISO 8601 format, e.g., "2024-12-31T23:59:59Z"\) | | `terms` | string | No | Search query terms \(e.g., "from:sender@example.com subject:invoice"\) | +| `includeSharedDrives` | boolean | No | Set to true to include files in shared drives \(DRIVE corpus only\) | +| `dataScope` | string | No | Data to search: ALL_DATA \(default\), HELD_DATA \(only data on hold\), or UNPROCESSED_DATA \(MAIL and GROUPS only\) | #### Output diff --git a/apps/sim/blocks/blocks/gmail.ts b/apps/sim/blocks/blocks/gmail.ts index af7e410a04c..269d03294eb 100644 --- a/apps/sim/blocks/blocks/gmail.ts +++ b/apps/sim/blocks/blocks/gmail.ts @@ -312,6 +312,15 @@ Return ONLY the email body - no explanations, no extra text.`, mode: 'advanced', required: false, }, + { + id: 'replyTo', + title: 'Reply-To', + type: 'short-input', + placeholder: 'Address replies should go to (e.g., support@example.com)', + condition: { field: 'operation', value: ['send_gmail', 'draft_gmail', 'edit_draft_gmail'] }, + mode: 'advanced', + required: false, + }, // Label/folder selector (basic mode) { id: 'folder', @@ -382,9 +391,19 @@ Return ONLY the search query - no explanations, no extra text.`, id: 'maxResults', title: 'Max Results', type: 'short-input', - placeholder: 'Maximum number of results (default: 10)', + placeholder: + 'Maximum number of results (read: default 1, max 10; search: default 100, max 500)', condition: { field: 'operation', value: ['search_gmail', 'read_gmail'] }, }, + { + id: 'pageToken', + title: 'Page Token', + type: 'short-input', + placeholder: 'nextPageToken from a previous search', + condition: { field: 'operation', value: 'search_gmail' }, + mode: 'advanced', + required: false, + }, // Move Email Fields { id: 'moveMessageId', @@ -603,10 +622,11 @@ Return ONLY the search query - no explanations, no extra text.`, threadId: { type: 'string', description: 'Thread ID to reply to (for threading)' }, replyToMessageId: { type: 'string', - description: 'Gmail message ID to reply to (use "id" field from results, not "messageId")', + description: 'Gmail message ID to reply to (use "id" field from results, not "rfcMessageId")', }, cc: { type: 'string', description: 'CC recipients (comma-separated)' }, bcc: { type: 'string', description: 'BCC recipients (comma-separated)' }, + replyTo: { type: 'string', description: 'Reply-To address for the outgoing email' }, attachments: { type: 'array', description: 'Files to attach (canonical param)' }, // Read operation inputs folder: { type: 'string', description: 'Gmail folder (canonical param)' }, @@ -616,6 +636,10 @@ Return ONLY the search query - no explanations, no extra text.`, // Search operation inputs query: { type: 'string', description: 'Search query' }, maxResults: { type: 'number', description: 'Maximum results' }, + pageToken: { + type: 'string', + description: 'Search page token (nextPageToken from a prior search)', + }, // Move operation inputs moveMessageId: { type: 'string', description: 'Message ID to move' }, addLabelIds: { type: 'string', description: 'Label IDs to add (canonical param)' }, @@ -632,7 +656,11 @@ Return ONLY the search query - no explanations, no extra text.`, outputs: { // Tool outputs content: { type: 'string', description: 'Response content' }, - metadata: { type: 'json', description: 'Email metadata' }, + metadata: { + type: 'json', + description: + 'Email metadata (id, threadId, labelIds, from, to, cc, bcc, replyTo, subject, date, rfcMessageId, inReplyTo, references, snippet, internalDate, hasAttachments, attachmentCount); search/multi-read returns results[] with the same header fields plus nextPageToken and resultSizeEstimate for search', + }, attachments: { type: 'file[]', description: 'Email attachments array' }, // Trigger outputs email_id: { type: 'string', description: 'Gmail message ID' }, @@ -655,6 +683,223 @@ Return ONLY the search query - no explanations, no extra text.`, }, } +const LABEL_WRITE_OPERATIONS = ['create_label_gmail', 'update_label_gmail'] +const LABEL_TARGET_OPERATIONS = ['update_label_gmail', 'delete_label_gmail'] +const THREAD_TARGET_OPERATIONS = ['get_thread_gmail', 'trash_thread_gmail', 'untrash_thread_gmail'] +const LIST_OPERATIONS = ['list_drafts_gmail', 'list_threads_gmail'] +const PAGINATED_OPERATIONS = ['search_gmail', ...LIST_OPERATIONS] +const LABEL_TARGET_FIELD = ['labelTarget', 'manualLabelTarget'] as const + +/** Operations only the V2 block exposes; their tools exist only in a `_v2` version. */ +const GMAIL_V2_OPERATION_TOOLS: Record = { + list_labels_gmail: 'gmail_list_labels_v2', + create_label_gmail: 'gmail_create_label_v2', + update_label_gmail: 'gmail_update_label_v2', + delete_label_gmail: 'gmail_delete_label_v2', + list_drafts_gmail: 'gmail_list_drafts_v2', + get_draft_gmail: 'gmail_get_draft_v2', + delete_draft_gmail: 'gmail_delete_draft_v2', + list_threads_gmail: 'gmail_list_threads_v2', + get_thread_gmail: 'gmail_get_thread_v2', + trash_thread_gmail: 'gmail_trash_thread_v2', + untrash_thread_gmail: 'gmail_untrash_thread_v2', +} + +function selectGmailV2ToolId(params: Record): string { + const operation = typeof params.operation === 'string' ? params.operation : '' + return ( + (Object.hasOwn(GMAIL_V2_OPERATION_TOOLS, operation) && GMAIL_V2_OPERATION_TOOLS[operation]) || + selectGmailToolId(params) + ) +} + +const GMAIL_V2_OPERATION_OPTIONS = [ + { label: 'List Labels', id: 'list_labels_gmail' }, + { label: 'Create Label', id: 'create_label_gmail' }, + { label: 'Update Label', id: 'update_label_gmail' }, + { label: 'Delete Label', id: 'delete_label_gmail' }, + { label: 'List Drafts', id: 'list_drafts_gmail' }, + { label: 'Get Draft', id: 'get_draft_gmail' }, + { label: 'Delete Draft', id: 'delete_draft_gmail' }, + { label: 'List Threads', id: 'list_threads_gmail' }, + { label: 'Get Thread', id: 'get_thread_gmail' }, + { label: 'Trash Thread', id: 'trash_thread_gmail' }, + { label: 'Untrash Thread', id: 'untrash_thread_gmail' }, +] + +const GMAIL_V2_SUBBLOCKS: BlockConfig['subBlocks'] = [ + { + id: 'labelTarget', + title: 'Label', + type: 'folder-selector', + canonicalParamId: 'labelId', + serviceId: 'gmail', + selectorKey: 'gmail.labels', + requiredScopes: getScopesForService('gmail'), + placeholder: 'Select label', + dependsOn: ['credential'], + mode: 'basic', + condition: { field: 'operation', value: LABEL_TARGET_OPERATIONS }, + required: true, + }, + { + id: 'manualLabelTarget', + title: 'Label ID', + type: 'short-input', + canonicalParamId: 'labelId', + placeholder: 'Enter label ID (e.g., Label_123)', + dependsOn: ['credential'], + mode: 'advanced', + condition: { field: 'operation', value: LABEL_TARGET_OPERATIONS }, + required: true, + }, + { + id: 'labelName', + title: 'Label Name', + type: 'short-input', + placeholder: 'Label display name (e.g., Clients/Acme)', + condition: { field: 'operation', value: LABEL_WRITE_OPERATIONS }, + required: { field: 'operation', value: 'create_label_gmail' }, + }, + { + id: 'messageListVisibility', + title: 'Message List Visibility', + type: 'dropdown', + options: [ + { label: 'Default', id: '' }, + { label: 'Show', id: 'show' }, + { label: 'Hide', id: 'hide' }, + ], + value: () => '', + condition: { field: 'operation', value: LABEL_WRITE_OPERATIONS }, + mode: 'advanced', + required: false, + }, + { + id: 'labelListVisibility', + title: 'Label List Visibility', + type: 'dropdown', + options: [ + { label: 'Default', id: '' }, + { label: 'Show', id: 'labelShow' }, + { label: 'Show if unread', id: 'labelShowIfUnread' }, + { label: 'Hide', id: 'labelHide' }, + ], + value: () => '', + condition: { field: 'operation', value: LABEL_WRITE_OPERATIONS }, + mode: 'advanced', + required: false, + }, + { + id: 'targetThreadId', + title: 'Thread ID', + type: 'short-input', + placeholder: 'ID of the thread (threadId from Read, Search, or List Threads)', + condition: { field: 'operation', value: THREAD_TARGET_OPERATIONS }, + required: true, + }, + { + id: 'threadFormat', + title: 'Format', + type: 'dropdown', + options: [ + { label: 'Full', id: 'full' }, + { label: 'Metadata', id: 'metadata' }, + { label: 'Minimal', id: 'minimal' }, + ], + value: () => 'full', + condition: { field: 'operation', value: 'get_thread_gmail' }, + mode: 'advanced', + required: false, + }, + { + id: 'listQuery', + title: 'Search Query', + type: 'short-input', + placeholder: 'Optional Gmail search filter (e.g., from:alice is:unread)', + condition: { field: 'operation', value: LIST_OPERATIONS }, + required: false, + wandConfig: { + enabled: true, + prompt: `Generate a Gmail search query based on the user's request. +Gmail search supports operators like: +- from: to: subject: has:attachment +- is:unread is:starred is:important +- before: after: older: newer: +- filename: label: category: + +Return ONLY the search query - no explanations, no extra text.`, + placeholder: 'Describe which drafts or threads you want...', + }, + }, + { + id: 'threadLabelIds', + title: 'Label IDs', + type: 'short-input', + placeholder: 'Comma-separated label IDs (e.g., INBOX,Label_123)', + condition: { field: 'operation', value: 'list_threads_gmail' }, + mode: 'advanced', + required: false, + wandConfig: { + enabled: true, + prompt: `Generate a comma-separated list of Gmail label IDs based on the user's request. +System labels are uppercase (INBOX, SENT, DRAFT, SPAM, TRASH, STARRED, IMPORTANT, UNREAD); custom labels look like Label_123. + +Return ONLY the comma-separated label IDs - no explanations, no extra text.`, + placeholder: 'Describe which labels to filter by...', + }, + }, +] + +function buildGmailV2SubBlocks(): BlockConfig['subBlocks'] { + return GmailBlock.subBlocks.flatMap((subBlock) => { + switch (subBlock.id) { + case 'operation': + return [ + { + ...subBlock, + options: [ + ...(Array.isArray(subBlock.options) ? subBlock.options : []), + ...GMAIL_V2_OPERATION_OPTIONS, + ], + }, + ] + case 'draftId': + return [ + { + ...subBlock, + placeholder: 'ID of the draft (from List Drafts)', + condition: { + field: 'operation', + value: ['edit_draft_gmail', 'get_draft_gmail', 'delete_draft_gmail'], + }, + }, + ] + case 'maxResults': + return [ + { + ...subBlock, + placeholder: + 'Maximum number of results (read: default 1, max 10; search and lists: default 100, max 500)', + condition: { field: 'operation', value: ['read_gmail', ...PAGINATED_OPERATIONS] }, + }, + ] + case 'pageToken': + return [ + { + ...subBlock, + placeholder: 'nextPageToken from a previous search or list', + condition: { field: 'operation', value: PAGINATED_OPERATIONS }, + }, + ] + case 'manualLabelId': + return [subBlock, ...GMAIL_V2_SUBBLOCKS] + default: + return [subBlock] + } + }) +} + export const GmailV2Block: BlockConfig = { ...GmailBlock, sunset: undefined, @@ -662,6 +907,33 @@ export const GmailV2Block: BlockConfig = { name: 'Gmail', hideFromToolbar: false, integrationType: IntegrationType.Email, + canvasPresentation: GmailBlock.canvasPresentation && { + ...GmailBlock.canvasPresentation, + sentences: { + byOperation: { + ...GmailBlock.canvasPresentation.sentences?.byOperation, + list_labels_gmail: ['List labels'], + create_label_gmail: [{ text: 'Create label', field: 'labelName', core: true }], + update_label_gmail: [ + { text: 'Update label', field: LABEL_TARGET_FIELD, core: true }, + { text: ', renaming it to', field: 'labelName' }, + ], + delete_label_gmail: [{ text: 'Delete label', field: LABEL_TARGET_FIELD, core: true }], + list_drafts_gmail: ['List drafts', { text: 'matching', field: 'listQuery' }], + get_draft_gmail: [{ text: 'Get draft', field: 'draftId', core: true }], + delete_draft_gmail: [{ text: 'Delete draft', field: 'draftId', core: true }], + list_threads_gmail: ['List threads', { text: 'matching', field: 'listQuery' }], + get_thread_gmail: [{ text: 'Get thread', field: 'targetThreadId', core: true }], + trash_thread_gmail: [ + { text: 'Move thread', field: 'targetThreadId', core: true, after: 'to trash' }, + ], + untrash_thread_gmail: [ + { text: 'Restore thread', field: 'targetThreadId', core: true, after: 'from trash' }, + ], + }, + }, + }, + subBlocks: buildGmailV2SubBlocks(), tools: { ...GmailBlock.tools, access: [ @@ -679,48 +951,196 @@ export const GmailV2Block: BlockConfig = { 'gmail_add_label_v2', 'gmail_remove_label_v2', 'gmail_list_labels_v2', + 'gmail_create_label_v2', + 'gmail_update_label_v2', + 'gmail_delete_label_v2', + 'gmail_list_drafts_v2', + 'gmail_get_draft_v2', + 'gmail_delete_draft_v2', + 'gmail_list_threads_v2', + 'gmail_get_thread_v2', + 'gmail_trash_thread_v2', + 'gmail_untrash_thread_v2', ], config: { ...GmailBlock.tools?.config, tool: createVersionedToolSelector({ - baseToolSelector: selectGmailToolId, + baseToolSelector: selectGmailV2ToolId, suffix: '_v2', fallbackToolId: 'gmail_send_v2', }), + params: (params) => { + const mapped = GmailBlock.tools?.config?.params?.(params) ?? params + const { labelName, targetThreadId, threadFormat, listQuery, threadLabelIds, ...rest } = + mapped + if (LABEL_WRITE_OPERATIONS.includes(rest.operation)) { + rest.name = labelName || undefined + rest.messageListVisibility = rest.messageListVisibility || undefined + rest.labelListVisibility = rest.labelListVisibility || undefined + } + if (THREAD_TARGET_OPERATIONS.includes(rest.operation)) { + rest.threadId = targetThreadId + rest.format = threadFormat || undefined + } + if (LIST_OPERATIONS.includes(rest.operation)) { + rest.query = listQuery || undefined + rest.labelIds = threadLabelIds ? String(threadLabelIds).trim() : undefined + } + return rest + }, }, }, + inputs: { + ...GmailBlock.inputs, + labelId: { type: 'string', description: 'Label ID to update or delete (canonical param)' }, + labelName: { type: 'string', description: 'Label display name' }, + messageListVisibility: { + type: 'string', + description: 'Message list visibility for the label (show or hide)', + }, + labelListVisibility: { + type: 'string', + description: 'Label list visibility (labelShow, labelShowIfUnread, or labelHide)', + }, + targetThreadId: { type: 'string', description: 'Thread ID for thread operations' }, + threadFormat: { type: 'string', description: 'Thread format (full, metadata, or minimal)' }, + listQuery: { type: 'string', description: 'Search filter for listing drafts or threads' }, + threadLabelIds: { type: 'string', description: 'Comma-separated label IDs to filter threads' }, + }, outputs: { // V2 tool outputs (API-aligned) - id: { type: 'string', description: 'Gmail message ID' }, + id: { + type: 'string', + description: + 'Gmail message ID (thread ID for thread operations, label ID for label operations, draft ID for Get Draft)', + }, threadId: { type: 'string', description: 'Gmail thread ID' }, labelIds: { type: 'array', description: 'Email label IDs' }, from: { type: 'string', description: 'Sender' }, to: { type: 'string', description: 'To' }, + bcc: { type: 'string', description: 'Bcc recipients (only on messages you sent or drafted)' }, + replyTo: { type: 'string', description: 'Reply-To header' }, subject: { type: 'string', description: 'Subject' }, date: { type: 'string', description: 'Date' }, + rfcMessageId: { + type: 'string', + description: 'RFC Message-ID header (not the Gmail message id)', + }, + inReplyTo: { type: 'string', description: 'In-Reply-To header' }, + references: { type: 'string', description: 'References header' }, + snippet: { type: 'string', description: 'Short excerpt of the message text' }, + internalDate: { + type: 'string', + description: 'Gmail internal creation timestamp in epoch milliseconds', + }, body: { type: 'string', description: 'Email body text (best-effort)' }, - results: { type: 'json', description: 'Search/read summary results' }, + results: { + type: 'json', + description: + 'Search/read summary results [{id, threadId, subject, from, to, cc, bcc, replyTo, date, snippet, rfcMessageId, inReplyTo, references, internalDate}]', + }, + nextPageToken: { + type: 'string', + description: 'Token for the next page of results', + condition: { field: 'operation', value: PAGINATED_OPERATIONS }, + }, + resultSizeEstimate: { + type: 'number', + description: 'Estimated total number of results', + condition: { field: 'operation', value: PAGINATED_OPERATIONS }, + }, + name: { + type: 'string', + description: 'Label display name', + condition: { field: 'operation', value: LABEL_WRITE_OPERATIONS }, + }, + type: { + type: 'string', + description: 'Label type (system or user)', + condition: { field: 'operation', value: LABEL_WRITE_OPERATIONS }, + }, + messageListVisibility: { + type: 'string', + description: 'Message list visibility of the label', + condition: { field: 'operation', value: LABEL_WRITE_OPERATIONS }, + }, + labelListVisibility: { + type: 'string', + description: 'Label list visibility of the label', + condition: { field: 'operation', value: LABEL_WRITE_OPERATIONS }, + }, + labelId: { + type: 'string', + description: 'ID of the deleted label', + condition: { field: 'operation', value: 'delete_label_gmail' }, + }, + deleted: { + type: 'boolean', + description: 'Whether the label or draft was deleted', + condition: { field: 'operation', value: ['delete_label_gmail', 'delete_draft_gmail'] }, + }, + drafts: { + type: 'json', + description: 'Drafts [{id, messageId, threadId}]', + condition: { field: 'operation', value: 'list_drafts_gmail' }, + }, + threads: { + type: 'json', + description: 'Threads [{id, snippet, historyId}]', + condition: { field: 'operation', value: 'list_threads_gmail' }, + }, + messages: { + type: 'json', + description: + 'Thread messages [{id, threadId, labelIds, snippet, from, to, cc, bcc, replyTo, subject, date, rfcMessageId, inReplyTo, references, internalDate, body}]', + condition: { field: 'operation', value: 'get_thread_gmail' }, + }, + historyId: { + type: 'string', + description: 'ID of the last history record that modified the thread', + condition: { field: 'operation', value: 'get_thread_gmail' }, + }, + trashed: { + type: 'boolean', + description: 'Whether the thread was moved to trash', + condition: { field: 'operation', value: 'trash_thread_gmail' }, + }, + untrashed: { + type: 'boolean', + description: 'Whether the thread was restored from trash', + condition: { field: 'operation', value: 'untrash_thread_gmail' }, + }, attachments: { type: 'file[]', description: 'Downloaded attachments (if enabled)' }, // Draft-specific outputs draftId: { type: 'string', description: 'Draft ID', - condition: { field: 'operation', value: ['draft_gmail', 'edit_draft_gmail'] }, + condition: { + field: 'operation', + value: ['draft_gmail', 'edit_draft_gmail', 'delete_draft_gmail'], + }, }, messageId: { type: 'string', description: 'Gmail message ID for the draft', - condition: { field: 'operation', value: ['draft_gmail', 'edit_draft_gmail'] }, + condition: { + field: 'operation', + value: ['draft_gmail', 'edit_draft_gmail', 'get_draft_gmail'], + }, }, // Trigger outputs (unchanged) email_id: { type: 'string', description: 'Gmail message ID' }, thread_id: { type: 'string', description: 'Gmail thread ID' }, - cc: { type: 'string', description: 'CC recipients (comma-separated)' }, + cc: { type: 'string', description: 'Cc recipients (raw Cc header, comma-separated)' }, body_text: { type: 'string', description: 'Plain text email body' }, body_html: { type: 'string', description: 'HTML email body' }, - labels: { type: 'string', description: 'Email labels (comma-separated)' }, + labels: { + type: 'json', + description: + 'Email labels (trigger, comma-separated); for List Labels, the label array [{id, name, type, messageListVisibility, labelListVisibility}]', + }, has_attachments: { type: 'boolean', description: 'Whether email has attachments' }, raw_email: { type: 'json', description: 'Complete raw email data from Gmail API (if enabled)' }, timestamp: { type: 'string', description: 'Event timestamp' }, diff --git a/apps/sim/blocks/blocks/google_calendar.ts b/apps/sim/blocks/blocks/google_calendar.ts index 0a4c73828b2..c3ff09602b3 100644 --- a/apps/sim/blocks/blocks/google_calendar.ts +++ b/apps/sim/blocks/blocks/google_calendar.ts @@ -338,6 +338,58 @@ Return ONLY the RRULE string - no explanations, no extra text.`, condition: { field: 'operation', value: ['create', 'update'] }, mode: 'advanced', }, + { + id: 'optionalAttendees', + title: 'Optional Attendees (comma-separated emails)', + type: 'short-input', + placeholder: 'alex@example.com, sam@example.com', + condition: { field: 'operation', value: 'create' }, + mode: 'advanced', + }, + { + id: 'visibility', + title: 'Visibility', + type: 'dropdown', + condition: { field: 'operation', value: ['create', 'update'] }, + mode: 'advanced', + options: [ + { label: 'Calendar default (unchanged on update)', id: '' }, + { label: 'Default', id: 'default' }, + { label: 'Public', id: 'public' }, + { label: 'Private', id: 'private' }, + { label: 'Confidential', id: 'confidential' }, + ], + value: () => '', + }, + { + id: 'transparency', + title: 'Show As', + type: 'dropdown', + condition: { field: 'operation', value: ['create', 'update'] }, + mode: 'advanced', + options: [ + { label: 'Calendar default (unchanged on update)', id: '' }, + { label: 'Busy', id: 'opaque' }, + { label: 'Free', id: 'transparent' }, + ], + value: () => '', + }, + { + id: 'colorId', + title: 'Color ID', + type: 'short-input', + placeholder: '1-11', + condition: { field: 'operation', value: ['create', 'update'] }, + mode: 'advanced', + }, + { + id: 'reminders', + title: 'Reminders', + type: 'long-input', + placeholder: '[{"method":"popup","minutes":10},{"method":"email","minutes":60}]', + condition: { field: 'operation', value: ['create', 'update'] }, + mode: 'advanced', + }, { id: 'timeMin', @@ -400,6 +452,22 @@ Return ONLY the timestamp string - no explanations, no quotes, no extra text.`, ], value: () => 'startTime', }, + { + id: 'updatedMin', + title: 'Modified Since', + type: 'short-input', + placeholder: '2025-06-03T00:00:00Z', + condition: { field: 'operation', value: 'list' }, + mode: 'advanced', + }, + { + id: 'listTimeZone', + title: 'Response Time Zone', + type: 'short-input', + placeholder: 'America/Los_Angeles (default: calendar time zone)', + condition: { field: 'operation', value: 'list' }, + mode: 'advanced', + }, { id: 'pageToken', title: 'Page Token', @@ -991,10 +1059,25 @@ Return ONLY the timestamp string - no explanations, no quotes, no extra text.`, processedParams.maxResults = Number.parseInt(processedParams.maxResults, 10) } + for (const key of ['visibility', 'transparency', 'colorId', 'reminders', 'updatedMin']) { + if (processedParams[key] === '') { + processedParams[key] = undefined + } + } + if (processedParams.minAccessRole === '') { processedParams.minAccessRole = undefined } + const listTimeZone = processedParams.listTimeZone + processedParams.listTimeZone = undefined + if (operation === 'list') { + processedParams.timeZone = + typeof listTimeZone === 'string' && listTimeZone.trim() + ? listTimeZone.trim() + : undefined + } + return { oauthCredential, ...processedParams, @@ -1016,6 +1099,16 @@ Return ONLY the timestamp string - no explanations, no quotes, no extra text.`, recurrence: { type: 'string', description: 'Recurrence rule (RRULE)' }, addGoogleMeet: { type: 'boolean', description: 'Attach a Google Meet link' }, timeZone: { type: 'string', description: 'Time zone (IANA name)' }, + optionalAttendees: { type: 'string', description: 'Optional attendee email list' }, + visibility: { + type: 'string', + description: 'Event visibility (default, public, private, confidential)', + }, + transparency: { type: 'string', description: 'Show as busy (opaque) or free (transparent)' }, + colorId: { type: 'string', description: 'Event color ID' }, + reminders: { type: 'json', description: 'Reminder overrides [{ method, minutes }]' }, + updatedMin: { type: 'string', description: 'Only events modified since this time' }, + listTimeZone: { type: 'string', description: 'Time zone used for List Events response times' }, timeMin: { type: 'string', description: 'Start time filter' }, timeMax: { type: 'string', description: 'End time filter' }, @@ -1107,6 +1200,41 @@ export const GoogleCalendarV2Block: BlockConfig = { id: { type: 'string', description: 'Event or calendar ID' }, htmlLink: { type: 'string', description: 'Event link' }, hangoutLink: { type: 'string', description: 'Google Meet link' }, + conferenceData: { + type: 'json', + description: + 'Conference details: conferenceId, conferenceSolution { name }, entryPoints [{ entryPointType (video, phone, sip, more), uri, label, pin, meetingCode, passcode }]', + }, + recurringEventId: { + type: 'string', + description: 'Recurring series ID (for an instance of a recurring event)', + }, + originalStartTime: { + type: 'json', + description: 'Original start time of a recurring event instance', + }, + reminders: { + type: 'json', + description: 'Reminders: useDefault and overrides [{ method, minutes }]', + }, + visibility: { + type: 'string', + description: 'Visibility: default, public, private, or confidential', + }, + transparency: { type: 'string', description: 'Show as: opaque (busy) or transparent (free)' }, + colorId: { type: 'string', description: 'Event color ID' }, + eventType: { + type: 'string', + description: + 'Event type: default, outOfOffice, focusTime, workingLocation, fromGmail, birthday', + }, + iCalUID: { type: 'string', description: 'iCalendar UID' }, + created: { type: 'string', description: 'Event creation time' }, + updated: { type: 'string', description: 'Event last modified time' }, + attachments: { + type: 'json', + description: 'File attachments [{ fileUrl, title, mimeType, iconLink, fileId }]', + }, status: { type: 'string', description: 'Event status' }, summary: { type: 'string', description: 'Event or calendar title' }, description: { type: 'string', description: 'Event or calendar description' }, @@ -1114,12 +1242,24 @@ export const GoogleCalendarV2Block: BlockConfig = { recurrence: { type: 'json', description: 'Recurrence rules (RRULE)' }, start: { type: 'json', description: 'Event start' }, end: { type: 'json', description: 'Event end' }, - attendees: { type: 'json', description: 'Event attendees' }, - creator: { type: 'json', description: 'Event creator' }, - organizer: { type: 'json', description: 'Event organizer' }, + attendees: { + type: 'json', + description: + 'Event attendees [{ email, displayName, responseStatus (needsAction, declined, tentative, accepted), optional, organizer, self, resource, comment, additionalGuests }]', + }, + creator: { type: 'json', description: 'Event creator { email, displayName, self }' }, + organizer: { type: 'json', description: 'Event organizer { email, displayName, self }' }, responseStatus: { type: 'string', description: 'Your RSVP response (respond operation)' }, comment: { type: 'string', description: 'Your RSVP note (respond operation)' }, - events: { type: 'json', description: 'List of events (list operation)' }, + events: { + type: 'json', + description: + 'List of events (list operation); each has the same fields as a single event (id, summary, start, end, attendees, organizer, hangoutLink, conferenceData, recurrence, reminders, visibility, status, htmlLink, and more)', + }, + nextSyncToken: { + type: 'string', + description: 'Sync token for incremental sync (list operation, last page)', + }, eventId: { type: 'string', description: 'Deleted event ID' }, deleted: { type: 'boolean', description: 'Whether deletion/removal was successful' }, instances: { type: 'json', description: 'List of recurring event instances' }, diff --git a/apps/sim/blocks/blocks/google_contacts.ts b/apps/sim/blocks/blocks/google_contacts.ts index 12efdfa7c1d..eb19f87e94a 100644 --- a/apps/sim/blocks/blocks/google_contacts.ts +++ b/apps/sim/blocks/blocks/google_contacts.ts @@ -155,6 +155,26 @@ export const GoogleContactsBlock: BlockConfig = { condition: { field: 'operation', value: ['create', 'update'] }, mode: 'advanced', }, + { + id: 'birthday', + title: 'Birthday', + type: 'short-input', + placeholder: '1990-04-15 or 04-15', + condition: { field: 'operation', value: ['create', 'update'] }, + mode: 'advanced', + wandConfig: { + enabled: true, + prompt: `Convert the user's description of a birthday into a date. +Use YYYY-MM-DD when the year is known, or MM-DD when it is not. + +Examples: +- "April 15th 1990" -> 1990-04-15 +- "March 3" -> 03-03 + +Return ONLY the date - no explanations, no extra text.`, + placeholder: 'Describe the birthday...', + }, + }, // Get / Update / Delete Fields { @@ -277,6 +297,7 @@ export const GoogleContactsBlock: BlockConfig = { organization: { type: 'string', description: 'Organization name' }, jobTitle: { type: 'string', description: 'Job title' }, notes: { type: 'string', description: 'Notes' }, + birthday: { type: 'string', description: 'Birthday (YYYY-MM-DD or MM-DD)' }, // Get/Update/Delete inputs resourceName: { type: 'string', description: 'Contact resource name' }, @@ -292,7 +313,11 @@ export const GoogleContactsBlock: BlockConfig = { }, outputs: { content: { type: 'string', description: 'Operation response content' }, - metadata: { type: 'json', description: 'Contact or contacts metadata' }, + metadata: { + type: 'json', + description: + 'Contact (resourceName, etag, displayName, givenName, familyName, middleName, emails, phones, organizations, addresses, biographies, urls, photos, birthdays, events, nicknames, relations, userDefined, contactGroupResourceNames), or for list/search {contacts, nextPageToken, totalItems}', + }, }, } diff --git a/apps/sim/blocks/blocks/google_docs.ts b/apps/sim/blocks/blocks/google_docs.ts index 8fe4799dc14..a126d9312bf 100644 --- a/apps/sim/blocks/blocks/google_docs.ts +++ b/apps/sim/blocks/blocks/google_docs.ts @@ -334,6 +334,14 @@ Return ONLY the text to insert - no explanations, no extra text.`, condition: { field: 'operation', value: 'replace_text' }, description: 'When on, only case-sensitive matches are replaced.', }, + { + id: 'searchByRegex', + title: 'Use Regular Expression', + type: 'switch', + condition: { field: 'operation', value: 'replace_text' }, + description: 'When on, the Find text is treated as a regular expression.', + mode: 'advanced', + }, // Insert Table fields { id: 'rows', @@ -483,6 +491,21 @@ Return ONLY the text to insert - no explanations, no extra text.`, { label: 'Star / Circle / Square', id: 'BULLET_STAR_CIRCLE_SQUARE' }, { label: 'Numbered: Decimal / Alpha / Roman', id: 'NUMBERED_DECIMAL_ALPHA_ROMAN' }, { label: 'Numbered: Decimal Nested', id: 'NUMBERED_DECIMAL_NESTED' }, + { label: 'Diamond X / Arrow 3D / Square', id: 'BULLET_DIAMONDX_ARROW3D_SQUARE' }, + { label: 'Arrow 3D / Circle / Square', id: 'BULLET_ARROW3D_CIRCLE_SQUARE' }, + { + label: 'Numbered: Decimal / Alpha / Roman (parens)', + id: 'NUMBERED_DECIMAL_ALPHA_ROMAN_PARENS', + }, + { + label: 'Numbered: Upper Alpha / Alpha / Roman', + id: 'NUMBERED_UPPERALPHA_ALPHA_ROMAN', + }, + { + label: 'Numbered: Upper Roman / Upper Alpha / Decimal', + id: 'NUMBERED_UPPERROMAN_UPPERALPHA_DECIMAL', + }, + { label: 'Numbered: Zero Decimal / Alpha / Roman', id: 'NUMBERED_ZERODECIMAL_ALPHA_ROMAN' }, ], condition: { field: 'operation', value: 'create_paragraph_bullets' }, }, @@ -510,6 +533,48 @@ Return ONLY the text to insert - no explanations, no extra text.`, placeholder: 'Name of the named range(s) to delete', condition: { field: 'operation', value: 'delete_named_range' }, }, + // Read options + { + id: 'includeTabsContent', + title: 'Read All Tabs', + type: 'switch', + condition: { field: 'operation', value: 'read' }, + description: + 'When on, reads every tab of the document instead of only the first tab, and returns each tab separately.', + mode: 'advanced', + }, + { + id: 'suggestionsViewMode', + title: 'Suggested Edits', + type: 'dropdown', + options: [ + { label: 'Default (based on access)', id: '' }, + { label: 'Show inline', id: 'SUGGESTIONS_INLINE' }, + { label: 'Preview with suggestions accepted', id: 'PREVIEW_SUGGESTIONS_ACCEPTED' }, + { label: 'Preview with suggestions rejected', id: 'PREVIEW_WITHOUT_SUGGESTIONS' }, + ], + condition: { field: 'operation', value: 'read' }, + mode: 'advanced', + }, + // Target tab (advanced) for multi-tab documents + { + id: 'tabId', + title: 'Tab ID', + type: 'short-input', + placeholder: 'Tab ID (empty: first tab; for Find & Replace: all tabs)', + condition: { + field: 'operation', + value: [ + 'write', + 'insert_text', + 'replace_text', + 'insert_table', + 'insert_image', + 'insert_page_break', + ], + }, + mode: 'advanced', + }, // Shared insertion index (advanced) for the insert operations { id: 'index', @@ -652,10 +717,22 @@ Return ONLY the text to insert - no explanations, no extra text.`, name: { type: 'string', description: 'Name for a created named range' }, namedRangeId: { type: 'string', description: 'ID of a named range to delete' }, namedRangeName: { type: 'string', description: 'Name of named range(s) to delete' }, + includeTabsContent: { type: 'boolean', description: 'Read every tab of the document' }, + suggestionsViewMode: { type: 'string', description: 'How suggested edits are returned' }, + tabId: { type: 'string', description: 'Target tab ID in a multi-tab document' }, + searchByRegex: { type: 'boolean', description: 'Treat find text as a regular expression' }, }, outputs: { content: { type: 'string', description: 'Document content' }, - metadata: { type: 'json', description: 'Document metadata' }, + metadata: { + type: 'json', + description: 'Document metadata (documentId, title, mimeType, url, revisionId on read)', + }, + tabs: { + type: 'json', + description: + 'Document tabs when Read All Tabs is on: [{tabId, title, parentTabId, index, nestingLevel, content}]', + }, updatedContent: { type: 'boolean', description: 'Content update status' }, occurrencesChanged: { type: 'number', diff --git a/apps/sim/blocks/blocks/google_drive.ts b/apps/sim/blocks/blocks/google_drive.ts index 5de854ce29d..ff507e52b31 100644 --- a/apps/sim/blocks/blocks/google_drive.ts +++ b/apps/sim/blocks/blocks/google_drive.ts @@ -387,32 +387,26 @@ Return ONLY the file content - no explanations, no markdown code blocks, no extr id: 'query', title: 'Search Query', type: 'short-input', - placeholder: 'Search for specific files (e.g., name contains "report")', + placeholder: 'Filter by part of the file name (e.g., report)', condition: { field: 'operation', value: 'list' }, wandConfig: { enabled: true, - prompt: `Generate a Google Drive search query based on the user's description. -Use Google Drive query syntax: -- name contains 'term' - search by filename -- mimeType = 'type' - filter by file type -- modifiedTime > 'date' - filter by date -- 'email' in owners - filter by owner -- fullText contains 'term' - search file contents + prompt: `Extract a plain file-name search term from the user's description. +The term is matched against file names only (name contains). Do not use Google Drive query syntax, operators, or quotes; use the Search Files operation for advanced queries. Examples: -- "PDF files" -> mimeType = 'application/pdf' -- "files named report" -> name contains 'report' -- "spreadsheets modified today" -> mimeType = 'application/vnd.google-apps.spreadsheet' and modifiedTime > '2024-01-01' +- "files named report" -> report +- "the Q3 budget spreadsheet" -> Q3 budget -Return ONLY the query string - no explanations, no quotes around the whole thing, no extra text.`, - placeholder: 'Describe the files you want to find...', +Return ONLY the search term - no explanations, no quotes, no extra text.`, + placeholder: 'Describe the file name you want to find...', }, }, { id: 'pageSize', title: 'Results Per Page', type: 'short-input', - placeholder: 'Number of results (default: 100, max: 100)', + placeholder: 'Number of results (default: 100, max: 1000)', condition: { field: 'operation', value: 'list' }, }, { @@ -423,6 +417,32 @@ Return ONLY the query string - no explanations, no quotes around the whole thing mode: 'advanced', condition: { field: 'operation', value: 'list' }, }, + { + id: 'listOrderBy', + title: 'Sort By', + type: 'dropdown', + options: [ + { label: 'Default', id: '' }, + { label: 'Last modified (newest first)', id: 'modifiedTime desc' }, + { label: 'Last modified (oldest first)', id: 'modifiedTime' }, + { label: 'Name (A-Z)', id: 'name_natural' }, + { label: 'Name (Z-A)', id: 'name_natural desc' }, + { label: 'Created (newest first)', id: 'createdTime desc' }, + { label: 'Recently used', id: 'recency desc' }, + { label: 'Folders first, then name', id: 'folder,name_natural' }, + ], + value: () => '', + mode: 'advanced', + condition: { field: 'operation', value: 'list' }, + }, + { + id: 'listDriveId', + title: 'Shared Drive ID', + type: 'short-input', + placeholder: 'Restrict to one shared drive (default: My Drive and all shared drives)', + mode: 'advanced', + condition: { field: 'operation', value: 'list' }, + }, { id: 'downloadFileSelector', title: 'Select File', @@ -798,6 +818,57 @@ Return ONLY the message text - no subject line, no greetings/signatures, no extr placeholder: 'Describe why you are sharing this file...', }, }, + { + id: 'shareExpirationTime', + title: 'Access Expires', + type: 'short-input', + placeholder: 'Optional expiry, at most one year out (e.g., 2025-12-31T23:59:59Z)', + mode: 'advanced', + condition: { + field: 'operation', + value: 'share', + and: { field: 'shareType', value: ['user', 'group'] }, + }, + wandConfig: { + enabled: true, + generationType: 'timestamp', + prompt: `Generate an RFC 3339 timestamp for when shared access should expire, based on the user's description. It must be in the future and no more than one year from now. +Examples: +- "in 30 days" -> a timestamp 30 days from now, e.g. 2025-02-14T00:00:00Z +- "end of the year" -> 2025-12-31T23:59:59Z + +Return ONLY the timestamp string - no explanations, no quotes, no extra text.`, + placeholder: 'Describe when access should expire (e.g., "in 2 weeks")...', + }, + }, + { + id: 'shareAllowFileDiscovery', + title: 'Discoverable in Search', + type: 'dropdown', + options: [ + { label: 'Default', id: '' }, + { label: 'Yes', id: 'true' }, + { label: 'No (link only)', id: 'false' }, + ], + value: () => '', + mode: 'advanced', + condition: { + field: 'operation', + value: 'share', + and: { field: 'shareType', value: ['domain', 'anyone'] }, + }, + }, + { + id: 'shareMoveToNewOwnersRoot', + title: "Move to New Owner's My Drive", + type: 'switch', + mode: 'advanced', + condition: { + field: 'operation', + value: 'share', + and: { field: 'role', value: 'owner' }, + }, + }, { id: 'unshareFileSelector', title: 'Select File', @@ -854,6 +925,14 @@ Return ONLY the message text - no subject line, no greetings/signatures, no extr condition: { field: 'operation', value: 'list_permissions' }, required: true, }, + { + id: 'permissionsPageSize', + title: 'Results Per Page', + type: 'short-input', + placeholder: 'Number of permissions (max: 100; default: all for My Drive files)', + mode: 'advanced', + condition: { field: 'operation', value: 'list_permissions' }, + }, { id: 'permissionsPageToken', title: 'Page Token', @@ -1023,7 +1102,7 @@ Return ONLY the query string - no explanations, no quotes around the whole thing id: 'searchPageSize', title: 'Results Per Page', type: 'short-input', - placeholder: 'Number of results (default: 100, max: 100)', + placeholder: 'Number of results (default: 100, max: 1000)', mode: 'advanced', condition: { field: 'operation', value: 'search' }, }, @@ -1035,6 +1114,32 @@ Return ONLY the query string - no explanations, no quotes around the whole thing mode: 'advanced', condition: { field: 'operation', value: 'search' }, }, + { + id: 'searchOrderBy', + title: 'Sort By', + type: 'dropdown', + options: [ + { label: 'Default', id: '' }, + { label: 'Last modified (newest first)', id: 'modifiedTime desc' }, + { label: 'Last modified (oldest first)', id: 'modifiedTime' }, + { label: 'Name (A-Z)', id: 'name_natural' }, + { label: 'Name (Z-A)', id: 'name_natural desc' }, + { label: 'Created (newest first)', id: 'createdTime desc' }, + { label: 'Recently used', id: 'recency desc' }, + { label: 'Folders first, then name', id: 'folder,name_natural' }, + ], + value: () => '', + mode: 'advanced', + condition: { field: 'operation', value: 'search' }, + }, + { + id: 'searchDriveId', + title: 'Shared Drive ID', + type: 'short-input', + placeholder: 'Restrict to one shared drive (default: My Drive and all shared drives)', + mode: 'advanced', + condition: { field: 'operation', value: 'search' }, + }, { id: 'untrashFileSelector', title: 'Select File to Restore', @@ -1232,6 +1337,25 @@ Return ONLY the query string - no explanations, no quotes around the whole thing mode: 'advanced', condition: { field: 'operation', value: 'list_comments' }, }, + { + id: 'commentsStartModifiedTime', + title: 'Modified After', + type: 'short-input', + placeholder: 'Only comments modified after this time (e.g., 2025-01-01T00:00:00Z)', + mode: 'advanced', + condition: { field: 'operation', value: 'list_comments' }, + wandConfig: { + enabled: true, + generationType: 'timestamp', + prompt: `Generate an RFC 3339 timestamp based on the user's description. +Examples: +- "last week" -> a timestamp 7 days before now, e.g. 2025-01-08T00:00:00Z +- "since January 1st 2025" -> 2025-01-01T00:00:00Z + +Return ONLY the timestamp string - no explanations, no quotes, no extra text.`, + placeholder: 'Describe the cutoff time (e.g., "last 7 days")...', + }, + }, { id: 'includeDeleted', title: 'Include Deleted Comments', @@ -1453,6 +1577,15 @@ Return ONLY the comment text - no explanations, no quotes, no extra formatting.` commentsPageToken, getContentExportMimeType, exportMimeType, + listOrderBy, + searchOrderBy, + listDriveId, + searchDriveId, + permissionsPageSize, + commentsStartModifiedTime, + shareExpirationTime, + shareAllowFileDiscovery, + shareMoveToNewOwnersRoot, ...rest } = params @@ -1555,6 +1688,7 @@ Return ONLY the comment text - no explanations, no quotes, no extra formatting.` if (params.operation === 'search') effectivePageSize = searchPageSize else if (params.operation === 'list_revisions') effectivePageSize = revisionsPageSize else if (params.operation === 'list_comments') effectivePageSize = commentsPageSize + else if (params.operation === 'list_permissions') effectivePageSize = permissionsPageSize let effectivePageToken: string | undefined = pageToken if (params.operation === 'search') effectivePageToken = searchPageToken @@ -1564,6 +1698,36 @@ Return ONLY the comment text - no explanations, no quotes, no extra formatting.` else if (params.operation !== 'list') effectivePageToken = undefined const effectiveQuery = params.operation === 'search' ? searchQuery : query + + const effectiveOrderBy = + params.operation === 'list' + ? listOrderBy + : params.operation === 'search' + ? searchOrderBy + : undefined + const effectiveDriveId = + params.operation === 'list' + ? listDriveId + : params.operation === 'search' + ? searchDriveId + : undefined + + const isShare = params.operation === 'share' + const isUserOrGroupShare = isShare && (shareType === 'user' || shareType === 'group') + const isDomainOrAnyoneShare = isShare && (shareType === 'domain' || shareType === 'anyone') + const allowFileDiscoveryValue = !isDomainOrAnyoneShare + ? undefined + : shareAllowFileDiscovery === 'true' || shareAllowFileDiscovery === true + ? true + : shareAllowFileDiscovery === 'false' || shareAllowFileDiscovery === false + ? false + : undefined + const moveToNewOwnersRootValue = + isShare && + rest.role === 'owner' && + (shareMoveToNewOwnersRoot === true || shareMoveToNewOwnersRoot === 'true') + ? true + : undefined const effectiveMimeType = params.operation === 'get_content' ? getContentExportMimeType @@ -1590,6 +1754,17 @@ Return ONLY the comment text - no explanations, no quotes, no extra formatting.` includeRevisions: includeRevisionsValue, includeDeleted: includeDeletedValue, transferOwnership: rest.role === 'owner' ? true : undefined, + orderBy: (effectiveOrderBy as string | undefined)?.trim() || undefined, + driveId: (effectiveDriveId as string | undefined)?.trim() || undefined, + startModifiedTime: + params.operation === 'list_comments' + ? (commentsStartModifiedTime as string | undefined)?.trim() || undefined + : undefined, + expirationTime: isUserOrGroupShare + ? (shareExpirationTime as string | undefined)?.trim() || undefined + : undefined, + allowFileDiscovery: allowFileDiscoveryValue, + moveToNewOwnersRoot: moveToNewOwnersRootValue, ...rest, } }, @@ -1653,6 +1828,27 @@ Return ONLY the comment text - no explanations, no quotes, no extra formatting.` anchor: { type: 'string', description: 'Anchor region for a new comment' }, includeDeleted: { type: 'string', description: 'Include deleted comments when listing' }, commentsPageSize: { type: 'string', description: 'Results per page for comments' }, + listOrderBy: { type: 'string', description: 'Sort order when listing files' }, + searchOrderBy: { type: 'string', description: 'Sort order when searching files' }, + listDriveId: { type: 'string', description: 'Shared drive to restrict listing to' }, + searchDriveId: { type: 'string', description: 'Shared drive to restrict search to' }, + permissionsPageSize: { type: 'string', description: 'Results per page for permissions' }, + commentsStartModifiedTime: { + type: 'string', + description: 'Only list comments modified after this RFC 3339 time', + }, + shareExpirationTime: { + type: 'string', + description: 'RFC 3339 time when a user or group permission expires', + }, + shareAllowFileDiscovery: { + type: 'string', + description: 'Whether a domain or anyone permission is discoverable in search', + }, + shareMoveToNewOwnersRoot: { + type: 'boolean', + description: "Move the file to the new owner's My Drive root when transferring ownership", + }, }, outputs: { file: { type: 'file', description: 'Downloaded file stored in execution files' }, @@ -1660,6 +1856,10 @@ Return ONLY the comment text - no explanations, no quotes, no extra formatting.` metadata: { type: 'json', description: 'Complete file metadata (from download)' }, content: { type: 'string', description: 'File content as text' }, nextPageToken: { type: 'string', description: 'Token for fetching the next page of results' }, + incompleteSearch: { + type: 'boolean', + description: 'Whether a list or search was incomplete and some results may be missing', + }, permission: { type: 'json', description: 'Permission details' }, permissions: { type: 'json', description: 'List of permissions' }, user: { type: 'json', description: 'User information' }, diff --git a/apps/sim/blocks/blocks/google_forms.ts b/apps/sim/blocks/blocks/google_forms.ts index 1390fde09a4..4ee9fe1a337 100644 --- a/apps/sim/blocks/blocks/google_forms.ts +++ b/apps/sim/blocks/blocks/google_forms.ts @@ -416,7 +416,8 @@ Example for "Add a required multiple choice question about favorite color": outputs: { responses: { type: 'json', - description: 'Array of form responses', + description: + 'Array of form responses [{responseId, createTime, lastSubmittedTime, answers, respondentEmail, totalScore}]', condition: { field: 'operation', value: 'get_responses', @@ -434,7 +435,8 @@ Example for "Add a required multiple choice question about favorite color": }, response: { type: 'json', - description: 'Single form response', + description: + 'Single form response (responseId, createTime, lastSubmittedTime, answers, respondentEmail, totalScore)', condition: { field: 'operation', value: 'get_responses', diff --git a/apps/sim/blocks/blocks/google_groups.ts b/apps/sim/blocks/blocks/google_groups.ts index 14ffa3576a1..bb7572695d5 100644 --- a/apps/sim/blocks/blocks/google_groups.ts +++ b/apps/sim/blocks/blocks/google_groups.ts @@ -4,6 +4,31 @@ import type { BlockConfig, BlockMeta } from '@/blocks/types' import { AuthMode, IntegrationType } from '@/blocks/types' import { SERVICE_ACCOUNT_SUBBLOCKS } from '@/blocks/utils' +/** Settings the Update Settings operation forwards when set; empty means unchanged. */ +const UPDATE_SETTINGS_FIELDS = [ + 'whoCanJoin', + 'whoCanViewMembership', + 'whoCanViewGroup', + 'whoCanPostMessage', + 'allowExternalMembers', + 'whoCanDiscoverGroup', + 'whoCanContactOwner', + 'whoCanLeaveGroup', + 'whoCanModerateMembers', + 'whoCanModerateContent', + 'messageModerationLevel', + 'spamModerationLevel', + 'replyTo', + 'allowWebPosting', + 'isArchived', + 'archiveOnly', + 'includeInGlobalAddressList', + 'membersCanPostAsTheGroup', + 'enableCollaborativeInbox', + 'customReplyTo', + 'primaryLanguage', +] as const + export const GoogleGroupsBlock: BlockConfig = { type: 'google_groups', name: 'Google Groups', @@ -322,6 +347,326 @@ Return ONLY the description text - no explanations, no quotes, no extra text.`, placeholder: 'OWNER,MANAGER,MEMBER', condition: { field: 'operation', value: 'list_members' }, }, + { + id: 'userKey', + title: 'Member Email or ID', + type: 'short-input', + placeholder: 'Only groups this user belongs to (e.g., user@example.com)', + condition: { field: 'operation', value: 'list_groups' }, + }, + { + id: 'sortOrder', + title: 'Sort by Email', + type: 'dropdown', + options: [ + { label: 'Default', id: '' }, + { label: 'Ascending', id: 'ASCENDING' }, + { label: 'Descending', id: 'DESCENDING' }, + ], + value: () => '', + condition: { field: 'operation', value: 'list_groups' }, + mode: 'advanced', + }, + { + id: 'includeDerivedMembership', + title: 'Include Nested Members', + type: 'switch', + condition: { field: 'operation', value: 'list_members' }, + mode: 'advanced', + }, + { + id: 'pageToken', + title: 'Page Token', + type: 'short-input', + placeholder: 'Token from a previous response', + condition: { field: 'operation', value: ['list_groups', 'list_members'] }, + mode: 'advanced', + }, + // Update Settings Fields (empty means unchanged) + { + id: 'whoCanJoin', + title: 'Who Can Join', + type: 'dropdown', + options: [ + { label: 'No change', id: '' }, + { label: 'Anyone Can Join', id: 'ANYONE_CAN_JOIN' }, + { label: 'All In Domain Can Join', id: 'ALL_IN_DOMAIN_CAN_JOIN' }, + { label: 'Invited Can Join', id: 'INVITED_CAN_JOIN' }, + { label: 'Can Request To Join', id: 'CAN_REQUEST_TO_JOIN' }, + ], + value: () => '', + condition: { field: 'operation', value: 'update_settings' }, + }, + { + id: 'whoCanViewMembership', + title: 'Who Can View Members', + type: 'dropdown', + options: [ + { label: 'No change', id: '' }, + { label: 'All In Domain Can View', id: 'ALL_IN_DOMAIN_CAN_VIEW' }, + { label: 'All Members Can View', id: 'ALL_MEMBERS_CAN_VIEW' }, + { label: 'All Managers Can View', id: 'ALL_MANAGERS_CAN_VIEW' }, + ], + value: () => '', + condition: { field: 'operation', value: 'update_settings' }, + }, + { + id: 'whoCanViewGroup', + title: 'Who Can View Messages', + type: 'dropdown', + options: [ + { label: 'No change', id: '' }, + { label: 'Anyone Can View', id: 'ANYONE_CAN_VIEW' }, + { label: 'All In Domain Can View', id: 'ALL_IN_DOMAIN_CAN_VIEW' }, + { label: 'All Members Can View', id: 'ALL_MEMBERS_CAN_VIEW' }, + { label: 'All Managers Can View', id: 'ALL_MANAGERS_CAN_VIEW' }, + ], + value: () => '', + condition: { field: 'operation', value: 'update_settings' }, + }, + { + id: 'whoCanPostMessage', + title: 'Who Can Post', + type: 'dropdown', + options: [ + { label: 'No change', id: '' }, + { label: 'None Can Post', id: 'NONE_CAN_POST' }, + { label: 'All Managers Can Post', id: 'ALL_MANAGERS_CAN_POST' }, + { label: 'All Members Can Post', id: 'ALL_MEMBERS_CAN_POST' }, + { label: 'All Owners Can Post', id: 'ALL_OWNERS_CAN_POST' }, + { label: 'All In Domain Can Post', id: 'ALL_IN_DOMAIN_CAN_POST' }, + { label: 'Anyone Can Post', id: 'ANYONE_CAN_POST' }, + ], + value: () => '', + condition: { field: 'operation', value: 'update_settings' }, + }, + { + id: 'allowExternalMembers', + title: 'Allow External Members', + type: 'dropdown', + options: [ + { label: 'No change', id: '' }, + { label: 'Yes', id: 'true' }, + { label: 'No', id: 'false' }, + ], + value: () => '', + condition: { field: 'operation', value: 'update_settings' }, + }, + { + id: 'whoCanDiscoverGroup', + title: 'Who Can Discover', + type: 'dropdown', + options: [ + { label: 'No change', id: '' }, + { label: 'Anyone Can Discover', id: 'ANYONE_CAN_DISCOVER' }, + { label: 'All In Domain Can Discover', id: 'ALL_IN_DOMAIN_CAN_DISCOVER' }, + { label: 'All Members Can Discover', id: 'ALL_MEMBERS_CAN_DISCOVER' }, + ], + value: () => '', + condition: { field: 'operation', value: 'update_settings' }, + mode: 'advanced', + }, + { + id: 'whoCanContactOwner', + title: 'Who Can Contact Owner', + type: 'dropdown', + options: [ + { label: 'No change', id: '' }, + { label: 'Anyone Can Contact', id: 'ANYONE_CAN_CONTACT' }, + { label: 'All In Domain Can Contact', id: 'ALL_IN_DOMAIN_CAN_CONTACT' }, + { label: 'All Members Can Contact', id: 'ALL_MEMBERS_CAN_CONTACT' }, + { label: 'All Managers Can Contact', id: 'ALL_MANAGERS_CAN_CONTACT' }, + { label: 'All Owners Can Contact', id: 'ALL_OWNERS_CAN_CONTACT' }, + ], + value: () => '', + condition: { field: 'operation', value: 'update_settings' }, + mode: 'advanced', + }, + { + id: 'whoCanLeaveGroup', + title: 'Who Can Leave', + type: 'dropdown', + options: [ + { label: 'No change', id: '' }, + { label: 'All Members Can Leave', id: 'ALL_MEMBERS_CAN_LEAVE' }, + { label: 'All Managers Can Leave', id: 'ALL_MANAGERS_CAN_LEAVE' }, + { label: 'None Can Leave', id: 'NONE_CAN_LEAVE' }, + ], + value: () => '', + condition: { field: 'operation', value: 'update_settings' }, + mode: 'advanced', + }, + { + id: 'whoCanModerateMembers', + title: 'Who Can Manage Members', + type: 'dropdown', + options: [ + { label: 'No change', id: '' }, + { label: 'All Members', id: 'ALL_MEMBERS' }, + { label: 'Owners And Managers', id: 'OWNERS_AND_MANAGERS' }, + { label: 'Owners Only', id: 'OWNERS_ONLY' }, + { label: 'None', id: 'NONE' }, + ], + value: () => '', + condition: { field: 'operation', value: 'update_settings' }, + mode: 'advanced', + }, + { + id: 'whoCanModerateContent', + title: 'Who Can Moderate Content', + type: 'dropdown', + options: [ + { label: 'No change', id: '' }, + { label: 'All Members', id: 'ALL_MEMBERS' }, + { label: 'Owners And Managers', id: 'OWNERS_AND_MANAGERS' }, + { label: 'Owners Only', id: 'OWNERS_ONLY' }, + { label: 'None', id: 'NONE' }, + ], + value: () => '', + condition: { field: 'operation', value: 'update_settings' }, + mode: 'advanced', + }, + { + id: 'messageModerationLevel', + title: 'Message Moderation', + type: 'dropdown', + options: [ + { label: 'No change', id: '' }, + { label: 'Moderate All Messages', id: 'MODERATE_ALL_MESSAGES' }, + { label: 'Moderate Non Members', id: 'MODERATE_NON_MEMBERS' }, + { label: 'Moderate New Members', id: 'MODERATE_NEW_MEMBERS' }, + { label: 'Moderate None', id: 'MODERATE_NONE' }, + ], + value: () => '', + condition: { field: 'operation', value: 'update_settings' }, + mode: 'advanced', + }, + { + id: 'spamModerationLevel', + title: 'Spam Handling', + type: 'dropdown', + options: [ + { label: 'No change', id: '' }, + { label: 'Allow', id: 'ALLOW' }, + { label: 'Moderate', id: 'MODERATE' }, + { label: 'Silently Moderate', id: 'SILENTLY_MODERATE' }, + { label: 'Reject', id: 'REJECT' }, + ], + value: () => '', + condition: { field: 'operation', value: 'update_settings' }, + mode: 'advanced', + }, + { + id: 'replyTo', + title: 'Default Reply To', + type: 'dropdown', + options: [ + { label: 'No change', id: '' }, + { label: 'Reply To Sender', id: 'REPLY_TO_SENDER' }, + { label: 'Reply To List', id: 'REPLY_TO_LIST' }, + { label: 'Reply To Owner', id: 'REPLY_TO_OWNER' }, + { label: 'Reply To Custom', id: 'REPLY_TO_CUSTOM' }, + { label: 'Reply To Ignore', id: 'REPLY_TO_IGNORE' }, + { label: 'Reply To Managers', id: 'REPLY_TO_MANAGERS' }, + ], + value: () => '', + condition: { field: 'operation', value: 'update_settings' }, + mode: 'advanced', + }, + { + id: 'allowWebPosting', + title: 'Allow Web Posting', + type: 'dropdown', + options: [ + { label: 'No change', id: '' }, + { label: 'Yes', id: 'true' }, + { label: 'No', id: 'false' }, + ], + value: () => '', + condition: { field: 'operation', value: 'update_settings' }, + mode: 'advanced', + }, + { + id: 'isArchived', + title: 'Archive Messages', + type: 'dropdown', + options: [ + { label: 'No change', id: '' }, + { label: 'Yes', id: 'true' }, + { label: 'No', id: 'false' }, + ], + value: () => '', + condition: { field: 'operation', value: 'update_settings' }, + mode: 'advanced', + }, + { + id: 'archiveOnly', + title: 'Archive Only (Inactive)', + type: 'dropdown', + options: [ + { label: 'No change', id: '' }, + { label: 'Yes', id: 'true' }, + { label: 'No', id: 'false' }, + ], + value: () => '', + condition: { field: 'operation', value: 'update_settings' }, + mode: 'advanced', + }, + { + id: 'includeInGlobalAddressList', + title: 'Include in Global Address List', + type: 'dropdown', + options: [ + { label: 'No change', id: '' }, + { label: 'Yes', id: 'true' }, + { label: 'No', id: 'false' }, + ], + value: () => '', + condition: { field: 'operation', value: 'update_settings' }, + mode: 'advanced', + }, + { + id: 'membersCanPostAsTheGroup', + title: 'Members Can Post as Group', + type: 'dropdown', + options: [ + { label: 'No change', id: '' }, + { label: 'Yes', id: 'true' }, + { label: 'No', id: 'false' }, + ], + value: () => '', + condition: { field: 'operation', value: 'update_settings' }, + mode: 'advanced', + }, + { + id: 'enableCollaborativeInbox', + title: 'Collaborative Inbox', + type: 'dropdown', + options: [ + { label: 'No change', id: '' }, + { label: 'Yes', id: 'true' }, + { label: 'No', id: 'false' }, + ], + value: () => '', + condition: { field: 'operation', value: 'update_settings' }, + mode: 'advanced', + }, + { + id: 'customReplyTo', + title: 'Custom Reply-To Email', + type: 'short-input', + placeholder: 'reply@example.com', + condition: { field: 'operation', value: 'update_settings' }, + mode: 'advanced', + }, + { + id: 'primaryLanguage', + title: 'Primary Language', + type: 'short-input', + placeholder: 'en-US', + condition: { field: 'operation', value: 'update_settings' }, + mode: 'advanced', + }, ], tools: { access: [ @@ -392,6 +737,10 @@ Return ONLY the description text - no explanations, no quotes, no extra text.`, domain: rest.domain, query: rest.query, maxResults: rest.maxResults ? Number(rest.maxResults) : undefined, + pageToken: rest.pageToken || undefined, + userKey: rest.userKey || undefined, + orderBy: rest.sortOrder ? 'email' : undefined, + sortOrder: rest.sortOrder || undefined, } case 'get_group': case 'delete_group': @@ -420,6 +769,11 @@ Return ONLY the description text - no explanations, no quotes, no extra text.`, groupKey: rest.groupKey, maxResults: rest.maxResults ? Number(rest.maxResults) : undefined, roles: rest.roles, + pageToken: rest.pageToken || undefined, + includeDerivedMembership: + rest.includeDerivedMembership === true || rest.includeDerivedMembership === 'true' + ? true + : undefined, } case 'get_member': case 'remove_member': @@ -474,6 +828,11 @@ Return ONLY the description text - no explanations, no quotes, no extra text.`, return { oauthCredential, groupEmail: rest.groupEmail, + ...Object.fromEntries( + UPDATE_SETTINGS_FIELDS.filter( + (key) => rest[key] !== undefined && rest[key] !== null && rest[key] !== '' + ).map((key) => [key, String(rest[key])]) + ), } default: return { oauthCredential, ...rest } @@ -500,6 +859,79 @@ Return ONLY the description text - no explanations, no quotes, no extra text.`, roles: { type: 'string', description: 'Filter by roles for list members' }, alias: { type: 'string', description: 'Alias email address' }, groupEmail: { type: 'string', description: 'Group email address for settings operations' }, + userKey: { type: 'string', description: 'Only list groups this member belongs to' }, + sortOrder: { type: 'string', description: 'Sort groups by email (ASCENDING or DESCENDING)' }, + includeDerivedMembership: { type: 'boolean', description: 'Include indirect members' }, + pageToken: { type: 'string', description: 'Pagination token' }, + whoCanJoin: { type: 'string', description: 'Group setting whoCanJoin (update_settings)' }, + whoCanViewMembership: { + type: 'string', + description: 'Group setting whoCanViewMembership (update_settings)', + }, + whoCanViewGroup: { + type: 'string', + description: 'Group setting whoCanViewGroup (update_settings)', + }, + whoCanPostMessage: { + type: 'string', + description: 'Group setting whoCanPostMessage (update_settings)', + }, + allowExternalMembers: { + type: 'string', + description: 'Group setting allowExternalMembers (update_settings)', + }, + whoCanDiscoverGroup: { + type: 'string', + description: 'Group setting whoCanDiscoverGroup (update_settings)', + }, + whoCanContactOwner: { + type: 'string', + description: 'Group setting whoCanContactOwner (update_settings)', + }, + whoCanLeaveGroup: { + type: 'string', + description: 'Group setting whoCanLeaveGroup (update_settings)', + }, + whoCanModerateMembers: { + type: 'string', + description: 'Group setting whoCanModerateMembers (update_settings)', + }, + whoCanModerateContent: { + type: 'string', + description: 'Group setting whoCanModerateContent (update_settings)', + }, + messageModerationLevel: { + type: 'string', + description: 'Group setting messageModerationLevel (update_settings)', + }, + spamModerationLevel: { + type: 'string', + description: 'Group setting spamModerationLevel (update_settings)', + }, + replyTo: { type: 'string', description: 'Group setting replyTo (update_settings)' }, + allowWebPosting: { + type: 'string', + description: 'Group setting allowWebPosting (update_settings)', + }, + isArchived: { type: 'string', description: 'Group setting isArchived (update_settings)' }, + archiveOnly: { type: 'string', description: 'Group setting archiveOnly (update_settings)' }, + includeInGlobalAddressList: { + type: 'string', + description: 'Group setting includeInGlobalAddressList (update_settings)', + }, + membersCanPostAsTheGroup: { + type: 'string', + description: 'Group setting membersCanPostAsTheGroup (update_settings)', + }, + enableCollaborativeInbox: { + type: 'string', + description: 'Group setting enableCollaborativeInbox (update_settings)', + }, + customReplyTo: { type: 'string', description: 'Group setting customReplyTo (update_settings)' }, + primaryLanguage: { + type: 'string', + description: 'Group setting primaryLanguage (update_settings)', + }, }, outputs: { groups: { type: 'json', description: 'Array of group objects (for list_groups)' }, @@ -510,7 +942,11 @@ Return ONLY the description text - no explanations, no quotes, no extra text.`, message: { type: 'string', description: 'Success message (for delete/remove operations)' }, nextPageToken: { type: 'string', description: 'Token for fetching next page of results' }, aliases: { type: 'json', description: 'Array of alias objects (for list_aliases)' }, - settings: { type: 'json', description: 'Group settings object (for get/update_settings)' }, + settings: { + type: 'json', + description: + 'Group settings object for get/update_settings (email, name, description, whoCanJoin, whoCanViewMembership, whoCanViewGroup, whoCanPostMessage, allowExternalMembers, messageModerationLevel, replyTo, ..., defaultSender)', + }, deleted: { type: 'boolean', description: 'Deletion result (for remove_alias)' }, }, } diff --git a/apps/sim/blocks/blocks/google_meet.ts b/apps/sim/blocks/blocks/google_meet.ts index 1037e01eb50..d97e90b2342 100644 --- a/apps/sim/blocks/blocks/google_meet.ts +++ b/apps/sim/blocks/blocks/google_meet.ts @@ -196,13 +196,26 @@ export const GoogleMeetBlock: BlockConfig = { accessType: { type: 'string', description: 'Access type' }, entryPointAccess: { type: 'string', description: 'Entry point access' }, activeConference: { type: 'string', description: 'Active conference record' }, + moderation: { type: 'string', description: 'Host moderation (ON or OFF)' }, + attendanceReportGenerationType: { + type: 'string', + description: 'Attendance report setting (GENERATE_REPORT or DO_NOT_GENERATE)', + }, + artifactConfig: { + type: 'json', + description: 'Auto recording, transcription, and smart notes settings (ON or OFF each)', + }, ended: { type: 'boolean', description: 'Whether conference was ended' }, conferenceRecords: { type: 'json', description: 'List of conference records' }, startTime: { type: 'string', description: 'Conference start time' }, endTime: { type: 'string', description: 'Conference end time' }, expireTime: { type: 'string', description: 'Record expiration time' }, space: { type: 'string', description: 'Associated space name' }, - participants: { type: 'json', description: 'List of participants' }, + participants: { + type: 'json', + description: + 'List of participants [{ name, earliestStartTime, latestEndTime, displayName, userType, user }]', + }, nextPageToken: { type: 'string', description: 'Next page token' }, totalSize: { type: 'number', description: 'Total participant count' }, }, diff --git a/apps/sim/blocks/blocks/google_sheets.ts b/apps/sim/blocks/blocks/google_sheets.ts index 0fcd4a73133..d4c0d290412 100644 --- a/apps/sim/blocks/blocks/google_sheets.ts +++ b/apps/sim/blocks/blocks/google_sheets.ts @@ -551,6 +551,44 @@ Return ONLY the range string - no sheet name, no explanations, no quotes.`, condition: { field: 'operation', value: 'read' }, mode: 'advanced', }, + { + id: 'valueRenderOption', + title: 'Value Render Option', + type: 'dropdown', + options: [ + { label: 'Formatted (as displayed)', id: 'FORMATTED_VALUE' }, + { label: 'Unformatted (raw values)', id: 'UNFORMATTED_VALUE' }, + { label: 'Formulas', id: 'FORMULA' }, + ], + condition: { field: 'operation', value: ['read', 'batch_get'] }, + mode: 'advanced', + }, + { + id: 'dateTimeRenderOption', + title: 'Date/Time Render Option', + type: 'dropdown', + options: [ + { label: 'Serial Number', id: 'SERIAL_NUMBER' }, + { label: 'Formatted String', id: 'FORMATTED_STRING' }, + ], + condition: { + field: 'operation', + value: ['read', 'batch_get'], + and: { field: 'valueRenderOption', value: ['UNFORMATTED_VALUE', 'FORMULA'] }, + }, + mode: 'advanced', + }, + { + id: 'majorDimension', + title: 'Major Dimension', + type: 'dropdown', + options: [ + { label: 'Rows', id: 'ROWS' }, + { label: 'Columns', id: 'COLUMNS' }, + ], + condition: { field: 'operation', value: 'batch_get' }, + mode: 'advanced', + }, { id: 'values', title: 'Values', @@ -584,7 +622,14 @@ Return ONLY the JSON array - no explanations, no markdown, no extra text.`, { label: 'User Entered (Parse formulas)', id: 'USER_ENTERED' }, { label: "Raw (Don't parse formulas)", id: 'RAW' }, ], - condition: { field: 'operation', value: ['write', 'update', 'batch_update'] }, + condition: { field: 'operation', value: ['write', 'update', 'append', 'batch_update'] }, + }, + { + id: 'includeValuesInResponse', + title: 'Return Updated Values', + type: 'switch', + condition: { field: 'operation', value: ['write', 'update', 'append', 'batch_update'] }, + mode: 'advanced', }, { id: 'values', @@ -891,6 +936,7 @@ Return ONLY the JSON array - no explanations, no markdown, no extra text.`, filterColumn, filterValue, filterMatchType, + majorDimension, ...rest } = params @@ -926,6 +972,11 @@ Return ONLY the JSON array - no explanations, no markdown, no extra text.`, spreadsheetId: effectiveSpreadsheetId, ranges: parsedRanges, oauthCredential, + ...(majorDimension ? { majorDimension } : {}), + ...(rest.valueRenderOption ? { valueRenderOption: rest.valueRenderOption } : {}), + ...(rest.dateTimeRenderOption + ? { dateTimeRenderOption: rest.dateTimeRenderOption } + : {}), } } @@ -1029,6 +1080,22 @@ Return ONLY the JSON array - no explanations, no markdown, no extra text.`, values: { type: 'string', description: 'Cell values data' }, valueInputOption: { type: 'string', description: 'Value input option' }, insertDataOption: { type: 'string', description: 'Data insertion option' }, + includeValuesInResponse: { + type: 'boolean', + description: 'Return the values of the updated cells in updatedData', + }, + valueRenderOption: { + type: 'string', + description: 'How read values are rendered: FORMATTED_VALUE, UNFORMATTED_VALUE, or FORMULA', + }, + dateTimeRenderOption: { + type: 'string', + description: 'How read dates are rendered: SERIAL_NUMBER or FORMATTED_STRING', + }, + majorDimension: { + type: 'string', + description: 'Major dimension of batch read values: ROWS or COLUMNS', + }, title: { type: 'string', description: 'Title for new spreadsheet' }, sheetTitles: { type: 'string', description: 'Comma-separated sheet names for new spreadsheet' }, ranges: { type: 'string', description: 'JSON array of ranges for batch operations' }, @@ -1083,6 +1150,17 @@ Return ONLY the JSON array - no explanations, no markdown, no extra text.`, 'Filter summary (present only when a filter was requested): applied, column, matchType, columnFound, matchedRows, totalRows', condition: { field: 'operation', value: 'read' }, }, + majorDimension: { + type: 'string', + description: 'Major dimension of the returned values (ROWS or COLUMNS)', + condition: { field: 'operation', value: 'read' }, + }, + updatedData: { + type: 'json', + description: + 'Values of the updated cells (range, majorDimension, values), present only when Return Updated Values is on', + condition: { field: 'operation', value: ['write', 'update', 'append'] }, + }, updatedRange: { type: 'string', description: 'Updated range', diff --git a/apps/sim/blocks/blocks/google_slides.ts b/apps/sim/blocks/blocks/google_slides.ts index 6df71191c55..2096f86501c 100644 --- a/apps/sim/blocks/blocks/google_slides.ts +++ b/apps/sim/blocks/blocks/google_slides.ts @@ -3466,6 +3466,21 @@ Return ONLY the text content - no explanations, no markdown formatting markers, pageType: { type: 'string', description: 'Page type (SLIDE, MASTER, etc.)' }, pageElements: { type: 'json', description: 'Page elements array' }, slideProperties: { type: 'json', description: 'Slide-specific properties' }, + slideContents: { + type: 'json', + description: + 'Plain-text view of each slide from Read: [{objectId, index, text, speakerNotes, isSkipped}]', + }, + revisionId: { + type: 'string', + description: 'Presentation revision ID from Get Page (Read returns it in metadata)', + }, + pageProperties: { + type: 'json', + description: 'Page properties from Get Page (pageBackgroundFill, colorScheme)', + }, + pageText: { type: 'string', description: 'Text on the page from Get Page' }, + speakerNotes: { type: 'string', description: 'Speaker notes of the slide from Get Page' }, deleted: { type: 'boolean', description: 'Whether object was deleted' }, duplicatedObjectId: { type: 'string', description: 'Object ID of the duplicate' }, moved: { type: 'boolean', description: 'Whether slides were moved' }, diff --git a/apps/sim/blocks/blocks/google_tasks.ts b/apps/sim/blocks/blocks/google_tasks.ts index 3d1d6ba3ca8..76e04ac39a7 100644 --- a/apps/sim/blocks/blocks/google_tasks.ts +++ b/apps/sim/blocks/blocks/google_tasks.ts @@ -159,6 +159,23 @@ Return ONLY the timestamp - no explanations, no extra text.`, ], }, + { + id: 'parent', + title: 'Parent Task ID', + type: 'short-input', + placeholder: 'Create as a subtask of this task', + condition: { field: 'operation', value: 'create' }, + mode: 'advanced', + }, + { + id: 'previous', + title: 'Previous Sibling Task ID', + type: 'short-input', + placeholder: 'Place after this task (first if empty)', + condition: { field: 'operation', value: 'create' }, + mode: 'advanced', + }, + // Get/Update/Delete Task Fields - Task ID { id: 'taskId', @@ -231,6 +248,133 @@ Return ONLY the timestamp - no explanations, no extra text.`, { label: 'No', id: 'false' }, ], }, + { + id: 'showHidden', + title: 'Show Hidden', + type: 'dropdown', + condition: { field: 'operation', value: 'list' }, + options: [ + { label: 'Default', id: '' }, + { label: 'Yes', id: 'true' }, + { label: 'No', id: 'false' }, + ], + value: () => '', + mode: 'advanced', + }, + { + id: 'showDeleted', + title: 'Show Deleted', + type: 'dropdown', + condition: { field: 'operation', value: 'list' }, + options: [ + { label: 'Default', id: '' }, + { label: 'Yes', id: 'true' }, + { label: 'No', id: 'false' }, + ], + value: () => '', + mode: 'advanced', + }, + { + id: 'showAssigned', + title: 'Show Assigned', + type: 'dropdown', + condition: { field: 'operation', value: 'list' }, + options: [ + { label: 'Default', id: '' }, + { label: 'Yes', id: 'true' }, + { label: 'No', id: 'false' }, + ], + value: () => '', + mode: 'advanced', + }, + { + id: 'dueMin', + title: 'Due After', + type: 'short-input', + placeholder: '2025-06-01T00:00:00.000Z', + condition: { field: 'operation', value: 'list' }, + mode: 'advanced', + wandConfig: { + enabled: true, + prompt: `Generate an RFC 3339 timestamp in UTC based on the user's description. +The timestamp should be in the format: YYYY-MM-DDTHH:MM:SS.000Z (UTC timezone). + +Return ONLY the timestamp - no explanations, no extra text.`, + generationType: 'timestamp', + }, + }, + { + id: 'dueMax', + title: 'Due Before', + type: 'short-input', + placeholder: '2025-06-30T00:00:00.000Z', + condition: { field: 'operation', value: 'list' }, + mode: 'advanced', + wandConfig: { + enabled: true, + prompt: `Generate an RFC 3339 timestamp in UTC based on the user's description. +The timestamp should be in the format: YYYY-MM-DDTHH:MM:SS.000Z (UTC timezone). + +Return ONLY the timestamp - no explanations, no extra text.`, + generationType: 'timestamp', + }, + }, + { + id: 'completedMin', + title: 'Completed After', + type: 'short-input', + placeholder: '2025-06-01T00:00:00.000Z', + condition: { field: 'operation', value: 'list' }, + mode: 'advanced', + wandConfig: { + enabled: true, + prompt: `Generate an RFC 3339 timestamp in UTC based on the user's description. +The timestamp should be in the format: YYYY-MM-DDTHH:MM:SS.000Z (UTC timezone). + +Return ONLY the timestamp - no explanations, no extra text.`, + generationType: 'timestamp', + }, + }, + { + id: 'completedMax', + title: 'Completed Before', + type: 'short-input', + placeholder: '2025-06-30T00:00:00.000Z', + condition: { field: 'operation', value: 'list' }, + mode: 'advanced', + wandConfig: { + enabled: true, + prompt: `Generate an RFC 3339 timestamp in UTC based on the user's description. +The timestamp should be in the format: YYYY-MM-DDTHH:MM:SS.000Z (UTC timezone). + +Return ONLY the timestamp - no explanations, no extra text.`, + generationType: 'timestamp', + }, + }, + { + id: 'updatedMin', + title: 'Updated After', + type: 'short-input', + placeholder: '2025-06-01T00:00:00.000Z', + condition: { field: 'operation', value: 'list' }, + mode: 'advanced', + wandConfig: { + enabled: true, + prompt: `Generate an RFC 3339 timestamp in UTC based on the user's description. +The timestamp should be in the format: YYYY-MM-DDTHH:MM:SS.000Z (UTC timezone). + +Return ONLY the timestamp - no explanations, no extra text.`, + generationType: 'timestamp', + }, + }, + { + id: 'pageToken', + title: 'Page Token', + type: 'short-input', + placeholder: 'Token from a previous response', + condition: { field: 'operation', value: ['list', 'list_task_lists'] }, + mode: 'advanced', + }, ], tools: { @@ -276,6 +420,15 @@ Return ONLY the timestamp - no explanations, no extra text.`, processedParams.showCompleted = showCompleted === 'true' } + for (const key of ['showHidden', 'showDeleted', 'showAssigned'] as const) { + const value = processedParams[key] + if (value === '' || value === undefined || value === null) { + delete processedParams[key] + } else if (typeof value === 'string') { + processedParams[key] = value === 'true' + } + } + return { oauthCredential, ...processedParams, @@ -295,6 +448,20 @@ Return ONLY the timestamp - no explanations, no extra text.`, taskId: { type: 'string', description: 'Task identifier' }, maxResults: { type: 'string', description: 'Maximum number of results' }, showCompleted: { type: 'string', description: 'Whether to show completed tasks' }, + parent: { type: 'string', description: 'Parent task ID for a subtask' }, + previous: { type: 'string', description: 'Previous sibling task ID' }, + showHidden: { type: 'string', description: 'Whether to show hidden tasks' }, + showDeleted: { type: 'string', description: 'Whether to show deleted tasks' }, + showAssigned: { + type: 'string', + description: 'Whether to show tasks assigned from Docs or Chat', + }, + dueMin: { type: 'string', description: 'Lower bound for due date' }, + dueMax: { type: 'string', description: 'Upper bound for due date' }, + completedMin: { type: 'string', description: 'Lower bound for completion date' }, + completedMax: { type: 'string', description: 'Upper bound for completion date' }, + updatedMin: { type: 'string', description: 'Lower bound for last modification time' }, + pageToken: { type: 'string', description: 'Pagination token' }, }, outputs: { @@ -310,7 +477,18 @@ Return ONLY the timestamp - no explanations, no extra text.`, position: { type: 'string', description: 'Position among sibling tasks' }, completed: { type: 'string', description: 'Completion date' }, deleted: { type: 'boolean', description: 'Whether the task is deleted' }, - tasks: { type: 'json', description: 'Array of tasks (list operation)' }, + hidden: { type: 'boolean', description: 'Whether the task is hidden' }, + links: { type: 'json', description: 'Links attached to the task [{type, description, link}]' }, + assignmentInfo: { + type: 'json', + description: + 'Source of a task assigned from Docs or Chat (linkToTask, surfaceType, driveResourceInfo, spaceInfo)', + }, + tasks: { + type: 'json', + description: + 'Array of tasks (list operation): [{id, title, notes, status, due, completed, updated, selfLink, webViewLink, parent, position, hidden, deleted, links, assignmentInfo}]', + }, taskLists: { type: 'json', description: 'Array of task lists (list_task_lists operation)' }, taskId: { type: 'string', description: 'Deleted task ID (delete operation)' }, nextPageToken: { type: 'string', description: 'Token for next page of results' }, diff --git a/apps/sim/blocks/blocks/google_vault.ts b/apps/sim/blocks/blocks/google_vault.ts index c5eb6608df2..ea4c05148fe 100644 --- a/apps/sim/blocks/blocks/google_vault.ts +++ b/apps/sim/blocks/blocks/google_vault.ts @@ -264,6 +264,32 @@ export const GoogleVaultBlock: BlockConfig = { placeholder: 'Enter Matter ID (optional to fetch a specific matter)', condition: { field: 'operation', value: 'list_matters' }, }, + { + id: 'matterView', + title: 'Detail Level', + type: 'dropdown', + options: [ + { label: 'Basic', id: 'BASIC' }, + { label: 'Full (include collaborators)', id: 'FULL' }, + ], + value: () => 'BASIC', + condition: { field: 'operation', value: 'list_matters' }, + mode: 'advanced', + }, + { + id: 'matterState', + title: 'Matter State', + type: 'dropdown', + options: [ + { label: 'All', id: '' }, + { label: 'Open', id: 'OPEN' }, + { label: 'Closed', id: 'CLOSED' }, + { label: 'Deleted', id: 'DELETED' }, + ], + value: () => '', + condition: { field: 'operation', value: 'list_matters' }, + mode: 'advanced', + }, // Download Export File inputs { id: 'bucketName', @@ -561,6 +587,46 @@ Return ONLY the search query - no explanations, no quotes, no extra text.`, placeholder: 'Describe what content to search for...', }, }, + { + id: 'exportIncludeSharedDrives', + title: 'Include Shared Drives', + type: 'switch', + condition: { + field: 'operation', + value: ['create_matters_export', 'create_saved_query'], + and: { field: 'corpus', value: 'DRIVE' }, + }, + }, + { + id: 'exportFormat', + title: 'Export Format', + type: 'dropdown', + options: [ + { label: 'Default', id: '' }, + { label: 'MBOX', id: 'MBOX' }, + { label: 'PST', id: 'PST' }, + ], + value: () => '', + condition: { + field: 'operation', + value: 'create_matters_export', + and: { field: 'corpus', value: 'DRIVE', not: true }, + }, + mode: 'advanced', + }, + { + id: 'dataScope', + title: 'Data Scope', + type: 'dropdown', + options: [ + { label: 'All data', id: 'ALL_DATA' }, + { label: 'Held data only', id: 'HELD_DATA' }, + { label: 'Unprocessed data (Mail and Groups)', id: 'UNPROCESSED_DATA' }, + ], + value: () => 'ALL_DATA', + condition: { field: 'operation', value: ['create_matters_export', 'create_saved_query'] }, + mode: 'advanced', + }, // Drive-specific option for holds { id: 'includeSharedDrives', @@ -625,6 +691,7 @@ Return ONLY the search query - no explanations, no quotes, no extra text.`, field: 'operation', value: ['list_matters_export', 'list_matters_holds', 'list_matters', 'list_saved_queries'], }, + mode: 'advanced', }, { id: 'pageToken', @@ -635,6 +702,7 @@ Return ONLY the search query - no explanations, no quotes, no extra text.`, field: 'operation', value: ['list_matters_export', 'list_matters_holds', 'list_matters', 'list_saved_queries'], }, + mode: 'advanced', }, { @@ -854,8 +922,15 @@ Return ONLY the description text - no explanations, no quotes, no extra text.`, listExportId, listHoldId, listSavedQueryId, + matterView, + matterState, + exportIncludeSharedDrives, + exportFormat, + dataScope, ...rest } = params + const isQueryOperation = + params.operation === 'create_matters_export' || params.operation === 'create_saved_query' return { ...rest, oauthCredential, @@ -879,6 +954,14 @@ Return ONLY the description text - no explanations, no quotes, no extra text.`, ...(listExportId && { exportId: listExportId }), ...(listHoldId && { holdId: listHoldId }), ...(listSavedQueryId && { savedQueryId: listSavedQueryId }), + ...(params.operation === 'list_matters' && matterView && { view: matterView }), + ...(params.operation === 'list_matters' && matterState && { state: matterState }), + ...(isQueryOperation && { + includeSharedDrives: + exportIncludeSharedDrives === true || exportIncludeSharedDrives === 'true', + ...(dataScope && { dataScope }), + }), + ...(params.operation === 'create_matters_export' && exportFormat && { exportFormat }), } }, }, @@ -978,19 +1061,43 @@ Return ONLY the description text - no explanations, no quotes, no extra text.`, type: 'string', description: 'Specific saved query ID to fetch (list_saved_queries)', }, + matterView: { + type: 'string', + description: 'Matter detail level: BASIC or FULL (list_matters)', + }, + matterState: { + type: 'string', + description: 'Only list matters in this state: OPEN, CLOSED, or DELETED (list_matters)', + }, + exportIncludeSharedDrives: { + type: 'boolean', + description: 'Include shared drive files (DRIVE create_matters_export, create_saved_query)', + }, + exportFormat: { + type: 'string', + description: 'Export file format: MBOX or PST (create_matters_export, non-DRIVE corpus)', + }, + dataScope: { + type: 'string', + description: + 'Data to search: ALL_DATA, HELD_DATA, or UNPROCESSED_DATA (create_matters_export, create_saved_query)', + }, }, outputs: { matters: { type: 'json', - description: 'Array of matter objects (for list_matters without matterId)', + description: + 'Array of matter objects (matterId, name, description, state; matterPermissions with Full detail) (for list_matters without matterId)', }, exports: { type: 'json', - description: 'Array of export objects (for list_matters_export without exportId)', + description: + 'Array of export objects (id, name, status, createTime, stats, cloudStorageSink.files with bucketName/objectName/size) (for list_matters_export without exportId)', }, holds: { type: 'json', - description: 'Array of hold objects (for list_matters_holds without holdId)', + description: + 'Array of hold objects (holdId, name, corpus, updateTime, query, accounts or orgUnit) (for list_matters_holds without holdId)', }, matter: { type: 'json', diff --git a/apps/sim/lib/api/contracts/tools/google.ts b/apps/sim/lib/api/contracts/tools/google.ts index 024c6870bc8..6519bfb3c9c 100644 --- a/apps/sim/lib/api/contracts/tools/google.ts +++ b/apps/sim/lib/api/contracts/tools/google.ts @@ -30,6 +30,7 @@ export const gmailMailBodySchema = z.object({ replyToMessageId: z.string().optional().nullable(), cc: z.string().optional().nullable(), bcc: z.string().optional().nullable(), + replyTo: z.string().optional().nullable(), attachments: RawFileInputArraySchema.optional().nullable(), }) diff --git a/apps/sim/lib/internal/gmail/mail.ts b/apps/sim/lib/internal/gmail/mail.ts index 323bcffe417..beda80d6af9 100644 --- a/apps/sim/lib/internal/gmail/mail.ts +++ b/apps/sim/lib/internal/gmail/mail.ts @@ -112,6 +112,7 @@ async function buildRawMessage( to: input.to, cc: input.cc ?? undefined, bcc: input.bcc ?? undefined, + replyTo: input.replyTo ?? undefined, subject: input.subject || threading.subject || '', body: input.body, contentType: input.contentType || 'text', @@ -129,6 +130,7 @@ async function buildRawMessage( to: input.to, cc: input.cc, bcc: input.bcc, + replyTo: input.replyTo, subject: input.subject || threading.subject, body: input.body, contentType: input.contentType || 'text', diff --git a/apps/sim/lib/internal/gmail/operations.test.ts b/apps/sim/lib/internal/gmail/operations.test.ts index f9a668115fe..1624eb54a44 100644 --- a/apps/sim/lib/internal/gmail/operations.test.ts +++ b/apps/sim/lib/internal/gmail/operations.test.ts @@ -20,6 +20,7 @@ const { mockProcessFilesToUserFiles } = fileUtilsMockFns const { mockDownloadServableFilesWithinBudget } = fileUtilsServerMockFns import { GmailOperationError } from '@/lib/internal/gmail/errors' +import { executeGmailTool } from '@/lib/internal/gmail/execute-tool' import { executeGmailSend } from '@/lib/internal/gmail/mail' const MAIL = { @@ -65,4 +66,44 @@ describe('Gmail operations', () => { expect(mockDownloadServableFilesWithinBudget).not.toHaveBeenCalled() expect(fetchMock).not.toHaveBeenCalled() }) + + describe('Reply-To header', () => { + const cases = [ + { toolId: 'gmail_send_v2', input: {} }, + { toolId: 'gmail_draft_v2', input: {} }, + { toolId: 'gmail_edit_draft_v2', input: { draftId: 'draft-1' } }, + ] + + async function rawHeaderLines(toolId: string, input: Record) { + const fetchMock = vi.fn(async () => Response.json({ id: 'x', message: { id: 'm' } })) + vi.stubGlobal('fetch', fetchMock) + const response = await executeGmailTool({ + toolId, + input: { ...MAIL, ...input }, + headers: new Headers(), + context: { workflowId: 'wf', userId: 'user-1' }, + requestId: 'request-1', + }) + expect(response.status).toBe(200) + const call = fetchMock.mock.calls[0] as unknown as [string, RequestInit] + const body = JSON.parse(String(call[1].body)) as { raw?: string; message?: { raw: string } } + const raw = body.raw ?? body.message?.raw ?? '' + const mime = Buffer.from(raw, 'base64url').toString('utf-8') + return mime.slice(0, mime.indexOf('\n\n')).split('\n') + } + + it.each(cases)('emits a sanitized Reply-To through $toolId', async ({ toolId, input }) => { + const lines = await rawHeaderLines(toolId, { + ...input, + replyTo: 'support@example.com\r\nBcc: evil@example.com', + }) + expect(lines).toContain('Reply-To: support@example.com Bcc: evil@example.com') + expect(lines.some((line) => line.startsWith('Bcc:'))).toBe(false) + }) + + it.each(cases)('omits Reply-To when unset in $toolId', async ({ toolId, input }) => { + const lines = await rawHeaderLines(toolId, input) + expect(lines.some((line) => line.startsWith('Reply-To:'))).toBe(false) + }) + }) }) diff --git a/apps/sim/lib/webhooks/polling/gmail.ts b/apps/sim/lib/webhooks/polling/gmail.ts index 7f8b75b7c88..58b40ba8d4b 100644 --- a/apps/sim/lib/webhooks/polling/gmail.ts +++ b/apps/sim/lib/webhooks/polling/gmail.ts @@ -49,6 +49,12 @@ interface SimplifiedEmail { from: string to: string cc: string + bcc: string | null + replyTo: string | null + rfcMessageId: string | null + inReplyTo: string | null + references: string | null + snippet: string | null date: string | null bodyText: string bodyHtml: string @@ -509,6 +515,12 @@ async function processEmails( from: headers.from || '', to: headers.to || '', cc: headers.cc || '', + bcc: headers.bcc ?? null, + replyTo: headers['reply-to'] ?? null, + rfcMessageId: headers['message-id'] ?? null, + inReplyTo: headers['in-reply-to'] ?? null, + references: headers.references ?? null, + snippet: email.snippet ?? null, date, bodyText: textContent, bodyHtml: htmlContent, diff --git a/apps/sim/lib/webhooks/polling/google-calendar.ts b/apps/sim/lib/webhooks/polling/google-calendar.ts index 72723f26cb4..4a4a75d05f3 100644 --- a/apps/sim/lib/webhooks/polling/google-calendar.ts +++ b/apps/sim/lib/webhooks/polling/google-calendar.ts @@ -69,6 +69,12 @@ interface CalendarEvent { creator?: CalendarEventPerson organizer?: CalendarEventPerson recurringEventId?: string + originalStartTime?: CalendarEventTime + hangoutLink?: string + conferenceData?: Record + visibility?: string + transparency?: string + iCalUID?: string } interface SimplifiedCalendarEvent { @@ -86,6 +92,13 @@ interface SimplifiedCalendarEvent { attendees: CalendarEventAttendee[] | null creator: CalendarEventPerson | null organizer: CalendarEventPerson | null + hangoutLink: string | null + conferenceData: Record | null + recurringEventId: string | null + originalStartTime: CalendarEventTime | null + visibility: string | null + transparency: string | null + iCalUID: string | null } interface GoogleCalendarWebhookPayload { @@ -280,6 +293,13 @@ function simplifyEvent( attendees: event.attendees ?? null, creator: event.creator ?? null, organizer: event.organizer ?? null, + hangoutLink: event.hangoutLink ?? null, + conferenceData: event.conferenceData ?? null, + recurringEventId: event.recurringEventId ?? null, + originalStartTime: event.originalStartTime ?? null, + visibility: event.visibility ?? null, + transparency: event.transparency ?? null, + iCalUID: event.iCalUID ?? null, } } diff --git a/apps/sim/lib/webhooks/providers/gmail.test.ts b/apps/sim/lib/webhooks/providers/gmail.test.ts index 8054ec82120..2a44b595161 100644 --- a/apps/sim/lib/webhooks/providers/gmail.test.ts +++ b/apps/sim/lib/webhooks/providers/gmail.test.ts @@ -9,6 +9,12 @@ const sampleEmail = { from: 'sender@example.com', to: 'recipient@example.com', cc: '', + bcc: null, + replyTo: null, + rfcMessageId: null, + inReplyTo: null, + references: null, + snippet: null, date: '2026-07-08T00:00:00.000Z', bodyText: 'plain text body', bodyHtml: '

html body

', diff --git a/apps/sim/lib/webhooks/providers/google-forms.ts b/apps/sim/lib/webhooks/providers/google-forms.ts index decbfa7222c..fdb70b6c498 100644 --- a/apps/sim/lib/webhooks/providers/google-forms.ts +++ b/apps/sim/lib/webhooks/providers/google-forms.ts @@ -43,6 +43,8 @@ export const googleFormsHandler: WebhookProviderHandler = { createTime, lastSubmittedTime, formId, + respondentEmail: + typeof b?.respondentEmail === 'string' && b.respondentEmail ? b.respondentEmail : null, answers: normalizeAnswers(b?.answers), ...(includeRaw ? { raw: b?.raw ?? b } : {}), }, diff --git a/apps/sim/tools/generated/tool-metadata.ts b/apps/sim/tools/generated/tool-metadata.ts index a8659efbcfb..a03cbd583d3 100644 --- a/apps/sim/tools/generated/tool-metadata.ts +++ b/apps/sim/tools/generated/tool-metadata.ts @@ -3,7 +3,7 @@ /** Serializable metadata for every built-in tool, keyed by tool id. */ const toolMetadata: Record = JSON.parse( - '{"a2a_cancel_task":{"id":"a2a_cancel_task","name":"A2A Cancel Task","description":"Request cancellation of an in-progress A2A task.","version":"1.0.0","params":{"agentUrl":{"type":"string","required":true,"visibility":"user-only","description":"The A2A agent endpoint URL"},"taskId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The task ID to cancel"},"apiKey":{"type":"string","required":false,"visibility":"user-only","description":"API key for authentication (if required)"}},"hostedApiKey":"none"},"a2a_get_agent_card":{"id":"a2a_get_agent_card","name":"A2A Get Agent Card","description":"Fetch the Agent Card (discovery document) for an external A2A agent.","version":"1.0.0","params":{"agentUrl":{"type":"string","required":true,"visibility":"user-only","description":"The A2A agent endpoint URL"},"apiKey":{"type":"string","required":false,"visibility":"user-only","description":"API key for authentication (if required)"}},"hostedApiKey":"none"},"a2a_get_task":{"id":"a2a_get_task","name":"A2A Get Task","description":"Retrieve the current state and result of an A2A task.","version":"1.0.0","params":{"agentUrl":{"type":"string","required":true,"visibility":"user-only","description":"The A2A agent endpoint URL"},"taskId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The task ID to retrieve"},"historyLength":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of history messages to include"},"apiKey":{"type":"string","required":false,"visibility":"user-only","description":"API key for authentication (if required)"}},"hostedApiKey":"none"},"a2a_send_message":{"id":"a2a_send_message","name":"A2A Send Message","description":"Send a message to an external A2A agent and return its response.","version":"1.0.0","params":{"agentUrl":{"type":"string","required":true,"visibility":"user-only","description":"The A2A agent endpoint URL"},"message":{"type":"string","required":true,"visibility":"user-or-llm","description":"The message text to send"},"data":{"type":"json","required":false,"visibility":"user-or-llm","description":"Optional structured JSON data to attach"},"files":{"type":"json","required":false,"visibility":"user-or-llm","description":"Optional files to attach"},"taskId":{"type":"string","required":false,"visibility":"user-or-llm","description":"Existing task ID to continue"},"contextId":{"type":"string","required":false,"visibility":"user-or-llm","description":"Conversation context ID to continue"},"apiKey":{"type":"string","required":false,"visibility":"user-only","description":"API key for authentication (if required)"}},"hostedApiKey":"none"},"affinity_batch_update_entity_fields":{"id":"affinity_batch_update_entity_fields","name":"Affinity Batch Update Entity Fields","description":"Write up to 100 non-list field values on one company or person in a single request.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"entityType":{"type":"string","required":true,"visibility":"user-or-llm","description":"Which entity to write the fields on: companies or persons"},"entityId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of that company or person"},"updates":{"type":"json","required":true,"visibility":"user-or-llm","description":"Up to 100 field updates as [{\\"id\\":\\"\\",\\"value\\":{\\"type\\":\\"…\\",\\"data\\":…}}], using the same value shapes as a single field update"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_batch_update_list_entry_fields":{"id":"affinity_batch_update_list_entry_fields","name":"Affinity Batch Update List Entry Fields","description":"Write up to 100 field values on one list row in a single request. Requires the \\"Export data from Lists\\" permission.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"listId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The list ID"},"listEntryId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The list entry ID"},"updates":{"type":"json","required":true,"visibility":"user-or-llm","description":"Up to 100 field updates as [{\\"id\\":\\"\\",\\"value\\":{\\"type\\":\\"…\\",\\"data\\":…}}], using the same value shapes as a single field update"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_create_list":{"id":"affinity_create_list","name":"Affinity Create List","description":"Create a list. Its type fixes which entities it can hold, and the API key holder becomes its creator and owner.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"name":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the new list"},"type":{"type":"string","required":true,"visibility":"user-or-llm","description":"Entity kind the list holds: company, opportunity, or person"},"isPublic":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Whether everyone in the organization can see the list"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_create_list_field_dropdown_option":{"id":"affinity_create_list_field_dropdown_option","name":"Affinity Create List Field Dropdown Option","description":"Add a selectable option to a dropdown field on a list. A ranked or status option also needs a rank and a color.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"listId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The list ID"},"fieldId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The dropdown field ID on that list"},"type":{"type":"string","required":true,"visibility":"user-or-llm","description":"Kind of option to create, matching the field. dropdown takes only a label; ranked-dropdown also requires rank and color; status-dropdown additionally requires a status category. Sending a field the kind does not accept is rejected"},"text":{"type":"string","required":true,"visibility":"user-or-llm","description":"The option label"},"rank":{"type":"number","required":false,"visibility":"user-or-llm","description":"Sort order. Required on a ranked-dropdown or status-dropdown option"},"color":{"type":"string","required":false,"visibility":"user-or-llm","description":"Option color: white, gray, blue, green, purple, orange, or red. Required on a ranked-dropdown or status-dropdown option"},"statusCategory":{"type":"string","required":false,"visibility":"user-or-llm","description":"Pipeline meaning of the option: open, won, lost, or on-hold. Status-dropdown options only"},"winRate":{"type":"number","required":false,"visibility":"user-or-llm","description":"Expected win rate of the status. Status-dropdown options only"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_create_merge":{"id":"affinity_create_merge","name":"Affinity Create Merge","description":"Fold a duplicate company or person into the record you are keeping. The merge runs asynchronously — poll the returned task to see it finish. Requires the \\"Manage duplicates\\" permission and an admin role.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"entityType":{"type":"string","required":true,"visibility":"user-or-llm","description":"What to merge: companies or persons"},"primaryId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the record to keep"},"duplicateId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the duplicate record to fold in"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_create_note":{"id":"affinity_create_note","name":"Affinity Create Note","description":"Write a note — attached to companies, persons, and opportunities, anchored to a meeting, call, or chat message, or posted as a reply to an existing note.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"type":{"type":"string","required":true,"visibility":"user-or-llm","description":"Note shape: entities to attach it to records, interaction to anchor it to a meeting, call, or chat message, or user-reply to reply to a note"},"html":{"type":"string","required":true,"visibility":"user-or-llm","description":"The note body as HTML"},"companyIds":{"type":"json","required":false,"visibility":"user-or-llm","description":"Companies to attach the note to, e.g. [1, 2]. Not used on a reply"},"personIds":{"type":"json","required":false,"visibility":"user-or-llm","description":"Persons to attach the note to, e.g. [1, 2]. Not used on a reply"},"opportunityIds":{"type":"json","required":false,"visibility":"user-or-llm","description":"Opportunities to attach the note to, e.g. [1, 2]. Not used on a reply"},"interactionId":{"type":"string","required":false,"visibility":"user-or-llm","description":"The interaction to anchor the note to. Required for an interaction note"},"interactionType":{"type":"string","required":false,"visibility":"user-or-llm","description":"Kind of the anchoring interaction: meeting, call, or chat-message. Required for an interaction note"},"parentId":{"type":"string","required":false,"visibility":"user-or-llm","description":"The note being replied to. Required for a user-reply note"},"creatorId":{"type":"string","required":false,"visibility":"user-or-llm","description":"Attribute the note to another internal person. Defaults to the API key holder"},"createdAt":{"type":"string","required":false,"visibility":"user-or-llm","description":"Backdate the note to this ISO 8601 timestamp"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_create_reminder":{"id":"affinity_create_reminder","name":"Affinity Create Reminder","description":"Create a reminder on one company, person, or opportunity. A recurring reminder resets whenever the chosen signal happens instead of firing once.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"type":{"type":"string","required":true,"visibility":"user-or-llm","description":"one-time to fire once, or recurring to reset on a signal"},"entityType":{"type":"string","required":true,"visibility":"user-or-llm","description":"What the reminder is about: company, person, or opportunity"},"entityId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of that company, person, or opportunity"},"dueDate":{"type":"string","required":false,"visibility":"user-or-llm","description":"When the reminder is due, as an ISO 8601 timestamp. Required for a one-time reminder; on a recurring one Affinity computes it from the period when omitted"},"content":{"type":"string","required":false,"visibility":"user-or-llm","description":"What the reminder says"},"ownerId":{"type":"string","required":true,"visibility":"user-or-llm","description":"User the reminder is assigned to. Must be an internal user. The API key holder is recorded as the creator, which is a separate field"},"resetTrigger":{"type":"string","required":false,"visibility":"user-or-llm","description":"What restarts a recurring reminder: interaction, email, or event. Required when the type is recurring"},"periodDays":{"type":"number","required":false,"visibility":"user-or-llm","description":"Days between firings of a recurring reminder. Required when the type is recurring"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_delete_list_field_dropdown_option":{"id":"affinity_delete_list_field_dropdown_option","name":"Affinity Delete List Field Dropdown Option","description":"Permanently delete a dropdown option on a list field. Every list entry currently set to it is cleared, and those values cannot be recovered.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"listId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The list ID"},"fieldId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The dropdown field ID on that list"},"dropdownOptionId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The dropdown option ID to delete"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_delete_note":{"id":"affinity_delete_note","name":"Affinity Delete Note","description":"Delete a note you created. Deleting a root note also deletes its replies; deleting a reply removes only that reply.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"noteId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The note ID to delete"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_get_company":{"id":"affinity_get_company","name":"Affinity Get Company","description":"Look up one company by ID. Field data is returned only for the Field IDs or Field Types asked for.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"companyId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The company ID"},"fieldIds":{"type":"json","required":false,"visibility":"user-or-llm","description":"Field IDs to return values for, e.g. [\\"affinity-data-location\\"]. Mutually exclusive with Field Types"},"fieldTypes":{"type":"json","required":false,"visibility":"user-or-llm","description":"Field categories to return values for: enriched, global, or relationship-intelligence. Mutually exclusive with Field IDs"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_get_current_user":{"id":"affinity_get_current_user","name":"Affinity Get Current User","description":"Verify an Affinity API key and return the tenant, the user behind the key, and the scopes the grant carries.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_get_entity_field_value":{"id":"affinity_get_entity_field_value","name":"Affinity Get Entity Field Value","description":"Read one non-list field value from a company or person.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"entityType":{"type":"string","required":true,"visibility":"user-or-llm","description":"Which entity to read the field from: companies or persons"},"entityId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of that company or person"},"fieldId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The field ID to read"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_get_list":{"id":"affinity_get_list","name":"Affinity Get List","description":"Read one list — its name, type, owner, and privacy setting.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"listId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The list ID"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_get_list_entry":{"id":"affinity_get_list_entry","name":"Affinity Get List Entry","description":"Read one row of a list with its entity. Field data is returned only for the Field IDs or Field Types asked for.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"listId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The list ID"},"listEntryId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The list entry ID"},"fieldIds":{"type":"json","required":false,"visibility":"user-or-llm","description":"Field IDs to return values for, e.g. [\\"affinity-data-location\\"]. Mutually exclusive with Field Types"},"fieldTypes":{"type":"json","required":false,"visibility":"user-or-llm","description":"Field categories to return values for: enriched, global, list, or relationship-intelligence. Mutually exclusive with Field IDs"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_get_list_entry_field":{"id":"affinity_get_list_entry_field","name":"Affinity Get List Entry Field","description":"Read one field value on a list row.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"listId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The list ID"},"listEntryId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The list entry ID"},"fieldId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The field ID to read"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_get_list_field_dropdown_option":{"id":"affinity_get_list_field_dropdown_option","name":"Affinity Get List Field Dropdown Option","description":"Read one dropdown option on a list field.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"listId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The list ID"},"fieldId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The dropdown field ID on that list"},"dropdownOptionId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The dropdown option ID"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_get_merge":{"id":"affinity_get_merge","name":"Affinity Get Merge","description":"Read the status of one company or person merge, including why it failed if it did.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"entityType":{"type":"string","required":true,"visibility":"user-or-llm","description":"Which merge to read: companies or persons"},"mergeId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The merge ID"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_get_merge_task":{"id":"affinity_get_merge_task","name":"Affinity Get Merge Task","description":"Read one merge task and how its merges are progressing. Poll this after starting a merge.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"entityType":{"type":"string","required":true,"visibility":"user-or-llm","description":"Which merge task to read: companies or persons"},"taskId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The merge task ID"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_get_note":{"id":"affinity_get_note","name":"Affinity Get Note","description":"Read one note with its body, author, mentions, and attached records.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"noteId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The note ID"},"includes":{"type":"json","required":false,"visibility":"user-or-llm","description":"Extra properties to return, e.g. [\\"repliesCount\\",\\"personsPreview\\",\\"companiesPreview\\",\\"opportunitiesPreview\\"]. Those four fields are omitted unless requested here"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_get_opportunity":{"id":"affinity_get_opportunity","name":"Affinity Get Opportunity","description":"Read one opportunity and the list it belongs to. Its field data lives on the list entry.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"opportunityId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The opportunity ID"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_get_person":{"id":"affinity_get_person","name":"Affinity Get Person","description":"Look up one person by ID. Field data is returned only for the Field IDs or Field Types asked for.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"personId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The person ID"},"fieldIds":{"type":"json","required":false,"visibility":"user-or-llm","description":"Field IDs to return values for, e.g. [\\"affinity-data-location\\"]. Mutually exclusive with Field Types"},"fieldTypes":{"type":"json","required":false,"visibility":"user-or-llm","description":"Field categories to return values for: enriched, global, or relationship-intelligence. Mutually exclusive with Field IDs"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_get_saved_view":{"id":"affinity_get_saved_view","name":"Affinity Get Saved View","description":"Read one saved view — its name, kind, and creation date.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"listId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The list ID"},"viewId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The saved view ID"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_get_transcript":{"id":"affinity_get_transcript","name":"Affinity Get Transcript","description":"Read one transcript with its first 100 fragments. Page the fragments endpoint for a longer meeting.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"transcriptId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The transcript ID"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_get_user":{"id":"affinity_get_user","name":"Affinity Get User","description":"Read one internal user. A user and their person record share the same numeric ID, so a person ID works here.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"userId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The user ID, which is also their person ID"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_list_calls":{"id":"affinity_list_calls","name":"Affinity List Calls","description":"Page through logged calls and their participants. Only calls the API key holder can see are returned.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"filter":{"type":"string","required":false,"visibility":"user-or-llm","description":"Affinity Filtering Language expression, e.g. \\"createdAt>=2026-01-01\\""},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_list_chat_messages":{"id":"affinity_list_chat_messages","name":"Affinity List Chat Messages","description":"Page through logged chat messages and their participants. Only messages the API key holder can see are returned.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"filter":{"type":"string","required":false,"visibility":"user-or-llm","description":"Affinity Filtering Language expression, e.g. \\"createdAt>=2026-01-01\\""},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_list_companies":{"id":"affinity_list_companies","name":"Affinity List Companies","description":"Page through companies. Companies come back without field data unless Field IDs or Field Types asks for it.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"ids":{"type":"json","required":false,"visibility":"user-or-llm","description":"Restrict the page to these company IDs, e.g. [1, 2, 3]"},"fieldIds":{"type":"json","required":false,"visibility":"user-or-llm","description":"Field IDs to return values for, e.g. [\\"affinity-data-location\\"]. Mutually exclusive with Field Types"},"fieldTypes":{"type":"json","required":false,"visibility":"user-or-llm","description":"Field categories to return values for: enriched, global, or relationship-intelligence. Mutually exclusive with Field IDs"},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_list_coworker_connections":{"id":"affinity_list_coworker_connections","name":"Affinity List Coworker Connections","description":"Find warm paths into a company through shared work history: who in your Affinity data once worked alongside the people you want to reach. Grouped by target, strongest first.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"filter":{"type":"string","required":true,"visibility":"user-or-llm","description":"Required scope. The only supported filter is target.currentCompany.id, e.g. \\"target.currentCompany.id=123\\""},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of targets to return per page, 1-50. Defaults to 20"},"totalCount":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Include the total size of the collection. Costs an extra query"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_list_emails":{"id":"affinity_list_emails","name":"Affinity List Emails","description":"Page through email metadata — subject, participants, and timestamps. Affinity never exposes email bodies through the API.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"filter":{"type":"string","required":false,"visibility":"user-or-llm","description":"Affinity Filtering Language expression, e.g. \\"createdAt>=2026-01-01\\""},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_list_entity_field_values":{"id":"affinity_list_entity_field_values","name":"Affinity List Entity Field Values","description":"Page through a company\'s or person\'s non-list field values. List fields are not returned here — read those through the list entry.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"entityType":{"type":"string","required":true,"visibility":"user-or-llm","description":"Which entity to read field values from: companies or persons"},"entityId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of that company or person"},"ids":{"type":"json","required":false,"visibility":"user-or-llm","description":"Restrict to these field IDs. Mutually exclusive with Field Types"},"types":{"type":"json","required":false,"visibility":"user-or-llm","description":"Restrict to these field categories: enriched, global, relationship-intelligence. Mutually exclusive with Field IDs"},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 20"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_list_entity_list_entries":{"id":"affinity_list_entity_list_entries","name":"Affinity List Entity List Entries","description":"Page through a company\'s or person\'s rows across every list, each carrying that list\'s field values and when the entity was added.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"entityType":{"type":"string","required":true,"visibility":"user-or-llm","description":"Which entity to look up the rows of: companies or persons"},"entityId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of that company or person"},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_list_entity_lists":{"id":"affinity_list_entity_lists","name":"Affinity List Entity Lists","description":"List every list a company or person appears on that the caller can view.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"entityType":{"type":"string","required":true,"visibility":"user-or-llm","description":"Which entity to look up the lists of: companies or persons"},"entityId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of that company or person"},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_list_entity_notes":{"id":"affinity_list_entity_notes","name":"Affinity List Entity Notes","description":"List the notes relevant to one company, person, or opportunity — directly attached notes plus notes reaching it through its people and meetings.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"entityType":{"type":"string","required":true,"visibility":"user-or-llm","description":"Which entity the notes hang off: companies, persons, or opportunities"},"entityId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of that company, person, or opportunity"},"filter":{"type":"string","required":false,"visibility":"user-or-llm","description":"Affinity Filtering Language expression, e.g. \\"createdAt>=2026-01-01\\""},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"},"totalCount":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Include the total size of the collection. Costs an extra query"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_list_entity_relationships":{"id":"affinity_list_entity_relationships","name":"Affinity List Entity Relationships","description":"List who knows a company or person, scored 0.0 to 1.0 by how much the two actually interact. Strongest first by default.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"entityType":{"type":"string","required":true,"visibility":"user-or-llm","description":"Which entity to look up relationships for: companies or persons"},"entityId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of that company or person"},"filter":{"type":"string","required":false,"visibility":"user-or-llm","description":"Affinity Filtering Language expression. This endpoint filters on interactionScore only, e.g. \\"interactionScore>=0.5\\""},"orderBy":{"type":"json","required":false,"visibility":"user-or-llm","description":"Sort order: [\\"interactionScore\\"] for weakest first, [\\"-interactionScore\\"] for strongest first (the default)"},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"},"totalCount":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Include the total size of the collection. Costs an extra query"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_list_field_dropdown_options":{"id":"affinity_list_field_dropdown_options","name":"Affinity List Field Dropdown Options","description":"List the selectable options on a dropdown or ranked-dropdown company or person field. Writing such a field needs the option ID, not its text.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"entityType":{"type":"string","required":true,"visibility":"user-or-llm","description":"Which field family the field belongs to: companies or persons"},"fieldId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The dropdown or ranked-dropdown field ID"},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_list_field_metadata":{"id":"affinity_list_field_metadata","name":"Affinity List Field Metadata","description":"List the non-list company or person fields, with the value type, filter operators, and sort support of each. Start here to find the Field IDs the read and write tools take.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"entityType":{"type":"string","required":true,"visibility":"user-or-llm","description":"Which fields to describe: companies or persons"},"includes":{"type":"json","required":false,"visibility":"user-or-llm","description":"Extra properties to return: [\\"filterability\\",\\"sortability\\"]. Both are omitted unless requested here"},"filter":{"type":"string","required":false,"visibility":"user-or-llm","description":"Affinity Filtering Language expression. This endpoint filters on name only, e.g. \\"name=~Status\\""},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_list_field_value_changes":{"id":"affinity_list_field_value_changes","name":"Affinity List Field Value Changes","description":"Page through field value changes across the whole workspace. Built for delta sync: follow nextCursor to the end of a run, then resume from the last cursor next time.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"filter":{"type":"string","required":false,"visibility":"user-or-llm","description":"Affinity Filtering Language expression over field.id, listEntry.id, changer.id, changedAt, or actionType. Resume a sync with e.g. \\"changedAt>2026-06-01T12:00:00Z\\""},"orderBy":{"type":"json","required":false,"visibility":"user-or-llm","description":"Sort order: [\\"changedAt\\"] for oldest first (the default), [\\"-changedAt\\"] for newest first"},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_list_investor_executive_connections":{"id":"affinity_list_investor_executive_connections","name":"Affinity List Investor Executive Connections","description":"Find warm paths into a company through investment history: which investors in your Affinity data backed a company the people you want to reach once led. Grouped by target, strongest first.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"filter":{"type":"string","required":true,"visibility":"user-or-llm","description":"Required scope. The only supported filter is target.currentCompany.id, e.g. \\"target.currentCompany.id=123\\""},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of targets to return per page, 1-50. Defaults to 20"},"totalCount":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Include the total size of the collection. Costs an extra query"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_list_list_entries":{"id":"affinity_list_list_entries","name":"Affinity List List Entries","description":"Page through the rows of a list. Rows come back without field data unless Field IDs or Field Types asks for it.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"listId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The list ID"},"fieldIds":{"type":"json","required":false,"visibility":"user-or-llm","description":"Field IDs to return values for, e.g. [\\"affinity-data-location\\"]. Mutually exclusive with Field Types"},"fieldTypes":{"type":"json","required":false,"visibility":"user-or-llm","description":"Field categories to return values for: enriched, global, list, or relationship-intelligence. Mutually exclusive with Field IDs"},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_list_list_entry_field_value_changes":{"id":"affinity_list_list_entry_field_value_changes","name":"Affinity List List Entry Field Value Changes","description":"Page through the history of one list row — who changed which field, when, and to what.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"listId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The list ID"},"listEntryId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The list entry ID"},"filter":{"type":"string","required":false,"visibility":"user-or-llm","description":"Affinity Filtering Language expression over field.id, changer.id, changedAt, or actionType, e.g. \\"field.id=field-1234\\""},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_list_list_entry_fields":{"id":"affinity_list_list_entry_fields","name":"Affinity List List Entry Fields","description":"Page through every field value on one list row, including the list-specific columns. All fields are returned unless narrowed.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"listId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The list ID"},"listEntryId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The list entry ID"},"ids":{"type":"json","required":false,"visibility":"user-or-llm","description":"Restrict to these field IDs. Mutually exclusive with Field Types"},"types":{"type":"json","required":false,"visibility":"user-or-llm","description":"Restrict to these field categories: enriched, global, list, relationship-intelligence. Mutually exclusive with Field IDs"},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 20"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_list_list_field_dropdown_options":{"id":"affinity_list_list_field_dropdown_options","name":"Affinity List List Field Dropdown Options","description":"List the selectable options on a dropdown, ranked-dropdown, or status-dropdown field of a list.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"listId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The list ID"},"fieldId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The dropdown field ID on that list"},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_list_list_fields":{"id":"affinity_list_list_fields","name":"Affinity List List Fields","description":"List the fields available on one list, including its list-specific columns. Use these Field IDs when reading or writing list entries.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"listId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The list ID"},"includes":{"type":"json","required":false,"visibility":"user-or-llm","description":"Extra properties to return: [\\"filterability\\",\\"sortability\\"]. Both are omitted unless requested here"},"filter":{"type":"string","required":false,"visibility":"user-or-llm","description":"Affinity Filtering Language expression. This endpoint filters on name only, e.g. \\"name=~Stage\\""},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_list_lists":{"id":"affinity_list_lists","name":"Affinity List Lists","description":"Page through the lists in the organization that the caller can view.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"term":{"type":"string","required":false,"visibility":"user-or-llm","description":"Case-insensitive substring match on the list name"},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_list_meetings":{"id":"affinity_list_meetings","name":"Affinity List Meetings","description":"Page through past and upcoming meetings with their organizer and attendees.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"filter":{"type":"string","required":false,"visibility":"user-or-llm","description":"Affinity Filtering Language expression, e.g. \\"createdAt>=2026-01-01\\""},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_list_merge_tasks":{"id":"affinity_list_merge_tasks","name":"Affinity List Merge Tasks","description":"Page through merge tasks, each summarizing how many of its merges are in progress, succeeded, or failed.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"entityType":{"type":"string","required":true,"visibility":"user-or-llm","description":"Which merge tasks to list: companies or persons"},"filter":{"type":"string","required":false,"visibility":"user-or-llm","description":"Affinity Filtering Language expression. This endpoint filters on status only, e.g. \\"status=in-progress\\""},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_list_merges":{"id":"affinity_list_merges","name":"Affinity List Merges","description":"Page through the company or person merges the organization has run, with the status and the records involved in each.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"entityType":{"type":"string","required":true,"visibility":"user-or-llm","description":"Which merges to list: companies or persons"},"filter":{"type":"string","required":false,"visibility":"user-or-llm","description":"Affinity Filtering Language expression over status or taskId, e.g. \\"status=failed\\""},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_list_note_attached_companies":{"id":"affinity_list_note_attached_companies","name":"Affinity List Note Attached Companies","description":"List the companies directly attached to one note.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"noteId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The note ID"},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"},"totalCount":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Include the total size of the collection. Costs an extra query"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_list_note_attached_opportunities":{"id":"affinity_list_note_attached_opportunities","name":"Affinity List Note Attached Opportunities","description":"List the opportunities directly attached to one note.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"noteId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The note ID"},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"},"totalCount":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Include the total size of the collection. Costs an extra query"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_list_note_attached_persons":{"id":"affinity_list_note_attached_persons","name":"Affinity List Note Attached Persons","description":"List the persons directly attached to one note.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"noteId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The note ID"},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"},"totalCount":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Include the total size of the collection. Costs an extra query"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_list_note_replies":{"id":"affinity_list_note_replies","name":"Affinity List Note Replies","description":"Page through the replies on one note, including AI Notetaker replies.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"noteId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The note ID whose replies to read"},"filter":{"type":"string","required":false,"visibility":"user-or-llm","description":"Affinity Filtering Language expression, e.g. \\"createdAt>=2026-01-01\\""},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"},"totalCount":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Include the total size of the collection. Costs an extra query"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_list_notes":{"id":"affinity_list_notes","name":"Affinity List Notes","description":"Page through every note the caller can see. Replies are excluded.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"includes":{"type":"json","required":false,"visibility":"user-or-llm","description":"Extra properties to return, e.g. [\\"repliesCount\\",\\"personsPreview\\",\\"companiesPreview\\",\\"opportunitiesPreview\\"]. Those four fields are omitted unless requested here"},"filter":{"type":"string","required":false,"visibility":"user-or-llm","description":"Affinity Filtering Language expression, e.g. \\"createdAt>=2026-01-01\\""},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"},"totalCount":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Include the total size of the collection. Costs an extra query"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_list_opportunities":{"id":"affinity_list_opportunities","name":"Affinity List Opportunities","description":"Page through opportunities. Field data lives on the list entry, not here — read it through the list or saved view the opportunity belongs to.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"ids":{"type":"json","required":false,"visibility":"user-or-llm","description":"Restrict the page to these opportunity IDs, e.g. [1, 2, 3]"},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_list_persons":{"id":"affinity_list_persons","name":"Affinity List Persons","description":"Page through persons. Persons come back without field data unless Field IDs or Field Types asks for it.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"ids":{"type":"json","required":false,"visibility":"user-or-llm","description":"Restrict the page to these person IDs, e.g. [1, 2, 3]"},"fieldIds":{"type":"json","required":false,"visibility":"user-or-llm","description":"Field IDs to return values for, e.g. [\\"affinity-data-location\\"]. Mutually exclusive with Field Types"},"fieldTypes":{"type":"json","required":false,"visibility":"user-or-llm","description":"Field categories to return values for: enriched, global, or relationship-intelligence. Mutually exclusive with Field IDs"},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_list_reminders":{"id":"affinity_list_reminders","name":"Affinity List Reminders","description":"Page through the reminders the caller can see. Filter by status to surface what is overdue.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"filter":{"type":"string","required":false,"visibility":"user-or-llm","description":"Affinity Filtering Language expression, e.g. \\"createdAt>=2026-01-01\\""},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"},"totalCount":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Include the total size of the collection. Costs an extra query"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_list_saved_view_entries":{"id":"affinity_list_saved_view_entries","name":"Affinity List Saved View Entries","description":"Page through the rows of a saved view. The view\'s own filters and columns decide which rows and which field data come back.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"listId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The list ID"},"viewId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The saved view ID"},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_list_saved_views":{"id":"affinity_list_saved_views","name":"Affinity List Saved Views","description":"List the saved views on a list that the caller can view.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"listId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The list ID"},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_list_transcript_fragments":{"id":"affinity_list_transcript_fragments","name":"Affinity List Transcript Fragments","description":"Page through everything said in a meeting, segment by segment with the speaker.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"transcriptId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The transcript ID"},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"},"totalCount":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Include the total size of the collection. Costs an extra query"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_list_transcripts":{"id":"affinity_list_transcripts","name":"Affinity List Transcripts","description":"Page through meeting transcript metadata. Read one transcript to get what was actually said.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"filter":{"type":"string","required":false,"visibility":"user-or-llm","description":"Affinity Filtering Language expression, e.g. \\"createdAt>=2026-01-01\\""},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"},"totalCount":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Include the total size of the collection. Costs an extra query"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_list_users":{"id":"affinity_list_users","name":"Affinity List Users","description":"Page through the internal users in the organization. Email addresses and roles are returned only to callers with the \\"Manage Users\\" permission.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"term":{"type":"string","required":false,"visibility":"user-or-llm","description":"Case-insensitive match across first name, last name, and primary email"},"filter":{"type":"string","required":false,"visibility":"user-or-llm","description":"Affinity Filtering Language expression over id or status, e.g. \\"status=active\\""},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_search_companies":{"id":"affinity_search_companies","name":"Affinity Search Companies","description":"Search companies by filters, sorts, and a free-text term. Requires the \\"Export All Organizations directory\\" permission.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"filters":{"type":"json","required":false,"visibility":"user-or-llm","description":"Filter group as {operator: \\"and\\"|\\"or\\", filters: [...]}, at most 50 leaves. Each leaf is {valueType, fieldId, operator, value}, and a leaf may itself be a nested group"},"searchTerm":{"type":"string","required":false,"visibility":"user-or-llm","description":"Free-text term matched against the searchable fields. At least 3 characters"},"searchFieldIds":{"type":"json","required":false,"visibility":"user-or-llm","description":"Field IDs the search term is matched against. Defaults to the searchable fields"},"sorts":{"type":"json","required":false,"visibility":"user-or-llm","description":"Sort order as [{fieldId, direction: \\"asc\\"|\\"desc\\", attributeId?}], up to 5, applied in order"},"fieldIds":{"type":"json","required":false,"visibility":"user-or-llm","description":"Field IDs to return values for, e.g. [\\"affinity-data-location\\"]. Mutually exclusive with Field Types"},"fieldTypes":{"type":"json","required":false,"visibility":"user-or-llm","description":"Field categories to return values for: enriched, global, or relationship-intelligence. Mutually exclusive with Field IDs"},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"},"totalCount":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Include the total size of the collection. Costs an extra query"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_search_files":{"id":"affinity_search_files","name":"Affinity Search Files","description":"Search files by keyword, ordered by relevance. Narrow to specific files or to one company, or leave both unset to search the whole account.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"prompt":{"type":"string","required":true,"visibility":"user-or-llm","description":"What to search for. Between 3 and 500 characters"},"ids":{"type":"json","required":false,"visibility":"user-or-llm","description":"Restrict the search to these file IDs. Cannot be combined with Company ID"},"companyId":{"type":"string","required":false,"visibility":"user-or-llm","description":"Restrict the search to one company\'s files. Cannot be combined with file IDs"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of files to return, 1-100. Defaults to 20"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_search_list_entries":{"id":"affinity_search_list_entries","name":"Affinity Search List Entries","description":"Search the rows of one list by filters, sorts, and a free-text term. Requires the \\"Export data from Lists\\" permission.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"listId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The list ID to search"},"filters":{"type":"json","required":false,"visibility":"user-or-llm","description":"Filter group as {operator: \\"and\\"|\\"or\\", filters: [...]}, at most 50 leaves. Each leaf is {valueType, fieldId, operator, value}, and a leaf may itself be a nested group"},"searchTerm":{"type":"string","required":false,"visibility":"user-or-llm","description":"Free-text term matched against the searchable fields. At least 3 characters"},"searchFieldIds":{"type":"json","required":false,"visibility":"user-or-llm","description":"Field IDs the search term is matched against. Defaults to the searchable fields"},"sorts":{"type":"json","required":false,"visibility":"user-or-llm","description":"Sort order as [{fieldId, direction: \\"asc\\"|\\"desc\\", attributeId?}], up to 5, applied in order"},"fieldIds":{"type":"json","required":false,"visibility":"user-or-llm","description":"Field IDs to return values for, e.g. [\\"affinity-data-location\\"]. Mutually exclusive with Field Types"},"fieldTypes":{"type":"json","required":false,"visibility":"user-or-llm","description":"Field categories to return values for: enriched, global, list, or relationship-intelligence. Mutually exclusive with Field IDs"},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"},"totalCount":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Include the total size of the collection. Costs an extra query"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_search_notes":{"id":"affinity_search_notes","name":"Affinity Search Notes","description":"Search notes by keyword, ordered by relevance. Narrow to specific notes or to one company, or leave both unset to search the whole account.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"prompt":{"type":"string","required":true,"visibility":"user-or-llm","description":"What to search for. Between 3 and 500 characters"},"ids":{"type":"json","required":false,"visibility":"user-or-llm","description":"Restrict the search to these note IDs. Cannot be combined with Company ID"},"companyId":{"type":"string","required":false,"visibility":"user-or-llm","description":"Restrict the search to one company\'s notes. Cannot be combined with note IDs"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of notes to return, 1-100. Defaults to 20"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_search_persons":{"id":"affinity_search_persons","name":"Affinity Search Persons","description":"Search persons by filters, sorts, and a free-text term. Requires the \\"Export All People directory\\" permission.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"filters":{"type":"json","required":false,"visibility":"user-or-llm","description":"Filter group as {operator: \\"and\\"|\\"or\\", filters: [...]}, at most 50 leaves. Each leaf is {valueType, fieldId, operator, value}, and a leaf may itself be a nested group"},"searchTerm":{"type":"string","required":false,"visibility":"user-or-llm","description":"Free-text term matched against the searchable fields. At least 3 characters"},"searchFieldIds":{"type":"json","required":false,"visibility":"user-or-llm","description":"Field IDs the search term is matched against. Defaults to the searchable fields"},"sorts":{"type":"json","required":false,"visibility":"user-or-llm","description":"Sort order as [{fieldId, direction: \\"asc\\"|\\"desc\\", attributeId?}], up to 5, applied in order"},"fieldIds":{"type":"json","required":false,"visibility":"user-or-llm","description":"Field IDs to return values for, e.g. [\\"affinity-data-location\\"]. Mutually exclusive with Field Types"},"fieldTypes":{"type":"json","required":false,"visibility":"user-or-llm","description":"Field categories to return values for: enriched, global, or relationship-intelligence. Mutually exclusive with Field IDs"},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous page, returned as nextCursor or prevCursor"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to return per page, 1-100. Defaults to 100"},"totalCount":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Include the total size of the collection. Costs an extra query"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_semantic_search":{"id":"affinity_semantic_search","name":"Affinity Semantic Search","description":"Find companies from a description in plain language — industry, technology, stage, or business model. Currently searches companies only.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"prompt":{"type":"string","required":true,"visibility":"user-or-llm","description":"What to look for, in plain language, e.g. \\"climate tech companies in our pipeline\\". Up to 500 characters"},"listIds":{"type":"json","required":false,"visibility":"user-or-llm","description":"Restrict the search to companies on these lists, e.g. [1, 2]"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of companies to return, 1-100. Defaults to 100"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_update_entity_field_value":{"id":"affinity_update_entity_field_value","name":"Affinity Update Entity Field Value","description":"Write one non-list field value on a company or person. The value type must match how the field is defined.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"entityType":{"type":"string","required":true,"visibility":"user-or-llm","description":"Which entity to write the field on: companies or persons"},"entityId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of that company or person"},"fieldId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The field ID to write"},"value":{"type":"json","required":true,"visibility":"user-or-llm","description":"The new value as {type, data}, where type matches the field\'s value type. Examples: {\\"type\\":\\"text\\",\\"data\\":\\"Series B\\"}, {\\"type\\":\\"number\\",\\"data\\":42}, {\\"type\\":\\"dropdown\\",\\"data\\":{\\"dropdownOptionId\\":7}}, {\\"type\\":\\"person\\",\\"data\\":{\\"id\\":123}}, {\\"type\\":\\"person-multi\\",\\"data\\":[{\\"id\\":123}]}. Pass data as null to clear the field"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_update_list_entry_field":{"id":"affinity_update_list_entry_field","name":"Affinity Update List Entry Field","description":"Write one field value on a list row. Requires the \\"Export data from Lists\\" permission.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"listId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The list ID"},"listEntryId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The list entry ID"},"fieldId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The field ID to write"},"value":{"type":"json","required":true,"visibility":"user-or-llm","description":"The new value as {type, data}, where type matches the field\'s value type. Examples: {\\"type\\":\\"text\\",\\"data\\":\\"Series B\\"}, {\\"type\\":\\"number\\",\\"data\\":42}, {\\"type\\":\\"dropdown\\",\\"data\\":{\\"dropdownOptionId\\":7}}, {\\"type\\":\\"person\\",\\"data\\":{\\"id\\":123}}, {\\"type\\":\\"person-multi\\",\\"data\\":[{\\"id\\":123}]}. Pass data as null to clear the field"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_update_list_field_dropdown_option":{"id":"affinity_update_list_field_dropdown_option","name":"Affinity Update List Field Dropdown Option","description":"Change a dropdown option on a list field. Every field is optional — supply only what should change, and only fields the option\'s kind actually has.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"listId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The list ID"},"fieldId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The dropdown field ID on that list"},"dropdownOptionId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The dropdown option ID to update"},"text":{"type":"string","required":false,"visibility":"user-or-llm","description":"Replacement option label. Supply at least one field to change"},"rank":{"type":"number","required":false,"visibility":"user-or-llm","description":"Sort order. Required on a ranked-dropdown or status-dropdown option"},"color":{"type":"string","required":false,"visibility":"user-or-llm","description":"Option color: white, gray, blue, green, purple, orange, or red. Required on a ranked-dropdown or status-dropdown option"},"statusCategory":{"type":"string","required":false,"visibility":"user-or-llm","description":"Pipeline meaning of the option: open, won, lost, or on-hold. Status-dropdown options only"},"winRate":{"type":"number","required":false,"visibility":"user-or-llm","description":"Expected win rate of the status. Status-dropdown options only"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"affinity_update_note":{"id":"affinity_update_note","name":"Affinity Update Note","description":"Rewrite a note\'s body or replace which records it is attached to. Each list of IDs replaces that association wholesale, an empty list clears it, and omitting one leaves it untouched. A note\'s type cannot be changed.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Affinity API key, sent as a bearer token"},"noteId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The note ID to update"},"html":{"type":"string","required":false,"visibility":"user-or-llm","description":"Replacement note body as HTML"},"companyIds":{"type":"json","required":false,"visibility":"user-or-llm","description":"Replacement set of attached companies, e.g. [1, 2]. Send [] to detach every company; omit to leave them unchanged"},"personIds":{"type":"json","required":false,"visibility":"user-or-llm","description":"Replacement set of attached persons, e.g. [1, 2]. Send [] to detach every person; omit to leave them unchanged"},"opportunityIds":{"type":"json","required":false,"visibility":"user-or-llm","description":"Replacement set of attached opportunities, e.g. [1, 2]. Send [] to detach every opportunity; omit to leave them unchanged"}},"oauth":{"required":false,"provider":"affinity","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"agentmail_create_draft":{"id":"agentmail_create_draft","name":"Create Draft","description":"Create a new email draft in AgentMail","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentMail API key"},"inboxId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the inbox to create the draft in"},"to":{"type":"string","required":false,"visibility":"user-or-llm","description":"Recipient email addresses (comma-separated)"},"subject":{"type":"string","required":false,"visibility":"user-or-llm","description":"Draft subject line"},"text":{"type":"string","required":false,"visibility":"user-or-llm","description":"Plain text draft body"},"html":{"type":"string","required":false,"visibility":"user-or-llm","description":"HTML draft body"},"cc":{"type":"string","required":false,"visibility":"user-or-llm","description":"CC recipient email addresses (comma-separated)"},"bcc":{"type":"string","required":false,"visibility":"user-or-llm","description":"BCC recipient email addresses (comma-separated)"},"inReplyTo":{"type":"string","required":false,"visibility":"user-or-llm","description":"ID of message being replied to"},"sendAt":{"type":"string","required":false,"visibility":"user-or-llm","description":"ISO 8601 timestamp to schedule sending"}},"oauth":{"required":false,"provider":"agentmail","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"agentmail_create_inbox":{"id":"agentmail_create_inbox","name":"Create Inbox","description":"Create a new email inbox with AgentMail","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentMail API key"},"username":{"type":"string","required":false,"visibility":"user-or-llm","description":"Username for the inbox email address"},"domain":{"type":"string","required":false,"visibility":"user-or-llm","description":"Domain for the inbox email address"},"displayName":{"type":"string","required":false,"visibility":"user-or-llm","description":"Display name for the inbox"}},"oauth":{"required":false,"provider":"agentmail","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"agentmail_delete_draft":{"id":"agentmail_delete_draft","name":"Delete Draft","description":"Delete an email draft in AgentMail","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentMail API key"},"inboxId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the inbox containing the draft"},"draftId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the draft to delete"}},"oauth":{"required":false,"provider":"agentmail","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"agentmail_delete_inbox":{"id":"agentmail_delete_inbox","name":"Delete Inbox","description":"Delete an email inbox in AgentMail","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentMail API key"},"inboxId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the inbox to delete"}},"oauth":{"required":false,"provider":"agentmail","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"agentmail_delete_thread":{"id":"agentmail_delete_thread","name":"Delete Thread","description":"Delete an email thread in AgentMail (moves to trash, or permanently deletes if already in trash)","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentMail API key"},"inboxId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the inbox containing the thread"},"threadId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the thread to delete"},"permanent":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Force permanent deletion instead of moving to trash"}},"oauth":{"required":false,"provider":"agentmail","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"agentmail_forward_message":{"id":"agentmail_forward_message","name":"Forward Message","description":"Forward an email message to new recipients in AgentMail","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentMail API key"},"inboxId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the inbox containing the message"},"messageId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the message to forward"},"to":{"type":"string","required":true,"visibility":"user-or-llm","description":"Recipient email addresses (comma-separated)"},"subject":{"type":"string","required":false,"visibility":"user-or-llm","description":"Override subject line"},"text":{"type":"string","required":false,"visibility":"user-or-llm","description":"Additional plain text to prepend"},"html":{"type":"string","required":false,"visibility":"user-or-llm","description":"Additional HTML to prepend"},"cc":{"type":"string","required":false,"visibility":"user-or-llm","description":"CC recipient email addresses (comma-separated)"},"bcc":{"type":"string","required":false,"visibility":"user-or-llm","description":"BCC recipient email addresses (comma-separated)"}},"oauth":{"required":false,"provider":"agentmail","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"agentmail_get_draft":{"id":"agentmail_get_draft","name":"Get Draft","description":"Get details of a specific email draft in AgentMail","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentMail API key"},"inboxId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the inbox the draft belongs to"},"draftId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the draft to retrieve"}},"oauth":{"required":false,"provider":"agentmail","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"agentmail_get_inbox":{"id":"agentmail_get_inbox","name":"Get Inbox","description":"Get details of a specific email inbox in AgentMail","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentMail API key"},"inboxId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the inbox to retrieve"}},"oauth":{"required":false,"provider":"agentmail","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"agentmail_get_message":{"id":"agentmail_get_message","name":"Get Message","description":"Get details of a specific email message in AgentMail","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentMail API key"},"inboxId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the inbox containing the message"},"messageId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the message to retrieve"}},"oauth":{"required":false,"provider":"agentmail","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"agentmail_get_thread":{"id":"agentmail_get_thread","name":"Get Thread","description":"Get details of a specific email thread including messages in AgentMail","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentMail API key"},"inboxId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the inbox containing the thread"},"threadId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the thread to retrieve"}},"oauth":{"required":false,"provider":"agentmail","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"agentmail_list_drafts":{"id":"agentmail_list_drafts","name":"List Drafts","description":"List email drafts in an inbox in AgentMail","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentMail API key"},"inboxId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the inbox to list drafts from"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of drafts to return"},"pageToken":{"type":"string","required":false,"visibility":"user-or-llm","description":"Pagination token for next page of results"}},"oauth":{"required":false,"provider":"agentmail","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"agentmail_list_inboxes":{"id":"agentmail_list_inboxes","name":"List Inboxes","description":"List all email inboxes in AgentMail","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentMail API key"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of inboxes to return"},"pageToken":{"type":"string","required":false,"visibility":"user-or-llm","description":"Pagination token for next page of results"}},"oauth":{"required":false,"provider":"agentmail","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"agentmail_list_messages":{"id":"agentmail_list_messages","name":"List Messages","description":"List messages in an inbox in AgentMail","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentMail API key"},"inboxId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the inbox to list messages from"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of messages to return"},"pageToken":{"type":"string","required":false,"visibility":"user-or-llm","description":"Pagination token for next page of results"}},"oauth":{"required":false,"provider":"agentmail","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"agentmail_list_threads":{"id":"agentmail_list_threads","name":"List Threads","description":"List email threads in AgentMail","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentMail API key"},"inboxId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the inbox to list threads from"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of threads to return"},"pageToken":{"type":"string","required":false,"visibility":"user-or-llm","description":"Pagination token for next page of results"},"labels":{"type":"string","required":false,"visibility":"user-or-llm","description":"Comma-separated labels to filter threads by"},"before":{"type":"string","required":false,"visibility":"user-or-llm","description":"Filter threads before this ISO 8601 timestamp"},"after":{"type":"string","required":false,"visibility":"user-or-llm","description":"Filter threads after this ISO 8601 timestamp"}},"oauth":{"required":false,"provider":"agentmail","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"agentmail_reply_message":{"id":"agentmail_reply_message","name":"Reply to Message","description":"Reply to an existing email message in AgentMail","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentMail API key"},"inboxId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the inbox to reply from"},"messageId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the message to reply to"},"text":{"type":"string","required":false,"visibility":"user-or-llm","description":"Plain text reply body"},"html":{"type":"string","required":false,"visibility":"user-or-llm","description":"HTML reply body"},"to":{"type":"string","required":false,"visibility":"user-or-llm","description":"Override recipient email addresses (comma-separated)"},"cc":{"type":"string","required":false,"visibility":"user-or-llm","description":"CC email addresses (comma-separated)"},"bcc":{"type":"string","required":false,"visibility":"user-or-llm","description":"BCC email addresses (comma-separated)"},"replyAll":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Reply to all recipients of the original message"}},"oauth":{"required":false,"provider":"agentmail","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"agentmail_send_draft":{"id":"agentmail_send_draft","name":"Send Draft","description":"Send an existing email draft in AgentMail","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentMail API key"},"inboxId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the inbox containing the draft"},"draftId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the draft to send"}},"oauth":{"required":false,"provider":"agentmail","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"agentmail_send_message":{"id":"agentmail_send_message","name":"Send Message","description":"Send an email message from an AgentMail inbox","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentMail API key"},"inboxId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the inbox to send from"},"to":{"type":"string","required":true,"visibility":"user-or-llm","description":"Recipient email address (comma-separated for multiple)"},"subject":{"type":"string","required":true,"visibility":"user-or-llm","description":"Email subject line"},"text":{"type":"string","required":false,"visibility":"user-or-llm","description":"Plain text email body"},"html":{"type":"string","required":false,"visibility":"user-or-llm","description":"HTML email body"},"cc":{"type":"string","required":false,"visibility":"user-or-llm","description":"CC recipient email addresses (comma-separated)"},"bcc":{"type":"string","required":false,"visibility":"user-or-llm","description":"BCC recipient email addresses (comma-separated)"}},"oauth":{"required":false,"provider":"agentmail","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"agentmail_update_draft":{"id":"agentmail_update_draft","name":"Update Draft","description":"Update an existing email draft in AgentMail","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentMail API key"},"inboxId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the inbox containing the draft"},"draftId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the draft to update"},"to":{"type":"string","required":false,"visibility":"user-or-llm","description":"Recipient email addresses (comma-separated)"},"subject":{"type":"string","required":false,"visibility":"user-or-llm","description":"Draft subject line"},"text":{"type":"string","required":false,"visibility":"user-or-llm","description":"Plain text draft body"},"html":{"type":"string","required":false,"visibility":"user-or-llm","description":"HTML draft body"},"cc":{"type":"string","required":false,"visibility":"user-or-llm","description":"CC recipient email addresses (comma-separated)"},"bcc":{"type":"string","required":false,"visibility":"user-or-llm","description":"BCC recipient email addresses (comma-separated)"},"sendAt":{"type":"string","required":false,"visibility":"user-or-llm","description":"ISO 8601 timestamp to schedule sending"}},"oauth":{"required":false,"provider":"agentmail","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"agentmail_update_inbox":{"id":"agentmail_update_inbox","name":"Update Inbox","description":"Update the display name of an email inbox in AgentMail","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentMail API key"},"inboxId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the inbox to update"},"displayName":{"type":"string","required":true,"visibility":"user-or-llm","description":"New display name for the inbox"}},"oauth":{"required":false,"provider":"agentmail","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"agentmail_update_message":{"id":"agentmail_update_message","name":"Update Message","description":"Add or remove labels on an email message in AgentMail","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentMail API key"},"inboxId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the inbox containing the message"},"messageId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the message to update"},"addLabels":{"type":"string","required":false,"visibility":"user-or-llm","description":"Comma-separated labels to add to the message"},"removeLabels":{"type":"string","required":false,"visibility":"user-or-llm","description":"Comma-separated labels to remove from the message"}},"oauth":{"required":false,"provider":"agentmail","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"agentmail_update_thread":{"id":"agentmail_update_thread","name":"Update Thread Labels","description":"Add or remove labels on an email thread in AgentMail","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentMail API key"},"inboxId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the inbox containing the thread"},"threadId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the thread to update"},"addLabels":{"type":"string","required":false,"visibility":"user-or-llm","description":"Comma-separated labels to add to the thread"},"removeLabels":{"type":"string","required":false,"visibility":"user-or-llm","description":"Comma-separated labels to remove from the thread"}},"oauth":{"required":false,"provider":"agentmail","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"agentphone_create_call":{"id":"agentphone_create_call","name":"Create Outbound Call","description":"Initiate an outbound voice call from an AgentPhone agent","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentPhone API key"},"agentId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Agent that will handle the call"},"toNumber":{"type":"string","required":true,"visibility":"user-or-llm","description":"Phone number to call in E.164 format (e.g. +14155551234)"},"fromNumberId":{"type":"string","required":false,"visibility":"user-or-llm","description":"Phone number ID to use as caller ID. Must belong to the agent. If omitted, the agent\'s first assigned number is used."},"initialGreeting":{"type":"string","required":false,"visibility":"user-or-llm","description":"Optional greeting spoken when the recipient answers"},"voice":{"type":"string","required":false,"visibility":"user-or-llm","description":"Voice ID override for this call (defaults to the agent\'s configured voice)"},"systemPrompt":{"type":"string","required":false,"visibility":"user-or-llm","description":"When provided, uses a built-in LLM for the conversation instead of forwarding to your webhook"}},"oauth":{"required":false,"provider":"agentphone","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"agentphone_create_contact":{"id":"agentphone_create_contact","name":"Create Contact","description":"Create a new contact in AgentPhone","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentPhone API key"},"phoneNumber":{"type":"string","required":true,"visibility":"user-or-llm","description":"Phone number in E.164 format (e.g. +14155551234)"},"name":{"type":"string","required":true,"visibility":"user-or-llm","description":"Contact\'s full name"},"email":{"type":"string","required":false,"visibility":"user-or-llm","description":"Contact\'s email address"},"notes":{"type":"string","required":false,"visibility":"user-or-llm","description":"Freeform notes stored on the contact"}},"oauth":{"required":false,"provider":"agentphone","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"agentphone_create_number":{"id":"agentphone_create_number","name":"Create Phone Number","description":"Provision a new SMS- and voice-enabled phone number","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentPhone API key"},"country":{"type":"string","required":false,"visibility":"user-or-llm","description":"Two-letter country code (e.g. US, CA). Defaults to US."},"areaCode":{"type":"string","required":false,"visibility":"user-or-llm","description":"Preferred area code (US/CA only, e.g. \\"415\\"). Best-effort — may be ignored if unavailable."},"agentId":{"type":"string","required":false,"visibility":"user-or-llm","description":"Optionally attach the number to an agent immediately"}},"oauth":{"required":false,"provider":"agentphone","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"agentphone_delete_contact":{"id":"agentphone_delete_contact","name":"Delete Contact","description":"Delete a contact by ID","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentPhone API key"},"contactId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Contact ID"}},"oauth":{"required":false,"provider":"agentphone","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"agentphone_get_call":{"id":"agentphone_get_call","name":"Get Call","description":"Fetch a call and its full transcript","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentPhone API key"},"callId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the call to retrieve"}},"oauth":{"required":false,"provider":"agentphone","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"agentphone_get_call_transcript":{"id":"agentphone_get_call_transcript","name":"Get Call Transcript","description":"Get the full ordered transcript for a call","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentPhone API key"},"callId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the call to retrieve the transcript for"}},"oauth":{"required":false,"provider":"agentphone","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"agentphone_get_contact":{"id":"agentphone_get_contact","name":"Get Contact","description":"Fetch a single contact by ID","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentPhone API key"},"contactId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Contact ID"}},"oauth":{"required":false,"provider":"agentphone","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"agentphone_get_conversation":{"id":"agentphone_get_conversation","name":"Get Conversation","description":"Get a conversation along with its recent messages","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentPhone API key"},"conversationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Conversation ID"},"messageLimit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of recent messages to include (default 50, max 100)"}},"oauth":{"required":false,"provider":"agentphone","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"agentphone_get_conversation_messages":{"id":"agentphone_get_conversation_messages","name":"Get Conversation Messages","description":"Get paginated messages for a conversation","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentPhone API key"},"conversationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Conversation ID"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of messages to return (default 50, max 200)"},"before":{"type":"string","required":false,"visibility":"user-or-llm","description":"Return messages received before this ISO 8601 timestamp"},"after":{"type":"string","required":false,"visibility":"user-or-llm","description":"Return messages received after this ISO 8601 timestamp"}},"oauth":{"required":false,"provider":"agentphone","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"agentphone_get_number_messages":{"id":"agentphone_get_number_messages","name":"Get Phone Number Messages","description":"Fetch messages received on a specific phone number","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentPhone API key"},"numberId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the phone number"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of messages to return (default 50, max 200)"},"before":{"type":"string","required":false,"visibility":"user-or-llm","description":"Return messages received before this ISO 8601 timestamp"},"after":{"type":"string","required":false,"visibility":"user-or-llm","description":"Return messages received after this ISO 8601 timestamp"}},"oauth":{"required":false,"provider":"agentphone","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"agentphone_get_usage":{"id":"agentphone_get_usage","name":"Get Usage","description":"Retrieve current usage statistics for the AgentPhone account","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentPhone API key"}},"oauth":{"required":false,"provider":"agentphone","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"agentphone_get_usage_daily":{"id":"agentphone_get_usage_daily","name":"Get Daily Usage","description":"Get a daily breakdown of usage (messages, calls, webhooks) for the last N days","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentPhone API key"},"days":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of days to return (1-365, default 30)"}},"oauth":{"required":false,"provider":"agentphone","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"agentphone_get_usage_monthly":{"id":"agentphone_get_usage_monthly","name":"Get Monthly Usage","description":"Get monthly usage aggregation (messages, calls, webhooks) for the last N months","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentPhone API key"},"months":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of months to return (1-24, default 6)"}},"oauth":{"required":false,"provider":"agentphone","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"agentphone_list_calls":{"id":"agentphone_list_calls","name":"List Calls","description":"List voice calls for this AgentPhone account","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentPhone API key"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of results to return (default 20, max 100)"},"offset":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of results to skip (min 0)"},"status":{"type":"string","required":false,"visibility":"user-or-llm","description":"Filter by status (completed, in-progress, failed)"},"direction":{"type":"string","required":false,"visibility":"user-or-llm","description":"Filter by direction (inbound, outbound)"},"type":{"type":"string","required":false,"visibility":"user-or-llm","description":"Filter by call type (pstn, web)"},"search":{"type":"string","required":false,"visibility":"user-or-llm","description":"Search by phone number (matches fromNumber or toNumber)"}},"oauth":{"required":false,"provider":"agentphone","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"agentphone_list_contacts":{"id":"agentphone_list_contacts","name":"List Contacts","description":"List contacts for this AgentPhone account","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentPhone API key"},"search":{"type":"string","required":false,"visibility":"user-or-llm","description":"Filter by name or phone number (case-insensitive contains)"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of results to return (default 50, max 200)"},"offset":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of results to skip (min 0)"}},"oauth":{"required":false,"provider":"agentphone","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"agentphone_list_conversations":{"id":"agentphone_list_conversations","name":"List Conversations","description":"List conversations (message threads) for this AgentPhone account","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentPhone API key"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of results to return (default 20, max 100)"},"offset":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of results to skip (min 0)"}},"oauth":{"required":false,"provider":"agentphone","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"agentphone_list_numbers":{"id":"agentphone_list_numbers","name":"List Phone Numbers","description":"List all phone numbers provisioned for this AgentPhone account","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentPhone API key"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of results to return (default 20, max 100)"},"offset":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of results to skip (min 0)"}},"oauth":{"required":false,"provider":"agentphone","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"agentphone_react_to_message":{"id":"agentphone_react_to_message","name":"React to Message","description":"Send an iMessage tapback reaction to a message (iMessage only)","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentPhone API key"},"messageId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the message to react to"},"reaction":{"type":"string","required":true,"visibility":"user-or-llm","description":"Reaction type: love, like, dislike, laugh, emphasize, or question"}},"oauth":{"required":false,"provider":"agentphone","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"agentphone_release_number":{"id":"agentphone_release_number","name":"Release Phone Number","description":"Release (delete) a phone number. This action is irreversible.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentPhone API key"},"numberId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the phone number to release"}},"oauth":{"required":false,"provider":"agentphone","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"agentphone_send_message":{"id":"agentphone_send_message","name":"Send Message","description":"Send an outbound SMS or iMessage from an AgentPhone agent","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentPhone API key"},"agentId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Agent sending the message"},"toNumber":{"type":"string","required":true,"visibility":"user-or-llm","description":"Recipient phone number in E.164 format (e.g. +14155551234)"},"body":{"type":"string","required":true,"visibility":"user-or-llm","description":"Message text to send"},"mediaUrl":{"type":"string","required":false,"visibility":"user-or-llm","description":"Optional URL of an image, video, or file to attach"},"numberId":{"type":"string","required":false,"visibility":"user-or-llm","description":"Phone number ID to send from. If omitted, the agent\'s first assigned number is used."}},"oauth":{"required":false,"provider":"agentphone","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"agentphone_update_contact":{"id":"agentphone_update_contact","name":"Update Contact","description":"Update a contact\'s fields","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentPhone API key"},"contactId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Contact ID"},"phoneNumber":{"type":"string","required":false,"visibility":"user-or-llm","description":"New phone number in E.164 format"},"name":{"type":"string","required":false,"visibility":"user-or-llm","description":"New contact name"},"email":{"type":"string","required":false,"visibility":"user-or-llm","description":"New email address"},"notes":{"type":"string","required":false,"visibility":"user-or-llm","description":"New freeform notes"}},"oauth":{"required":false,"provider":"agentphone","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"agentphone_update_conversation":{"id":"agentphone_update_conversation","name":"Update Conversation","description":"Update conversation metadata (stored state). Pass null to clear existing metadata.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"AgentPhone API key"},"conversationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Conversation ID"},"metadata":{"type":"json","required":false,"visibility":"user-or-llm","description":"Custom key-value metadata to store on the conversation. Pass null to clear existing metadata."}},"oauth":{"required":false,"provider":"agentphone","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"agiloft_async_status":{"id":"agiloft_async_status","name":"Agiloft Async Status","description":"Check whether an asynchronous Agiloft call, such as a run action button, has completed.","version":"1.0.0","params":{"instanceUrl":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft instance URL (e.g., https://mycompany.agiloft.com)"},"knowledgeBase":{"type":"string","required":true,"visibility":"user-only","description":"Knowledge base name"},"login":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft username"},"password":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft password"},"table":{"type":"string","required":true,"visibility":"user-or-llm","description":"Table the asynchronous call was made against"},"callbackId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Callback ID returned by the asynchronous call, e.g. from Run Action Button"}},"hostedApiKey":"none"},"agiloft_attach_file":{"id":"agiloft_attach_file","name":"Agiloft Attach File","description":"Attach a file to a field in an Agiloft record.","version":"1.0.0","params":{"instanceUrl":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft instance URL (e.g., https://mycompany.agiloft.com)"},"knowledgeBase":{"type":"string","required":true,"visibility":"user-only","description":"Knowledge base name"},"login":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft username"},"password":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft password"},"table":{"type":"string","required":true,"visibility":"user-or-llm","description":"Table name (e.g., \\"contracts\\")"},"recordId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the record to attach the file to"},"fieldName":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the attachment field"},"file":{"type":"file","required":true,"visibility":"user-or-llm","description":"File to attach"},"fileName":{"type":"string","required":false,"visibility":"user-or-llm","description":"Name to assign to the file (defaults to original file name)"},"overwrite":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Replace the contents of the field instead of adding another file to it"}},"hostedApiKey":"none"},"agiloft_attachment_info":{"id":"agiloft_attachment_info","name":"Agiloft Attachment Info","description":"Get information about file attachments on a record field.","version":"1.0.0","params":{"instanceUrl":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft instance URL (e.g., https://mycompany.agiloft.com)"},"knowledgeBase":{"type":"string","required":true,"visibility":"user-only","description":"Knowledge base name"},"login":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft username"},"password":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft password"},"table":{"type":"string","required":true,"visibility":"user-or-llm","description":"Table name (e.g., \\"contracts\\")"},"recordId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the record to check attachments on"},"fieldName":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the attachment field to inspect"}},"hostedApiKey":"none"},"agiloft_create_record":{"id":"agiloft_create_record","name":"Agiloft Create Record","description":"Create a new record in an Agiloft table.","version":"1.0.0","params":{"instanceUrl":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft instance URL (e.g., https://mycompany.agiloft.com)"},"knowledgeBase":{"type":"string","required":true,"visibility":"user-only","description":"Knowledge base name"},"login":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft username"},"password":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft password"},"table":{"type":"string","required":true,"visibility":"user-or-llm","description":"Table name (e.g., \\"contracts\\", \\"contacts.employees\\")"},"data":{"type":"string","required":true,"visibility":"user-or-llm","description":"Record field values as a JSON object (e.g., {\\"first_name\\": \\"John\\", \\"status\\": \\"Active\\"})"}},"hostedApiKey":"none"},"agiloft_delete_record":{"id":"agiloft_delete_record","name":"Agiloft Delete Record","description":"Delete a record from an Agiloft table.","version":"1.0.0","params":{"instanceUrl":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft instance URL (e.g., https://mycompany.agiloft.com)"},"knowledgeBase":{"type":"string","required":true,"visibility":"user-only","description":"Knowledge base name"},"login":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft username"},"password":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft password"},"table":{"type":"string","required":true,"visibility":"user-or-llm","description":"Table name (e.g., \\"contracts\\", \\"contacts.employees\\")"},"recordId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the record to delete"},"substituteIds":{"type":"string","required":false,"visibility":"user-or-llm","description":"Comma-separated IDs of records that adopt the dependants of the deleted record. Read only when the delete rule is REPLACE_WITH_ANOTHER."},"deleteRule":{"type":"string","required":false,"visibility":"user-or-llm","description":"How to treat records that depend on this one: ERROR_IF_DEPENDANTS (default — fails rather than cascading), APPLY_DELETE_WHERE_POSSIBLE, DELETE_WHERE_POSSIBLE_OTHERWISE_UNLINK, APPLY_UNLINK, UNLINK_WHERE_POSSIBLE_OTHERWISE_DELETE, or REPLACE_WITH_ANOTHER"}},"hostedApiKey":"none"},"agiloft_get_choice_line_id":{"id":"agiloft_get_choice_line_id","name":"Agiloft Get Choice Line ID","description":"Resolve the internal numeric ID of a choice-list value, for use in EWSelect WHERE clauses against choice fields.","version":"1.0.0","params":{"instanceUrl":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft instance URL (e.g., https://mycompany.agiloft.com)"},"knowledgeBase":{"type":"string","required":true,"visibility":"user-only","description":"Knowledge base name"},"login":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft username"},"password":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft password"},"table":{"type":"string","required":true,"visibility":"user-or-llm","description":"Table name (e.g., \\"case\\", \\"contracts\\")"},"fieldName":{"type":"string","required":true,"visibility":"user-or-llm","description":"Choice field name (e.g., \\"priority\\", \\"status\\")"},"value":{"type":"string","required":true,"visibility":"user-or-llm","description":"Choice display value to resolve (e.g., \\"High\\", \\"Active\\")"}},"hostedApiKey":"none"},"agiloft_list_tables":{"id":"agiloft_list_tables","name":"Agiloft List Tables","description":"List the tables and fields in an Agiloft knowledge base, to discover the logical names other operations need.","version":"1.0.0","params":{"instanceUrl":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft instance URL (e.g., https://mycompany.agiloft.com)"},"knowledgeBase":{"type":"string","required":true,"visibility":"user-only","description":"Knowledge base name"},"login":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft username"},"password":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft password"},"table":{"type":"string","required":false,"visibility":"user-or-llm","description":"Logical name of a single table to describe (e.g., \\"contacts\\"). Leave empty to list every table in the knowledge base."},"includeLinkedInfo":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Include the source table and column behind each linked field"},"skipColumnsInfo":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Return table names only, omitting field details, for a much smaller response"}},"hostedApiKey":"none"},"agiloft_lock_record":{"id":"agiloft_lock_record","name":"Agiloft Lock Record","description":"Lock, unlock, or check the lock status of an Agiloft record.","version":"1.0.0","params":{"instanceUrl":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft instance URL (e.g., https://mycompany.agiloft.com)"},"knowledgeBase":{"type":"string","required":true,"visibility":"user-only","description":"Knowledge base name"},"login":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft username"},"password":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft password"},"table":{"type":"string","required":true,"visibility":"user-or-llm","description":"Table name (e.g., \\"contracts\\")"},"recordId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the record to lock, unlock, or check"},"lockAction":{"type":"string","required":true,"visibility":"user-or-llm","description":"Action to perform: \\"lock\\", \\"unlock\\", or \\"check\\""},"force":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Unlock only: release a lock held by another user."}},"hostedApiKey":"none"},"agiloft_nlp_search":{"id":"agiloft_nlp_search","name":"Agiloft Natural Language Search","description":"Search Agiloft records by describing what you want in plain language, such as \\"active NDAs submitted last month\\".","version":"1.0.0","params":{"instanceUrl":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft instance URL (e.g., https://mycompany.agiloft.com)"},"knowledgeBase":{"type":"string","required":true,"visibility":"user-only","description":"Knowledge base name"},"login":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft username"},"password":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft password"},"nlpQuery":{"type":"string","required":true,"visibility":"user-or-llm","description":"The request in plain language, e.g. \\"Show me open, high-priority contracts\\". Structured field filters are not accepted — use Search Records for those."},"fields":{"type":"string","required":true,"visibility":"user-or-llm","description":"Comma-separated field names to return, e.g. \\"id, contract_title1, company_name\\""},"page":{"type":"string","required":false,"visibility":"user-or-llm","description":"Page number, starting from 0"},"limit":{"type":"string","required":false,"visibility":"user-or-llm","description":"Records per page"}},"hostedApiKey":"none"},"agiloft_read_record":{"id":"agiloft_read_record","name":"Agiloft Read Record","description":"Read a record by ID from an Agiloft table.","version":"1.0.0","params":{"instanceUrl":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft instance URL (e.g., https://mycompany.agiloft.com)"},"knowledgeBase":{"type":"string","required":true,"visibility":"user-only","description":"Knowledge base name"},"login":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft username"},"password":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft password"},"table":{"type":"string","required":true,"visibility":"user-or-llm","description":"Table name (e.g., \\"contracts\\", \\"contacts.employees\\")"},"recordId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the record to read"},"fields":{"type":"string","required":false,"visibility":"user-or-llm","description":"Comma-separated list of field names to include in the response"}},"hostedApiKey":"none"},"agiloft_remove_attachment":{"id":"agiloft_remove_attachment","name":"Agiloft Remove Attachment","description":"Remove an attached file from a field in an Agiloft record.","version":"1.0.0","params":{"instanceUrl":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft instance URL (e.g., https://mycompany.agiloft.com)"},"knowledgeBase":{"type":"string","required":true,"visibility":"user-only","description":"Knowledge base name"},"login":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft username"},"password":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft password"},"table":{"type":"string","required":true,"visibility":"user-or-llm","description":"Table name (e.g., \\"contracts\\")"},"recordId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the record containing the attachment"},"fieldName":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the attachment field"},"position":{"type":"string","required":true,"visibility":"user-or-llm","description":"Position index of the file to remove (starting from 0)"}},"hostedApiKey":"none"},"agiloft_retrieve_attachment":{"id":"agiloft_retrieve_attachment","name":"Agiloft Retrieve Attachment","description":"Download an attached file from an Agiloft record field.","version":"1.0.0","params":{"instanceUrl":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft instance URL (e.g., https://mycompany.agiloft.com)"},"knowledgeBase":{"type":"string","required":true,"visibility":"user-only","description":"Knowledge base name"},"login":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft username"},"password":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft password"},"table":{"type":"string","required":true,"visibility":"user-or-llm","description":"Table name (e.g., \\"contracts\\")"},"recordId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the record containing the attachment"},"fieldName":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the attachment field"},"position":{"type":"string","required":true,"visibility":"user-or-llm","description":"Position index of the file in the field (starting from 0)"}},"hostedApiKey":"none"},"agiloft_run_action_button":{"id":"agiloft_run_action_button","name":"Agiloft Run Action Button","description":"Run an action button on an Agiloft record, such as an approval or send-for-signature step.","version":"1.0.0","params":{"instanceUrl":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft instance URL (e.g., https://mycompany.agiloft.com)"},"knowledgeBase":{"type":"string","required":true,"visibility":"user-only","description":"Knowledge base name"},"login":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft username"},"password":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft password"},"table":{"type":"string","required":true,"visibility":"user-or-llm","description":"Table name (e.g., \\"contracts\\", \\"case\\")"},"recordId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the record to run the action button on"},"actionButtonField":{"type":"string","required":true,"visibility":"user-or-llm","description":"Logical name of the field holding the action button (e.g., \\"ab_field\\")"}},"hostedApiKey":"none"},"agiloft_saved_search":{"id":"agiloft_saved_search","name":"Agiloft Saved Search","description":"List the saved searches defined for an Agiloft table.","version":"1.0.0","params":{"instanceUrl":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft instance URL (e.g., https://mycompany.agiloft.com)"},"knowledgeBase":{"type":"string","required":true,"visibility":"user-only","description":"Knowledge base name"},"login":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft username"},"password":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft password"},"table":{"type":"string","required":true,"visibility":"user-or-llm","description":"Logical table name to list saved searches for (e.g., \\"contract\\")"}},"hostedApiKey":"none"},"agiloft_search_records":{"id":"agiloft_search_records","name":"Agiloft Search Records","description":"Search for records in an Agiloft table using a query.","version":"1.0.0","params":{"instanceUrl":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft instance URL (e.g., https://mycompany.agiloft.com)"},"knowledgeBase":{"type":"string","required":true,"visibility":"user-only","description":"Knowledge base name"},"login":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft username"},"password":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft password"},"table":{"type":"string","required":true,"visibility":"user-or-llm","description":"Table name to search in (e.g., \\"contracts\\", \\"contacts.employees\\")"},"query":{"type":"string","required":false,"visibility":"user-or-llm","description":"Ad hoc EWSearch query. Combine conditions with && (and) or || (or) and quote every value — e.g. \\"summary~=\'test\'&&priority=\'High\'\\". Required unless a saved search is given."},"search":{"type":"string","required":false,"visibility":"user-or-llm","description":"Label of a saved search defined on the table (e.g., \\"C: Status is Closed\\"). Can be combined with a query to narrow it further."},"fields":{"type":"string","required":false,"visibility":"user-or-llm","description":"Comma-separated list of field names to include in the results"},"page":{"type":"string","required":false,"visibility":"user-or-llm","description":"Page number for paginated results (starting from 0)"},"limit":{"type":"string","required":false,"visibility":"user-or-llm","description":"Maximum number of records to return per page. Agiloft treats 0 as \\"all records\\", so leave it unset or use a positive value to keep result sizes bounded."}},"hostedApiKey":"none"},"agiloft_select_records":{"id":"agiloft_select_records","name":"Agiloft Select Records","description":"Select record IDs matching a SQL WHERE clause from an Agiloft table.","version":"1.0.0","params":{"instanceUrl":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft instance URL (e.g., https://mycompany.agiloft.com)"},"knowledgeBase":{"type":"string","required":true,"visibility":"user-only","description":"Knowledge base name"},"login":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft username"},"password":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft password"},"table":{"type":"string","required":true,"visibility":"user-or-llm","description":"Table name (e.g., \\"contracts\\", \\"contacts.employees\\")"},"where":{"type":"string","required":true,"visibility":"user-or-llm","description":"SQL WHERE clause using database column names (e.g., \\"summary like \'%new%\'\\" or \\"assigned_person=\'John Doe\'\\"). EWSelect has no page size and returns every matching ID, so append a database limit such as \\"limit 0,200\\" to bound the result."}},"hostedApiKey":"none"},"agiloft_update_record":{"id":"agiloft_update_record","name":"Agiloft Update Record","description":"Update an existing record in an Agiloft table.","version":"1.0.0","params":{"instanceUrl":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft instance URL (e.g., https://mycompany.agiloft.com)"},"knowledgeBase":{"type":"string","required":true,"visibility":"user-only","description":"Knowledge base name"},"login":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft username"},"password":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft password"},"table":{"type":"string","required":true,"visibility":"user-or-llm","description":"Table name (e.g., \\"contracts\\", \\"contacts.employees\\")"},"recordId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the record to update"},"data":{"type":"string","required":true,"visibility":"user-or-llm","description":"Updated field values as a JSON object (e.g., {\\"status\\": \\"Active\\", \\"priority\\": \\"High\\"})"}},"hostedApiKey":"none"},"agiloft_upsert_record":{"id":"agiloft_upsert_record","name":"Agiloft Upsert Record","description":"Create an Agiloft record, or update it when a record already matches the given fields.","version":"1.0.0","params":{"instanceUrl":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft instance URL (e.g., https://mycompany.agiloft.com)"},"knowledgeBase":{"type":"string","required":true,"visibility":"user-only","description":"Knowledge base name"},"login":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft username"},"password":{"type":"string","required":true,"visibility":"user-only","description":"Agiloft password"},"table":{"type":"string","required":true,"visibility":"user-or-llm","description":"Table name (e.g., \\"contracts\\", \\"contacts.employees\\")"},"match":{"type":"string","required":true,"visibility":"user-or-llm","description":"Field used to find an existing record (e.g., \\"ext_id\\"). Pick something that identifies a record uniquely — if more than one record matches, Agiloft writes nothing and returns a conflict."},"async":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Queue the write instead of waiting for it. Returns a callback ID instead of a record ID; pass that to Async Status to poll the result."},"data":{"type":"string","required":true,"visibility":"user-or-llm","description":"Field values as a JSON object. On create these populate the new record; on update only the supplied fields change."}},"hostedApiKey":"none"},"ahrefs_anchors":{"id":"ahrefs_anchors","name":"Ahrefs Anchors","description":"Get the anchor text distribution for a target domain or URL\'s backlinks, showing how many links and referring domains use each anchor text.","version":"1.0.0","params":{"target":{"type":"string","required":true,"visibility":"user-or-llm","description":"The target domain or URL to analyze. Example: \\"example.com\\" or \\"https://example.com/page\\""},"mode":{"type":"string","required":false,"visibility":"user-or-llm","description":"Analysis mode: domain (entire domain), prefix (URL prefix), subdomains (include all subdomains, default), exact (exact URL match)"},"history":{"type":"string","required":false,"visibility":"user-or-llm","description":"Historical scope: \\"live\\" (currently live), \\"all_time\\" (default, includes lost backlinks), or \\"since:YYYY-MM-DD\\" (backlinks found since a date)"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of results to return. Example: 50 (default: 1000)"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ahrefs API Key"}},"oauth":{"required":false,"provider":"ahrefs","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"ahrefs_backlinks":{"id":"ahrefs_backlinks","name":"Ahrefs 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.","version":"1.0.0","params":{"target":{"type":"string","required":true,"visibility":"user-or-llm","description":"The target domain or URL to analyze. Example: \\"example.com\\" or \\"https://example.com/page\\""},"mode":{"type":"string","required":false,"visibility":"user-or-llm","description":"Analysis mode: domain (entire domain), prefix (URL prefix), subdomains (include all subdomains, default), exact (exact URL match). Example: \\"domain\\""},"history":{"type":"string","required":false,"visibility":"user-or-llm","description":"Historical scope: \\"live\\" (currently live backlinks), \\"all_time\\" (default, includes lost backlinks), or \\"since:YYYY-MM-DD\\" (backlinks found since a date)."},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of results to return. Example: 50 (default: 1000)"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ahrefs API Key"}},"oauth":{"required":false,"provider":"ahrefs","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"ahrefs_backlinks_stats":{"id":"ahrefs_backlinks_stats","name":"Ahrefs Backlinks Stats","description":"Get backlink and referring domain totals for a target domain or URL, both currently live and across all time.","version":"1.0.0","params":{"target":{"type":"string","required":true,"visibility":"user-or-llm","description":"The target domain or URL to analyze. Example: \\"example.com\\" or \\"https://example.com/page\\""},"mode":{"type":"string","required":false,"visibility":"user-or-llm","description":"Analysis mode: domain (entire domain), prefix (URL prefix), subdomains (include all subdomains, default), exact (exact URL match). Example: \\"domain\\""},"date":{"type":"string","required":false,"visibility":"user-only","description":"Date to report metrics on, in YYYY-MM-DD format (defaults to today)"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ahrefs API Key"}},"oauth":{"required":false,"provider":"ahrefs","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"ahrefs_batch_analysis":{"id":"ahrefs_batch_analysis","name":"Ahrefs Batch Analysis","description":"Get bulk SEO metrics (Domain Rating, backlinks, referring domains, organic traffic, and more) for multiple domains or URLs in a single request. Useful for comparing many competitors at once.","version":"1.0.0","params":{"targets":{"type":"string","required":true,"visibility":"user-or-llm","description":"Comma-separated list of domains or URLs to analyze. Example: \\"example.com,competitor.com\\""},"mode":{"type":"string","required":false,"visibility":"user-or-llm","description":"Analysis mode applied to every target: domain (entire domain), prefix (URL prefix), subdomains (include all subdomains, default), exact (exact URL match)"},"protocol":{"type":"string","required":false,"visibility":"user-or-llm","description":"Protocol applied to every target: \\"both\\" (default), \\"http\\", or \\"https\\""},"country":{"type":"string","required":false,"visibility":"user-or-llm","description":"Country code for traffic data. Example: \\"us\\", \\"gb\\", \\"de\\" (default: \\"us\\")"},"volumeMode":{"type":"string","required":false,"visibility":"user-or-llm","description":"Search volume calculation: \\"monthly\\" or \\"average\\" (default: \\"monthly\\")"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ahrefs API Key"}},"oauth":{"required":false,"provider":"ahrefs","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"ahrefs_broken_backlinks":{"id":"ahrefs_broken_backlinks","name":"Ahrefs Broken Backlinks","description":"Get a list of broken backlinks pointing to a target domain or URL. Useful for identifying link reclamation opportunities.","version":"1.0.0","params":{"target":{"type":"string","required":true,"visibility":"user-or-llm","description":"The target domain or URL to analyze. Example: \\"example.com\\" or \\"https://example.com/page\\""},"mode":{"type":"string","required":false,"visibility":"user-or-llm","description":"Analysis mode: domain (entire domain), prefix (URL prefix), subdomains (include all subdomains, default), exact (exact URL match). Example: \\"domain\\""},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of results to return. Example: 50 (default: 1000)"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ahrefs API Key"}},"oauth":{"required":false,"provider":"ahrefs","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"ahrefs_domain_rating":{"id":"ahrefs_domain_rating","name":"Ahrefs 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.","version":"1.0.0","params":{"target":{"type":"string","required":true,"visibility":"user-or-llm","description":"The target domain to analyze (e.g., example.com)"},"date":{"type":"string","required":false,"visibility":"user-only","description":"Date for historical data in YYYY-MM-DD format (defaults to today)"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ahrefs API Key"}},"oauth":{"required":false,"provider":"ahrefs","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"ahrefs_domain_rating_history":{"id":"ahrefs_domain_rating_history","name":"Ahrefs Domain Rating History","description":"Get the historical Domain Rating (DR) trend for a target domain or URL over a date range, grouped daily, weekly, or monthly.","version":"1.0.0","params":{"target":{"type":"string","required":true,"visibility":"user-or-llm","description":"The target domain or URL to analyze. Example: \\"example.com\\""},"dateFrom":{"type":"string","required":true,"visibility":"user-only","description":"Start date of the historical period, in YYYY-MM-DD format"},"dateTo":{"type":"string","required":false,"visibility":"user-only","description":"End date of the historical period, in YYYY-MM-DD format (defaults to today)"},"historyGrouping":{"type":"string","required":false,"visibility":"user-or-llm","description":"Time interval for grouping data points: \\"daily\\", \\"weekly\\", or \\"monthly\\" (default: \\"monthly\\")"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ahrefs API Key"}},"oauth":{"required":false,"provider":"ahrefs","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"ahrefs_keyword_overview":{"id":"ahrefs_keyword_overview","name":"Ahrefs Keyword Overview","description":"Get detailed metrics for a keyword including search volume, keyword difficulty, CPC, clicks, and traffic potential.","version":"1.0.0","params":{"keyword":{"type":"string","required":true,"visibility":"user-or-llm","description":"The keyword to analyze"},"country":{"type":"string","required":false,"visibility":"user-or-llm","description":"Country code for keyword data. Example: \\"us\\", \\"gb\\", \\"de\\" (default: \\"us\\")"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ahrefs API Key"}},"oauth":{"required":false,"provider":"ahrefs","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"ahrefs_keywords_history":{"id":"ahrefs_keywords_history","name":"Ahrefs Keywords History","description":"Get the historical organic keyword ranking distribution for a target domain or URL over a date range: how many keywords rank in each position bucket at each point in time.","version":"1.0.0","params":{"target":{"type":"string","required":true,"visibility":"user-or-llm","description":"The target domain or URL to analyze. Example: \\"example.com\\""},"dateFrom":{"type":"string","required":true,"visibility":"user-only","description":"Start date of the historical period, in YYYY-MM-DD format"},"dateTo":{"type":"string","required":false,"visibility":"user-only","description":"End date of the historical period, in YYYY-MM-DD format (defaults to today)"},"historyGrouping":{"type":"string","required":false,"visibility":"user-or-llm","description":"Time interval for grouping data points: \\"daily\\", \\"weekly\\", or \\"monthly\\" (default: \\"monthly\\")"},"country":{"type":"string","required":false,"visibility":"user-or-llm","description":"Country code for search results. Example: \\"us\\", \\"gb\\", \\"de\\" (default: \\"us\\")"},"mode":{"type":"string","required":false,"visibility":"user-or-llm","description":"Analysis mode: domain (entire domain), prefix (URL prefix), subdomains (include all subdomains, default), exact (exact URL match)"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ahrefs API Key"}},"oauth":{"required":false,"provider":"ahrefs","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"ahrefs_metrics":{"id":"ahrefs_metrics","name":"Ahrefs Metrics","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.","version":"1.0.0","params":{"target":{"type":"string","required":true,"visibility":"user-or-llm","description":"The target domain or URL to analyze. Example: \\"example.com\\""},"country":{"type":"string","required":false,"visibility":"user-or-llm","description":"Country code for traffic data. Example: \\"us\\", \\"gb\\", \\"de\\""},"mode":{"type":"string","required":false,"visibility":"user-or-llm","description":"Analysis mode: domain (entire domain), prefix (URL prefix), subdomains (include all subdomains, default), exact (exact URL match). Example: \\"domain\\""},"date":{"type":"string","required":false,"visibility":"user-only","description":"Date to report metrics on, in YYYY-MM-DD format (defaults to today)"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ahrefs API Key"}},"oauth":{"required":false,"provider":"ahrefs","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"ahrefs_metrics_history":{"id":"ahrefs_metrics_history","name":"Ahrefs Metrics History","description":"Get the historical organic and paid traffic trend for a target domain or URL over a date range: organic traffic/cost and paid traffic/cost at each point in time.","version":"1.0.0","params":{"target":{"type":"string","required":true,"visibility":"user-or-llm","description":"The target domain or URL to analyze. Example: \\"example.com\\""},"dateFrom":{"type":"string","required":true,"visibility":"user-only","description":"Start date of the historical period, in YYYY-MM-DD format"},"dateTo":{"type":"string","required":false,"visibility":"user-only","description":"End date of the historical period, in YYYY-MM-DD format (defaults to today)"},"volumeMode":{"type":"string","required":false,"visibility":"user-or-llm","description":"Search volume calculation: \\"monthly\\" or \\"average\\" (default: \\"monthly\\")"},"historyGrouping":{"type":"string","required":false,"visibility":"user-or-llm","description":"Time interval for grouping data points: \\"daily\\", \\"weekly\\", or \\"monthly\\" (default: \\"monthly\\")"},"country":{"type":"string","required":false,"visibility":"user-or-llm","description":"Country code for traffic data. Example: \\"us\\", \\"gb\\", \\"de\\" (default: \\"us\\")"},"mode":{"type":"string","required":false,"visibility":"user-or-llm","description":"Analysis mode: domain (entire domain), prefix (URL prefix), subdomains (include all subdomains, default), exact (exact URL match)"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ahrefs API Key"}},"oauth":{"required":false,"provider":"ahrefs","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"ahrefs_organic_competitors":{"id":"ahrefs_organic_competitors","name":"Ahrefs Organic Competitors","description":"Get domains that compete with a target domain or URL for the same organic keywords, ranked by keyword overlap.","version":"1.0.0","params":{"target":{"type":"string","required":true,"visibility":"user-or-llm","description":"The target domain or URL to analyze. Example: \\"example.com\\""},"country":{"type":"string","required":false,"visibility":"user-or-llm","description":"Country code for search results. Example: \\"us\\", \\"gb\\", \\"de\\" (default: \\"us\\")"},"mode":{"type":"string","required":false,"visibility":"user-or-llm","description":"Analysis mode: domain (entire domain), prefix (URL prefix), subdomains (include all subdomains, default), exact (exact URL match). Example: \\"domain\\""},"date":{"type":"string","required":false,"visibility":"user-only","description":"Date to report metrics on, in YYYY-MM-DD format (defaults to today)"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of results to return. Example: 50 (default: 1000)"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ahrefs API Key"}},"oauth":{"required":false,"provider":"ahrefs","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"ahrefs_organic_keywords":{"id":"ahrefs_organic_keywords","name":"Ahrefs 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.","version":"1.0.0","params":{"target":{"type":"string","required":true,"visibility":"user-or-llm","description":"The target domain or URL to analyze. Example: \\"example.com\\" or \\"https://example.com/page\\""},"country":{"type":"string","required":false,"visibility":"user-or-llm","description":"Country code for search results. Example: \\"us\\", \\"gb\\", \\"de\\" (default: \\"us\\")"},"mode":{"type":"string","required":false,"visibility":"user-or-llm","description":"Analysis mode: domain (entire domain), prefix (URL prefix), subdomains (include all subdomains, default), exact (exact URL match). Example: \\"domain\\""},"date":{"type":"string","required":false,"visibility":"user-only","description":"Date to report metrics on, in YYYY-MM-DD format (defaults to today)"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of results to return. Example: 50 (default: 1000)"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ahrefs API Key"}},"oauth":{"required":false,"provider":"ahrefs","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"ahrefs_paid_pages":{"id":"ahrefs_paid_pages","name":"Ahrefs Paid Pages","description":"Get a target domain\'s pages that receive paid search traffic, sorted by estimated paid traffic. Returns page URLs with their paid traffic, keyword counts, and estimated spend.","version":"1.0.0","params":{"target":{"type":"string","required":true,"visibility":"user-or-llm","description":"The target domain or URL to analyze. Example: \\"example.com\\""},"country":{"type":"string","required":false,"visibility":"user-or-llm","description":"Country code for traffic data. Example: \\"us\\", \\"gb\\", \\"de\\" (default: \\"us\\")"},"mode":{"type":"string","required":false,"visibility":"user-or-llm","description":"Analysis mode: domain (entire domain), prefix (URL prefix), subdomains (include all subdomains, default), exact (exact URL match)"},"date":{"type":"string","required":false,"visibility":"user-only","description":"Date to report metrics on, in YYYY-MM-DD format (defaults to today)"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of results to return. Example: 50 (default: 1000)"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ahrefs API Key"}},"oauth":{"required":false,"provider":"ahrefs","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"ahrefs_rank_tracker_competitors_overview":{"id":"ahrefs_rank_tracker_competitors_overview","name":"Ahrefs Rank Tracker Competitors Overview","description":"Get competitor rankings for the keywords tracked in an Ahrefs Rank Tracker project: each tracked keyword\'s volume and difficulty alongside every competitor\'s position, traffic, and traffic value. This endpoint is free and does not consume API units.","version":"1.0.0","params":{"projectId":{"type":"number","required":true,"visibility":"user-or-llm","description":"The Rank Tracker project ID (found in the project URL in Ahrefs)"},"date":{"type":"string","required":true,"visibility":"user-only","description":"Date to report rankings for, in YYYY-MM-DD format"},"device":{"type":"string","required":true,"visibility":"user-or-llm","description":"Rankings device type: \\"desktop\\" or \\"mobile\\""},"dateCompared":{"type":"string","required":false,"visibility":"user-only","description":"Comparison date in YYYY-MM-DD format, to compute position/traffic deltas"},"volumeMode":{"type":"string","required":false,"visibility":"user-or-llm","description":"Search volume calculation: \\"monthly\\" or \\"average\\" (default: \\"monthly\\")"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of results to return. Example: 50 (default: 1000)"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ahrefs API Key"}},"oauth":{"required":false,"provider":"ahrefs","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"ahrefs_rank_tracker_competitors_stats":{"id":"ahrefs_rank_tracker_competitors_stats","name":"Ahrefs Rank Tracker Competitors Stats","description":"Get aggregate competitor stats for an Ahrefs Rank Tracker project: each competitor\'s traffic, traffic value, average position, and share of voice across all tracked keywords. This endpoint is free and does not consume API units.","version":"1.0.0","params":{"projectId":{"type":"number","required":true,"visibility":"user-or-llm","description":"The Rank Tracker project ID (found in the project URL in Ahrefs)"},"date":{"type":"string","required":true,"visibility":"user-only","description":"Date to report metrics for, in YYYY-MM-DD format"},"device":{"type":"string","required":true,"visibility":"user-or-llm","description":"Rankings device type: \\"desktop\\" or \\"mobile\\""},"volumeMode":{"type":"string","required":false,"visibility":"user-or-llm","description":"Search volume calculation: \\"monthly\\" or \\"average\\" (default: \\"monthly\\")"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ahrefs API Key"}},"oauth":{"required":false,"provider":"ahrefs","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"ahrefs_rank_tracker_overview":{"id":"ahrefs_rank_tracker_overview","name":"Ahrefs Rank Tracker Overview","description":"Get ranking overview metrics for the keywords tracked in an Ahrefs Rank Tracker project: position, search volume, keyword difficulty, and estimated traffic. This endpoint is free and does not consume API units.","version":"1.0.0","params":{"projectId":{"type":"number","required":true,"visibility":"user-or-llm","description":"The Rank Tracker project ID (found in the project URL in Ahrefs)"},"date":{"type":"string","required":true,"visibility":"user-only","description":"Date to report rankings for, in YYYY-MM-DD format"},"device":{"type":"string","required":true,"visibility":"user-or-llm","description":"Rankings device type: \\"desktop\\" or \\"mobile\\""},"dateCompared":{"type":"string","required":false,"visibility":"user-only","description":"Comparison date in YYYY-MM-DD format, to compute position/traffic deltas"},"volumeMode":{"type":"string","required":false,"visibility":"user-or-llm","description":"Search volume calculation: \\"monthly\\" or \\"average\\" (default: \\"monthly\\")"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of results to return. Example: 50 (default: 1000)"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ahrefs API Key"}},"oauth":{"required":false,"provider":"ahrefs","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"ahrefs_rank_tracker_serp_overview":{"id":"ahrefs_rank_tracker_serp_overview","name":"Ahrefs Rank Tracker SERP Overview","description":"Get the full SERP (search engine results page) for a keyword tracked in an Ahrefs Rank Tracker project, including every ranking URL with its position, title, and authority metrics. This endpoint is free and does not consume API units.","version":"1.0.0","params":{"projectId":{"type":"number","required":true,"visibility":"user-or-llm","description":"The Rank Tracker project ID (found in the project URL in Ahrefs)"},"keyword":{"type":"string","required":true,"visibility":"user-or-llm","description":"The tracked keyword to retrieve SERP data for"},"country":{"type":"string","required":true,"visibility":"user-or-llm","description":"Country code for the tracked keyword. Example: \\"us\\", \\"gb\\", \\"de\\""},"device":{"type":"string","required":true,"visibility":"user-or-llm","description":"Rankings device type: \\"desktop\\" or \\"mobile\\""},"topPositions":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of top organic positions to return (defaults to all available)"},"date":{"type":"string","required":false,"visibility":"user-only","description":"Timestamp to return the last available SERP Overview at, in YYYY-MM-DDThh:mm:ss format"},"locationId":{"type":"number","required":false,"visibility":"user-or-llm","description":"Location ID of the tracked keyword, if tracked at a specific location"},"languageCode":{"type":"string","required":false,"visibility":"user-or-llm","description":"Language code of the tracked keyword"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ahrefs API Key"}},"oauth":{"required":false,"provider":"ahrefs","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"ahrefs_refdomains_history":{"id":"ahrefs_refdomains_history","name":"Ahrefs Referring Domains History","description":"Get the historical referring domains trend for a target domain or URL over a date range, grouped daily, weekly, or monthly.","version":"1.0.0","params":{"target":{"type":"string","required":true,"visibility":"user-or-llm","description":"The target domain or URL to analyze. Example: \\"example.com\\""},"dateFrom":{"type":"string","required":true,"visibility":"user-only","description":"Start date of the historical period, in YYYY-MM-DD format"},"dateTo":{"type":"string","required":false,"visibility":"user-only","description":"End date of the historical period, in YYYY-MM-DD format (defaults to today)"},"historyGrouping":{"type":"string","required":false,"visibility":"user-or-llm","description":"Time interval for grouping data points: \\"daily\\", \\"weekly\\", or \\"monthly\\" (default: \\"monthly\\")"},"mode":{"type":"string","required":false,"visibility":"user-or-llm","description":"Analysis mode: domain (entire domain), prefix (URL prefix), subdomains (include all subdomains, default), exact (exact URL match)"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ahrefs API Key"}},"oauth":{"required":false,"provider":"ahrefs","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"ahrefs_referring_domains":{"id":"ahrefs_referring_domains","name":"Ahrefs 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.","version":"1.0.0","params":{"target":{"type":"string","required":true,"visibility":"user-or-llm","description":"The target domain or URL to analyze. Example: \\"example.com\\" or \\"https://example.com/page\\""},"mode":{"type":"string","required":false,"visibility":"user-or-llm","description":"Analysis mode: domain (entire domain), prefix (URL prefix), subdomains (include all subdomains, default), exact (exact URL match). Example: \\"domain\\""},"history":{"type":"string","required":false,"visibility":"user-or-llm","description":"Historical scope: \\"live\\" (currently live), \\"all_time\\" (default, includes lost domains), or \\"since:YYYY-MM-DD\\" (domains found since a date)."},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of results to return. Example: 50 (default: 1000)"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ahrefs API Key"}},"oauth":{"required":false,"provider":"ahrefs","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"ahrefs_related_terms":{"id":"ahrefs_related_terms","name":"Ahrefs Related Terms","description":"Get keyword ideas related to a seed keyword: terms the same top-ranking pages also rank for (\\"also rank for\\") or also discuss (\\"also talk about\\"), with volume, difficulty, and CPC.","version":"1.0.0","params":{"keyword":{"type":"string","required":true,"visibility":"user-or-llm","description":"The seed keyword to find related terms for"},"country":{"type":"string","required":false,"visibility":"user-or-llm","description":"Country code for keyword data. Example: \\"us\\", \\"gb\\", \\"de\\" (default: \\"us\\")"},"terms":{"type":"string","required":false,"visibility":"user-or-llm","description":"Type of related keywords to return: \\"also_rank_for\\", \\"also_talk_about\\", or \\"all\\" (default: \\"all\\")"},"viewFor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Whether to derive related terms from the top 10 or top 100 ranking pages (default: \\"top_10\\")"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of results to return. Example: 50 (default: 1000)"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ahrefs API Key"}},"oauth":{"required":false,"provider":"ahrefs","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"ahrefs_site_audit_page_explorer":{"id":"ahrefs_site_audit_page_explorer","name":"Ahrefs Site Audit Page Explorer","description":"Get crawled pages from an Ahrefs Site Audit project with health and SEO metrics: HTTP status, title, link counts, backlinks, indexability, and traffic. Optionally filter to pages affected by a specific issue.","version":"1.0.0","params":{"projectId":{"type":"number","required":true,"visibility":"user-or-llm","description":"The Site Audit project ID (found in the project URL in Ahrefs)"},"date":{"type":"string","required":false,"visibility":"user-only","description":"Crawl date in YYYY-MM-DDThh:mm:ss format (defaults to the most recent crawl)"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of results to return. Example: 50 (default: 1000)"},"offset":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of results to skip, for pagination"},"issueId":{"type":"string","required":false,"visibility":"user-or-llm","description":"Only return pages affected by this issue ID"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ahrefs API Key"}},"oauth":{"required":false,"provider":"ahrefs","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"ahrefs_top_pages":{"id":"ahrefs_top_pages","name":"Ahrefs 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.","version":"1.0.0","params":{"target":{"type":"string","required":true,"visibility":"user-or-llm","description":"The target domain to analyze. Example: \\"example.com\\""},"country":{"type":"string","required":false,"visibility":"user-or-llm","description":"Country code for traffic data. Example: \\"us\\", \\"gb\\", \\"de\\" (default: \\"us\\")"},"mode":{"type":"string","required":false,"visibility":"user-or-llm","description":"Analysis mode: domain (entire domain), prefix (URL prefix), subdomains (include all subdomains, default), exact (exact URL match). Example: \\"domain\\""},"date":{"type":"string","required":false,"visibility":"user-only","description":"Date to report metrics on, in YYYY-MM-DD format (defaults to today)"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of results to return. Example: 50 (default: 1000)"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ahrefs API Key"}},"oauth":{"required":false,"provider":"ahrefs","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"airtable_create_records":{"id":"airtable_create_records","name":"Airtable Create Records","description":"Write new records to an Airtable table","version":"1.0.0","params":{"accessToken":{"type":"string","required":true,"visibility":"hidden","description":"OAuth access token"},"baseId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Airtable base ID (starts with \\"app\\", e.g., \\"appXXXXXXXXXXXXXX\\")"},"tableId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Table ID (starts with \\"tbl\\") or table name"},"records":{"type":"json","required":true,"visibility":"user-or-llm","description":"Array of records to create, each with a `fields` object"},"typecast":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"When true, Airtable automatically converts string values to the field type"}},"oauth":{"required":true,"provider":"airtable"},"hostedApiKey":"none"},"airtable_delete_records":{"id":"airtable_delete_records","name":"Airtable Delete Records","description":"Delete one or more records from an Airtable table by ID","version":"1.0.0","params":{"accessToken":{"type":"string","required":true,"visibility":"hidden","description":"OAuth access token"},"baseId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Airtable base ID (starts with \\"app\\", e.g., \\"appXXXXXXXXXXXXXX\\")"},"tableId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Table ID (starts with \\"tbl\\") or table name"},"recordIds":{"type":"json","required":true,"visibility":"user-or-llm","description":"Array of record IDs to delete (each starts with \\"rec\\", e.g., [\\"recXXXXXXXXXXXXXX\\"]). Pass a single-element array to delete one record."}},"oauth":{"required":true,"provider":"airtable"},"hostedApiKey":"none"},"airtable_get_base_schema":{"id":"airtable_get_base_schema","name":"Airtable Get Base Schema","description":"Get the schema of all tables, fields, and views in an Airtable base","version":"1.0.0","params":{"accessToken":{"type":"string","required":true,"visibility":"hidden","description":"OAuth access token"},"baseId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Airtable base ID (starts with \\"app\\", e.g., \\"appXXXXXXXXXXXXXX\\")"}},"oauth":{"required":true,"provider":"airtable"},"hostedApiKey":"none"},"airtable_get_record":{"id":"airtable_get_record","name":"Airtable Get Record","description":"Retrieve a single record from an Airtable table by its ID","version":"1.0.0","params":{"accessToken":{"type":"string","required":true,"visibility":"hidden","description":"OAuth access token"},"baseId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Airtable base ID (starts with \\"app\\", e.g., \\"appXXXXXXXXXXXXXX\\")"},"tableId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Table ID (starts with \\"tbl\\") or table name"},"recordId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Record ID to retrieve (starts with \\"rec\\", e.g., \\"recXXXXXXXXXXXXXX\\")"}},"oauth":{"required":true,"provider":"airtable"},"hostedApiKey":"none"},"airtable_list_bases":{"id":"airtable_list_bases","name":"Airtable List Bases","description":"List all bases the authenticated user has access to","version":"1.0.0","params":{"accessToken":{"type":"string","required":true,"visibility":"hidden","description":"OAuth access token"},"offset":{"type":"string","required":false,"visibility":"user-or-llm","description":"Pagination offset for retrieving additional bases"}},"oauth":{"required":true,"provider":"airtable"},"hostedApiKey":"none"},"airtable_list_records":{"id":"airtable_list_records","name":"Airtable List Records","description":"Read records from an Airtable table","version":"1.0.0","params":{"accessToken":{"type":"string","required":true,"visibility":"hidden","description":"OAuth access token"},"baseId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Airtable base ID (starts with \\"app\\", e.g., \\"appXXXXXXXXXXXXXX\\")"},"tableId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Table ID (starts with \\"tbl\\") or table name"},"maxRecords":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of records to return (default: all records)"},"filterFormula":{"type":"string","required":false,"visibility":"user-or-llm","description":"Formula to filter records (e.g., \\"({Field Name} = \'Value\')\\")"}},"oauth":{"required":true,"provider":"airtable"},"hostedApiKey":"none"},"airtable_list_tables":{"id":"airtable_list_tables","name":"Airtable List Tables","description":"List all tables and their schema in an Airtable base","version":"1.0.0","params":{"accessToken":{"type":"string","required":true,"visibility":"hidden","description":"OAuth access token"},"baseId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Airtable base ID (starts with \\"app\\", e.g., \\"appXXXXXXXXXXXXXX\\")"}},"oauth":{"required":true,"provider":"airtable"},"hostedApiKey":"none"},"airtable_update_multiple_records":{"id":"airtable_update_multiple_records","name":"Airtable Update Multiple Records","description":"Update multiple existing records in an Airtable table","version":"1.0.0","params":{"accessToken":{"type":"string","required":true,"visibility":"hidden","description":"OAuth access token"},"baseId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Airtable base ID (starts with \\"app\\", e.g., \\"appXXXXXXXXXXXXXX\\")"},"tableId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Table ID (starts with \\"tbl\\") or table name"},"records":{"type":"json","required":true,"visibility":"user-or-llm","description":"Array of records to update, each with an `id` and a `fields` object"},"typecast":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"When true, Airtable automatically converts string values to the field type"}},"oauth":{"required":true,"provider":"airtable"},"hostedApiKey":"none"},"airtable_update_record":{"id":"airtable_update_record","name":"Airtable Update Record","description":"Update an existing record in an Airtable table by ID","version":"1.0.0","params":{"accessToken":{"type":"string","required":true,"visibility":"hidden","description":"OAuth access token"},"baseId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Airtable base ID (starts with \\"app\\", e.g., \\"appXXXXXXXXXXXXXX\\")"},"tableId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Table ID (starts with \\"tbl\\") or table name"},"recordId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Record ID to update (starts with \\"rec\\", e.g., \\"recXXXXXXXXXXXXXX\\")"},"fields":{"type":"json","required":true,"visibility":"user-or-llm","description":"An object containing the field names and their new values"},"typecast":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"When true, Airtable automatically converts string values to the field type"}},"oauth":{"required":true,"provider":"airtable"},"hostedApiKey":"none"},"airtable_upsert_records":{"id":"airtable_upsert_records","name":"Airtable Upsert Records","description":"Update existing records or create new ones in an Airtable table, matching on the specified merge fields","version":"1.0.0","params":{"accessToken":{"type":"string","required":true,"visibility":"hidden","description":"OAuth access token"},"baseId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Airtable base ID (starts with \\"app\\", e.g., \\"appXXXXXXXXXXXXXX\\")"},"tableId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Table ID (starts with \\"tbl\\") or table name"},"records":{"type":"json","required":true,"visibility":"user-or-llm","description":"Array of records to upsert, each with a `fields` object"},"fieldsToMergeOn":{"type":"json","required":true,"visibility":"user-or-llm","description":"Array of field names used to match existing records (max 3). A record is updated when all merge fields match, otherwise it is created. Example: [\\"Name\\"]"},"typecast":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"When true, Airtable automatically converts string values to the field type"}},"oauth":{"required":true,"provider":"airtable"},"hostedApiKey":"none"},"algolia_add_record":{"id":"algolia_add_record","name":"Algolia Add Record","description":"Add or replace a record in an Algolia index","version":"1.0","params":{"applicationId":{"type":"string","required":true,"visibility":"user-only","description":"Algolia Application ID"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Algolia Admin API Key"},"indexName":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the Algolia index"},"objectID":{"type":"string","required":false,"visibility":"user-or-llm","description":"Object ID for the record (auto-generated if not provided)"},"record":{"type":"json","required":true,"visibility":"user-or-llm","description":"JSON object representing the record to add"}},"oauth":{"required":false,"provider":"algolia","credentialKind":"service-account","credentialParams":{"applicationId":"providerWorkspaceId","apiKey":"accessToken"},"credentialSuppliedParams":["applicationId","apiKey"]},"hostedApiKey":"none"},"algolia_batch_operations":{"id":"algolia_batch_operations","name":"Algolia Batch Operations","description":"Perform batch add, update, partial update, or delete operations on records in an Algolia index","version":"1.0","params":{"applicationId":{"type":"string","required":true,"visibility":"user-only","description":"Algolia Application ID"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Algolia Admin API Key"},"indexName":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the Algolia index"},"requests":{"type":"json","required":true,"visibility":"user-or-llm","description":"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)"}},"oauth":{"required":false,"provider":"algolia","credentialKind":"service-account","credentialParams":{"applicationId":"providerWorkspaceId","apiKey":"accessToken"},"credentialSuppliedParams":["applicationId","apiKey"]},"hostedApiKey":"none"},"algolia_browse_records":{"id":"algolia_browse_records","name":"Algolia Browse Records","description":"Browse and iterate over all records in an Algolia index using cursor pagination","version":"1.0","params":{"applicationId":{"type":"string","required":true,"visibility":"user-only","description":"Algolia Application ID"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Algolia API Key (must have browse ACL)"},"indexName":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the Algolia index to browse"},"query":{"type":"string","required":false,"visibility":"user-or-llm","description":"Search query to filter browsed records"},"filters":{"type":"string","required":false,"visibility":"user-or-llm","description":"Filter string to narrow down results"},"attributesToRetrieve":{"type":"string","required":false,"visibility":"user-or-llm","description":"Comma-separated list of attributes to retrieve"},"hitsPerPage":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of hits per page (default: 1000, max: 1000)"},"cursor":{"type":"string","required":false,"visibility":"user-or-llm","description":"Cursor from a previous browse response for pagination"},"aroundLatLng":{"type":"string","required":false,"visibility":"user-or-llm","description":"Coordinates for geo-search (e.g., \\"40.71,-74.01\\")"},"aroundRadius":{"type":"string","required":false,"visibility":"user-or-llm","description":"Maximum radius in meters for geo-search, or \\"all\\" for unlimited"},"insideBoundingBox":{"type":"json","required":false,"visibility":"user-or-llm","description":"Bounding box coordinates as [[lat1, lng1, lat2, lng2]] for geo-search"},"insidePolygon":{"type":"json","required":false,"visibility":"user-or-llm","description":"Polygon coordinates as [[lat1, lng1, lat2, lng2, lat3, lng3, ...]] for geo-search"}},"oauth":{"required":false,"provider":"algolia","credentialKind":"service-account","credentialParams":{"applicationId":"providerWorkspaceId","apiKey":"accessToken"},"credentialSuppliedParams":["applicationId","apiKey"]},"hostedApiKey":"none"},"algolia_clear_records":{"id":"algolia_clear_records","name":"Algolia Clear Records","description":"Clear all records from an Algolia index while keeping settings, synonyms, and rules","version":"1.0","params":{"applicationId":{"type":"string","required":true,"visibility":"user-only","description":"Algolia Application ID"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Algolia Admin API Key (must have deleteIndex ACL)"},"indexName":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the Algolia index to clear"}},"oauth":{"required":false,"provider":"algolia","credentialKind":"service-account","credentialParams":{"applicationId":"providerWorkspaceId","apiKey":"accessToken"},"credentialSuppliedParams":["applicationId","apiKey"]},"hostedApiKey":"none"},"algolia_copy_move_index":{"id":"algolia_copy_move_index","name":"Algolia Copy/Move Index","description":"Copy or move an Algolia index to a new destination","version":"1.0","params":{"applicationId":{"type":"string","required":true,"visibility":"user-only","description":"Algolia Application ID"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Algolia Admin API Key"},"indexName":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the source index"},"operation":{"type":"string","required":true,"visibility":"user-or-llm","description":"Operation to perform: \\"copy\\" or \\"move\\""},"destination":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the destination index"},"scope":{"type":"json","required":false,"visibility":"user-or-llm","description":"Array of scopes to copy (only for \\"copy\\" operation): [\\"settings\\", \\"synonyms\\", \\"rules\\"]. Omit to copy everything including records."}},"oauth":{"required":false,"provider":"algolia","credentialKind":"service-account","credentialParams":{"applicationId":"providerWorkspaceId","apiKey":"accessToken"},"credentialSuppliedParams":["applicationId","apiKey"]},"hostedApiKey":"none"},"algolia_delete_by_filter":{"id":"algolia_delete_by_filter","name":"Algolia Delete By Filter","description":"Delete all records matching a filter from an Algolia index","version":"1.0","params":{"applicationId":{"type":"string","required":true,"visibility":"user-only","description":"Algolia Application ID"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Algolia Admin API Key (must have deleteIndex ACL)"},"indexName":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the Algolia index"},"filters":{"type":"string","required":false,"visibility":"user-or-llm","description":"Filter expression to match records for deletion (e.g., \\"category:outdated\\")"},"facetFilters":{"type":"json","required":false,"visibility":"user-or-llm","description":"Array of facet filters (e.g., [\\"brand:Acme\\"])"},"numericFilters":{"type":"json","required":false,"visibility":"user-or-llm","description":"Array of numeric filters (e.g., [\\"price > 100\\"])"},"tagFilters":{"type":"json","required":false,"visibility":"user-or-llm","description":"Array of tag filters using the _tags attribute (e.g., [\\"published\\"])"},"aroundLatLng":{"type":"string","required":false,"visibility":"user-or-llm","description":"Coordinates for geo-search filter (e.g., \\"40.71,-74.01\\")"},"aroundRadius":{"type":"string","required":false,"visibility":"user-or-llm","description":"Maximum radius in meters for geo-search, or \\"all\\" for unlimited"},"insideBoundingBox":{"type":"json","required":false,"visibility":"user-or-llm","description":"Bounding box coordinates as [[lat1, lng1, lat2, lng2]] for geo-search filter"},"insidePolygon":{"type":"json","required":false,"visibility":"user-or-llm","description":"Polygon coordinates as [[lat1, lng1, lat2, lng2, lat3, lng3, ...]] for geo-search filter"}},"oauth":{"required":false,"provider":"algolia","credentialKind":"service-account","credentialParams":{"applicationId":"providerWorkspaceId","apiKey":"accessToken"},"credentialSuppliedParams":["applicationId","apiKey"]},"hostedApiKey":"none"},"algolia_delete_index":{"id":"algolia_delete_index","name":"Algolia Delete Index","description":"Delete an entire Algolia index and all its records","version":"1.0","params":{"applicationId":{"type":"string","required":true,"visibility":"user-only","description":"Algolia Application ID"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Algolia Admin API Key (must have deleteIndex ACL)"},"indexName":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the Algolia index to delete"}},"oauth":{"required":false,"provider":"algolia","credentialKind":"service-account","credentialParams":{"applicationId":"providerWorkspaceId","apiKey":"accessToken"},"credentialSuppliedParams":["applicationId","apiKey"]},"hostedApiKey":"none"},"algolia_delete_record":{"id":"algolia_delete_record","name":"Algolia Delete Record","description":"Delete a record by objectID from an Algolia index","version":"1.0","params":{"applicationId":{"type":"string","required":true,"visibility":"user-only","description":"Algolia Application ID"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Algolia Admin API Key"},"indexName":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the Algolia index"},"objectID":{"type":"string","required":true,"visibility":"user-or-llm","description":"The objectID of the record to delete"}},"oauth":{"required":false,"provider":"algolia","credentialKind":"service-account","credentialParams":{"applicationId":"providerWorkspaceId","apiKey":"accessToken"},"credentialSuppliedParams":["applicationId","apiKey"]},"hostedApiKey":"none"},"algolia_get_record":{"id":"algolia_get_record","name":"Algolia Get Record","description":"Get a record by objectID from an Algolia index","version":"1.0","params":{"applicationId":{"type":"string","required":true,"visibility":"user-only","description":"Algolia Application ID"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Algolia API Key"},"indexName":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the Algolia index"},"objectID":{"type":"string","required":true,"visibility":"user-or-llm","description":"The objectID of the record to retrieve"},"attributesToRetrieve":{"type":"string","required":false,"visibility":"user-or-llm","description":"Comma-separated list of attributes to retrieve"}},"oauth":{"required":false,"provider":"algolia","credentialKind":"service-account","credentialParams":{"applicationId":"providerWorkspaceId","apiKey":"accessToken"},"credentialSuppliedParams":["applicationId","apiKey"]},"hostedApiKey":"none"},"algolia_get_records":{"id":"algolia_get_records","name":"Algolia Get Records","description":"Retrieve multiple records by objectID from one or more Algolia indices","version":"1.0","params":{"applicationId":{"type":"string","required":true,"visibility":"user-only","description":"Algolia Application ID"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Algolia API Key"},"indexName":{"type":"string","required":true,"visibility":"user-or-llm","description":"Default index name for all requests"},"requests":{"type":"json","required":true,"visibility":"user-or-llm","description":"Array of objects specifying records to retrieve. Each must have \\"objectID\\" and optionally \\"indexName\\" and \\"attributesToRetrieve\\"."}},"oauth":{"required":false,"provider":"algolia","credentialKind":"service-account","credentialParams":{"applicationId":"providerWorkspaceId","apiKey":"accessToken"},"credentialSuppliedParams":["applicationId","apiKey"]},"hostedApiKey":"none"},"algolia_get_settings":{"id":"algolia_get_settings","name":"Algolia Get Settings","description":"Retrieve the settings of an Algolia index","version":"1.0","params":{"applicationId":{"type":"string","required":true,"visibility":"user-only","description":"Algolia Application ID"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Algolia API Key"},"indexName":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the Algolia index"}},"oauth":{"required":false,"provider":"algolia","credentialKind":"service-account","credentialParams":{"applicationId":"providerWorkspaceId","apiKey":"accessToken"},"credentialSuppliedParams":["applicationId","apiKey"]},"hostedApiKey":"none"},"algolia_get_task_status":{"id":"algolia_get_task_status","name":"Algolia Get Task Status","description":"Check whether an Algolia indexing task has finished publishing","version":"1.0","params":{"applicationId":{"type":"string","required":true,"visibility":"user-only","description":"Algolia Application ID"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Algolia API Key"},"indexName":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the Algolia index the task ran against"},"taskID":{"type":"number","required":true,"visibility":"user-or-llm","description":"The taskID returned by a previous write operation"}},"oauth":{"required":false,"provider":"algolia","credentialKind":"service-account","credentialParams":{"applicationId":"providerWorkspaceId","apiKey":"accessToken"},"credentialSuppliedParams":["applicationId","apiKey"]},"hostedApiKey":"none"},"algolia_list_indices":{"id":"algolia_list_indices","name":"Algolia List Indices","description":"List all indices in an Algolia application","version":"1.0","params":{"applicationId":{"type":"string","required":true,"visibility":"user-only","description":"Algolia Application ID"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Algolia API Key"},"page":{"type":"number","required":false,"visibility":"user-or-llm","description":"Page number for paginating indices (default: not paginated)"},"hitsPerPage":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of indices per page (default: 100)"}},"oauth":{"required":false,"provider":"algolia","credentialKind":"service-account","credentialParams":{"applicationId":"providerWorkspaceId","apiKey":"accessToken"},"credentialSuppliedParams":["applicationId","apiKey"]},"hostedApiKey":"none"},"algolia_partial_update_record":{"id":"algolia_partial_update_record","name":"Algolia Partial Update Record","description":"Partially update a record in an Algolia index without replacing it entirely","version":"1.0","params":{"applicationId":{"type":"string","required":true,"visibility":"user-only","description":"Algolia Application ID"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Algolia Admin API Key"},"indexName":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the Algolia index"},"objectID":{"type":"string","required":true,"visibility":"user-or-llm","description":"The objectID of the record to update"},"attributes":{"type":"json","required":true,"visibility":"user-or-llm","description":"JSON object with attributes to update. Supports built-in operations like {\\"stock\\": {\\"_operation\\": \\"Decrement\\", \\"value\\": 1}}"},"createIfNotExists":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Whether to create the record if it does not exist (default: true)"}},"oauth":{"required":false,"provider":"algolia","credentialKind":"service-account","credentialParams":{"applicationId":"providerWorkspaceId","apiKey":"accessToken"},"credentialSuppliedParams":["applicationId","apiKey"]},"hostedApiKey":"none"},"algolia_search":{"id":"algolia_search","name":"Algolia Search","description":"Search an Algolia index","version":"1.0","params":{"applicationId":{"type":"string","required":true,"visibility":"user-only","description":"Algolia Application ID"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Algolia API Key"},"indexName":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the Algolia index to search"},"query":{"type":"string","required":true,"visibility":"user-or-llm","description":"Search query text"},"hitsPerPage":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of hits per page (default: 20)"},"page":{"type":"number","required":false,"visibility":"user-or-llm","description":"Page number to retrieve (default: 0)"},"filters":{"type":"string","required":false,"visibility":"user-or-llm","description":"Filter string (e.g., \\"category:electronics AND price < 100\\")"},"attributesToRetrieve":{"type":"string","required":false,"visibility":"user-or-llm","description":"Comma-separated list of attributes to retrieve"},"facets":{"type":"string","required":false,"visibility":"user-or-llm","description":"Comma-separated list of facet attribute names to retrieve counts for (use \\"*\\" for all)"},"getRankingInfo":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Whether to include detailed ranking information in each hit"},"aroundLatLng":{"type":"string","required":false,"visibility":"user-or-llm","description":"Coordinates for geo-search (e.g., \\"40.71,-74.01\\")"},"aroundRadius":{"type":"string","required":false,"visibility":"user-or-llm","description":"Maximum radius in meters for geo-search, or \\"all\\" for unlimited"},"insideBoundingBox":{"type":"json","required":false,"visibility":"user-or-llm","description":"Bounding box coordinates as [[lat1, lng1, lat2, lng2]] for geo-search"},"insidePolygon":{"type":"json","required":false,"visibility":"user-or-llm","description":"Polygon coordinates as [[lat1, lng1, lat2, lng2, lat3, lng3, ...]] for geo-search"}},"oauth":{"required":false,"provider":"algolia","credentialKind":"service-account","credentialParams":{"applicationId":"providerWorkspaceId","apiKey":"accessToken"},"credentialSuppliedParams":["applicationId","apiKey"]},"hostedApiKey":"none"},"algolia_update_settings":{"id":"algolia_update_settings","name":"Algolia Update Settings","description":"Update the settings of an Algolia index","version":"1.0","params":{"applicationId":{"type":"string","required":true,"visibility":"user-only","description":"Algolia Application ID"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Algolia Admin API Key (must have editSettings ACL)"},"indexName":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the Algolia index"},"settings":{"type":"json","required":true,"visibility":"user-or-llm","description":"JSON object with settings to update (e.g., {\\"searchableAttributes\\": [\\"name\\", \\"description\\"], \\"customRanking\\": [\\"desc(popularity)\\"]})"},"forwardToReplicas":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Whether to apply changes to replica indices (default: false)"}},"oauth":{"required":false,"provider":"algolia","credentialKind":"service-account","credentialParams":{"applicationId":"providerWorkspaceId","apiKey":"accessToken"},"credentialSuppliedParams":["applicationId","apiKey"]},"hostedApiKey":"none"},"amplitude_event_segmentation":{"id":"amplitude_event_segmentation","name":"Amplitude Event Segmentation","description":"Query event analytics data with segmentation. Get event counts, uniques, averages, and more.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Amplitude API Key"},"secretKey":{"type":"string","required":true,"visibility":"user-only","description":"Amplitude Secret Key"},"eventType":{"type":"string","required":true,"visibility":"user-or-llm","description":"Event type name to analyze"},"start":{"type":"string","required":true,"visibility":"user-or-llm","description":"Start date in YYYYMMDD format"},"end":{"type":"string","required":true,"visibility":"user-or-llm","description":"End date in YYYYMMDD format"},"metric":{"type":"string","required":false,"visibility":"user-or-llm","description":"Metric type: uniques, totals, pct_dau, average, histogram, sums, value_avg, or formula (default: uniques)"},"interval":{"type":"string","required":false,"visibility":"user-or-llm","description":"Time interval: 1 (daily), 7 (weekly), or 30 (monthly)"},"groupBy":{"type":"string","required":false,"visibility":"user-or-llm","description":"Property name to group by (prefix custom user properties with \\"gp:\\")"},"groupBy2":{"type":"string","required":false,"visibility":"user-or-llm","description":"Second property name to group by (prefix custom user properties with \\"gp:\\")"},"limit":{"type":"string","required":false,"visibility":"user-or-llm","description":"Maximum number of group-by values (max 1000)"},"filters":{"type":"string","required":false,"visibility":"user-or-llm","description":"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":{"type":"string","required":false,"visibility":"user-or-llm","description":"Required when metric is \\"formula\\", e.g. \\"UNIQUES(A)/UNIQUES(B)\\""},"segment":{"type":"string","required":false,"visibility":"user-or-llm","description":"JSON segment definition(s) applied to the query"},"dataResidency":{"type":"string","required":false,"visibility":"user-or-llm","description":"Data residency region: \\"us\\" (default) or \\"eu\\""}},"oauth":{"required":false,"provider":"amplitude","credentialKind":"service-account","credentialParams":{"apiKey":"providerWorkspaceId","secretKey":"accessToken","dataResidency":"domain"},"credentialSuppliedParams":["apiKey","secretKey","dataResidency"]},"hostedApiKey":"none"},"amplitude_funnels":{"id":"amplitude_funnels","name":"Amplitude Funnels","description":"Analyze conversion rates and drop-off between a sequence of events.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Amplitude API Key"},"secretKey":{"type":"string","required":true,"visibility":"user-only","description":"Amplitude Secret Key"},"events":{"type":"string","required":true,"visibility":"user-or-llm","description":"JSON array of event objects, one per funnel step in order, e.g. [{\\"event_type\\":\\"signup\\"},{\\"event_type\\":\\"purchase\\"}]"},"start":{"type":"string","required":true,"visibility":"user-or-llm","description":"Start date in YYYYMMDD format"},"end":{"type":"string","required":true,"visibility":"user-or-llm","description":"End date in YYYYMMDD format"},"mode":{"type":"string","required":false,"visibility":"user-or-llm","description":"Funnel ordering: \\"ordered\\", \\"unordered\\", or \\"sequential\\" (default: ordered)"},"userType":{"type":"string","required":false,"visibility":"user-or-llm","description":"User type: \\"new\\" or \\"active\\" (default: active)"},"interval":{"type":"string","required":false,"visibility":"user-or-llm","description":"Time interval: -300000 (real-time), -3600000 (hourly), 1 (daily), 7 (weekly), or 30 (monthly)"},"conversionWindowSeconds":{"type":"string","required":false,"visibility":"user-or-llm","description":"Conversion window in seconds (default: 2592000, i.e. 30 days)"},"groupBy":{"type":"string","required":false,"visibility":"user-or-llm","description":"Property to group by (limit: one; prefix custom properties with \\"gp:\\")"},"limit":{"type":"string","required":false,"visibility":"user-or-llm","description":"Maximum number of group-by values (default: 100, max: 1000)"},"segment":{"type":"string","required":false,"visibility":"user-or-llm","description":"JSON segment definition(s) applied to the query"},"dataResidency":{"type":"string","required":false,"visibility":"user-or-llm","description":"Data residency region: \\"us\\" (default) or \\"eu\\""}},"oauth":{"required":false,"provider":"amplitude","credentialKind":"service-account","credentialParams":{"apiKey":"providerWorkspaceId","secretKey":"accessToken","dataResidency":"domain"},"credentialSuppliedParams":["apiKey","secretKey","dataResidency"]},"hostedApiKey":"none"},"amplitude_get_active_users":{"id":"amplitude_get_active_users","name":"Amplitude Get Active Users","description":"Get active or new user counts over a date range from the Dashboard REST API.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Amplitude API Key"},"secretKey":{"type":"string","required":true,"visibility":"user-only","description":"Amplitude Secret Key"},"start":{"type":"string","required":true,"visibility":"user-or-llm","description":"Start date in YYYYMMDD format"},"end":{"type":"string","required":true,"visibility":"user-or-llm","description":"End date in YYYYMMDD format"},"metric":{"type":"string","required":false,"visibility":"user-or-llm","description":"Metric type: \\"active\\" or \\"new\\" (default: active)"},"interval":{"type":"string","required":false,"visibility":"user-or-llm","description":"Time interval: 1 (daily), 7 (weekly), or 30 (monthly)"},"groupBy":{"type":"string","required":false,"visibility":"user-or-llm","description":"Property name to group by"},"segment":{"type":"string","required":false,"visibility":"user-or-llm","description":"JSON segment definition(s) applied to the query"},"dataResidency":{"type":"string","required":false,"visibility":"user-or-llm","description":"Data residency region: \\"us\\" (default) or \\"eu\\""}},"oauth":{"required":false,"provider":"amplitude","credentialKind":"service-account","credentialParams":{"apiKey":"providerWorkspaceId","secretKey":"accessToken","dataResidency":"domain"},"credentialSuppliedParams":["apiKey","secretKey","dataResidency"]},"hostedApiKey":"none"},"amplitude_get_revenue":{"id":"amplitude_get_revenue","name":"Amplitude Get Revenue","description":"Get revenue LTV data including ARPU, ARPPU, total revenue, and paying user counts.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Amplitude API Key"},"secretKey":{"type":"string","required":true,"visibility":"user-only","description":"Amplitude Secret Key"},"start":{"type":"string","required":true,"visibility":"user-or-llm","description":"Start date in YYYYMMDD format"},"end":{"type":"string","required":true,"visibility":"user-or-llm","description":"End date in YYYYMMDD format"},"metric":{"type":"string","required":false,"visibility":"user-or-llm","description":"Metric: 0 (ARPU), 1 (ARPPU), 2 (Total Revenue), 3 (Paying Users)"},"interval":{"type":"string","required":false,"visibility":"user-or-llm","description":"Time interval: 1 (daily), 7 (weekly), or 30 (monthly)"},"groupBy":{"type":"string","required":false,"visibility":"user-or-llm","description":"Property name to group by (limit: one)"},"segment":{"type":"string","required":false,"visibility":"user-or-llm","description":"JSON segment definition(s) applied to the query"},"dataResidency":{"type":"string","required":false,"visibility":"user-or-llm","description":"Data residency region: \\"us\\" (default) or \\"eu\\""}},"oauth":{"required":false,"provider":"amplitude","credentialKind":"service-account","credentialParams":{"apiKey":"providerWorkspaceId","secretKey":"accessToken","dataResidency":"domain"},"credentialSuppliedParams":["apiKey","secretKey","dataResidency"]},"hostedApiKey":"none"},"amplitude_group_identify":{"id":"amplitude_group_identify","name":"Amplitude Group Identify","description":"Set group-level properties in Amplitude. Supports $set, $setOnce, $add, $append, $unset operations.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Amplitude API Key"},"groupType":{"type":"string","required":true,"visibility":"user-or-llm","description":"Group classification (e.g., \\"company\\", \\"org_id\\")"},"groupValue":{"type":"string","required":true,"visibility":"user-or-llm","description":"Specific group identifier (e.g., \\"Acme Corp\\")"},"groupProperties":{"type":"string","required":true,"visibility":"user-or-llm","description":"JSON object of group properties. Use operations like $set, $setOnce, $add, $append, $unset."},"dataResidency":{"type":"string","required":false,"visibility":"user-or-llm","description":"Data residency region: \\"us\\" (default) or \\"eu\\""}},"oauth":{"required":false,"provider":"amplitude","credentialKind":"service-account","credentialParams":{"apiKey":"providerWorkspaceId","dataResidency":"domain"},"credentialSuppliedParams":["apiKey","dataResidency"]},"hostedApiKey":"none"},"amplitude_identify_user":{"id":"amplitude_identify_user","name":"Amplitude Identify User","description":"Set user properties in Amplitude using the Identify API. Supports $set, $setOnce, $add, $append, $unset operations.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Amplitude API Key"},"userId":{"type":"string","required":false,"visibility":"user-or-llm","description":"User ID (required if no device_id)"},"deviceId":{"type":"string","required":false,"visibility":"user-or-llm","description":"Device ID (required if no user_id)"},"userProperties":{"type":"string","required":true,"visibility":"user-or-llm","description":"JSON object of user properties. Use operations like $set, $setOnce, $add, $append, $unset."},"dataResidency":{"type":"string","required":false,"visibility":"user-or-llm","description":"Data residency region: \\"us\\" (default) or \\"eu\\""}},"oauth":{"required":false,"provider":"amplitude","credentialKind":"service-account","credentialParams":{"apiKey":"providerWorkspaceId","dataResidency":"domain"},"credentialSuppliedParams":["apiKey","dataResidency"]},"hostedApiKey":"none"},"amplitude_list_events":{"id":"amplitude_list_events","name":"Amplitude List Events","description":"List all event types in the Amplitude project with their weekly totals and unique counts.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Amplitude API Key"},"secretKey":{"type":"string","required":true,"visibility":"user-only","description":"Amplitude Secret Key"},"dataResidency":{"type":"string","required":false,"visibility":"user-or-llm","description":"Data residency region: \\"us\\" (default) or \\"eu\\""}},"oauth":{"required":false,"provider":"amplitude","credentialKind":"service-account","credentialParams":{"apiKey":"providerWorkspaceId","secretKey":"accessToken","dataResidency":"domain"},"credentialSuppliedParams":["apiKey","secretKey","dataResidency"]},"hostedApiKey":"none"},"amplitude_realtime_active_users":{"id":"amplitude_realtime_active_users","name":"Amplitude Real-time Active Users","description":"Get real-time active user counts at 5-minute granularity for the last 2 days.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Amplitude API Key"},"secretKey":{"type":"string","required":true,"visibility":"user-only","description":"Amplitude Secret Key"},"dataResidency":{"type":"string","required":false,"visibility":"user-or-llm","description":"Data residency region: \\"us\\" (default) or \\"eu\\""}},"oauth":{"required":false,"provider":"amplitude","credentialKind":"service-account","credentialParams":{"apiKey":"providerWorkspaceId","secretKey":"accessToken","dataResidency":"domain"},"credentialSuppliedParams":["apiKey","secretKey","dataResidency"]},"hostedApiKey":"none"},"amplitude_retention":{"id":"amplitude_retention","name":"Amplitude Retention","description":"Measure how many users return to perform an action after a starting action.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Amplitude API Key"},"secretKey":{"type":"string","required":true,"visibility":"user-only","description":"Amplitude Secret Key"},"startEvent":{"type":"string","required":true,"visibility":"user-or-llm","description":"JSON starting event object, e.g. {\\"event_type\\":\\"_new\\"} or {\\"event_type\\":\\"_active\\"}"},"returnEvent":{"type":"string","required":true,"visibility":"user-or-llm","description":"JSON returning event object, e.g. {\\"event_type\\":\\"_all\\"} or {\\"event_type\\":\\"_active\\"}"},"start":{"type":"string","required":true,"visibility":"user-or-llm","description":"Start date in YYYYMMDD format"},"end":{"type":"string","required":true,"visibility":"user-or-llm","description":"End date in YYYYMMDD format"},"retentionMode":{"type":"string","required":false,"visibility":"user-or-llm","description":"Retention type: \\"bracket\\", \\"rolling\\", or \\"n-day\\" (default: n-day)"},"retentionBrackets":{"type":"string","required":false,"visibility":"user-or-llm","description":"Required when Retention Mode is \\"bracket\\". Day ranges, e.g. [[0,4]]"},"interval":{"type":"string","required":false,"visibility":"user-or-llm","description":"Time interval: 1 (daily), 7 (weekly), or 30 (monthly)"},"groupBy":{"type":"string","required":false,"visibility":"user-or-llm","description":"Property to group by (limit: one; prefix custom properties with \\"gp:\\")"},"segment":{"type":"string","required":false,"visibility":"user-or-llm","description":"JSON segment definition(s) applied to the query"},"dataResidency":{"type":"string","required":false,"visibility":"user-or-llm","description":"Data residency region: \\"us\\" (default) or \\"eu\\""}},"oauth":{"required":false,"provider":"amplitude","credentialKind":"service-account","credentialParams":{"apiKey":"providerWorkspaceId","secretKey":"accessToken","dataResidency":"domain"},"credentialSuppliedParams":["apiKey","secretKey","dataResidency"]},"hostedApiKey":"none"},"amplitude_send_event":{"id":"amplitude_send_event","name":"Amplitude Send Event","description":"Track an event in Amplitude using the HTTP V2 API.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Amplitude API Key"},"userId":{"type":"string","required":false,"visibility":"user-or-llm","description":"User ID (required if no device_id)"},"deviceId":{"type":"string","required":false,"visibility":"user-or-llm","description":"Device ID (required if no user_id)"},"eventType":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the event (e.g., \\"page_view\\", \\"purchase\\")"},"eventProperties":{"type":"string","required":false,"visibility":"user-or-llm","description":"JSON object of custom event properties"},"userProperties":{"type":"string","required":false,"visibility":"user-or-llm","description":"JSON object of user properties to set (supports $set, $setOnce, $add, $append, $unset)"},"time":{"type":"string","required":false,"visibility":"user-or-llm","description":"Event timestamp in milliseconds since epoch"},"sessionId":{"type":"string","required":false,"visibility":"user-or-llm","description":"Session start time in milliseconds since epoch"},"insertId":{"type":"string","required":false,"visibility":"user-or-llm","description":"Unique ID for deduplication (within 7-day window)"},"appVersion":{"type":"string","required":false,"visibility":"user-or-llm","description":"Application version string"},"platform":{"type":"string","required":false,"visibility":"user-or-llm","description":"Platform (e.g., \\"Web\\", \\"iOS\\", \\"Android\\")"},"country":{"type":"string","required":false,"visibility":"user-or-llm","description":"Two-letter country code"},"language":{"type":"string","required":false,"visibility":"user-or-llm","description":"Language code (e.g., \\"en\\")"},"ip":{"type":"string","required":false,"visibility":"user-or-llm","description":"IP address for geo-location"},"price":{"type":"string","required":false,"visibility":"user-or-llm","description":"Price of the item purchased"},"quantity":{"type":"string","required":false,"visibility":"user-or-llm","description":"Quantity of items purchased"},"revenue":{"type":"string","required":false,"visibility":"user-or-llm","description":"Revenue amount"},"productId":{"type":"string","required":false,"visibility":"user-or-llm","description":"Product identifier"},"revenueType":{"type":"string","required":false,"visibility":"user-or-llm","description":"Revenue type (e.g., \\"purchase\\", \\"refund\\")"},"dataResidency":{"type":"string","required":false,"visibility":"user-or-llm","description":"Data residency region: \\"us\\" (default) or \\"eu\\""}},"oauth":{"required":false,"provider":"amplitude","credentialKind":"service-account","credentialParams":{"apiKey":"providerWorkspaceId","dataResidency":"domain"},"credentialSuppliedParams":["apiKey","dataResidency"]},"hostedApiKey":"none"},"amplitude_user_activity":{"id":"amplitude_user_activity","name":"Amplitude User Activity","description":"Get the event stream for a specific user by their Amplitude ID.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Amplitude API Key"},"secretKey":{"type":"string","required":true,"visibility":"user-only","description":"Amplitude Secret Key"},"amplitudeId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Amplitude internal user ID"},"offset":{"type":"string","required":false,"visibility":"user-or-llm","description":"Offset for pagination (default 0)"},"limit":{"type":"string","required":false,"visibility":"user-or-llm","description":"Maximum number of events to return (default 1000, max 1000)"},"direction":{"type":"string","required":false,"visibility":"user-or-llm","description":"Sort direction: \\"latest\\" or \\"earliest\\" (default: latest)"},"dataResidency":{"type":"string","required":false,"visibility":"user-or-llm","description":"Data residency region: \\"us\\" (default) or \\"eu\\""}},"oauth":{"required":false,"provider":"amplitude","credentialKind":"service-account","credentialParams":{"apiKey":"providerWorkspaceId","secretKey":"accessToken","dataResidency":"domain"},"credentialSuppliedParams":["apiKey","secretKey","dataResidency"]},"hostedApiKey":"none"},"amplitude_user_profile":{"id":"amplitude_user_profile","name":"Amplitude User Profile","description":"Get a user profile including properties, cohort memberships, and computed properties. Not available for EU data-residency projects.","version":"1.0.0","params":{"apiKey":{"type":"string","required":false,"visibility":"user-only","description":"Amplitude API Key. With it, the request authenticates with both keys over Basic auth"},"secretKey":{"type":"string","required":true,"visibility":"user-only","description":"Amplitude Secret Key"},"userId":{"type":"string","required":false,"visibility":"user-or-llm","description":"External user ID (required if no device_id)"},"deviceId":{"type":"string","required":false,"visibility":"user-or-llm","description":"Device ID (required if no user_id)"},"getAmpProps":{"type":"string","required":false,"visibility":"user-or-llm","description":"Include Amplitude user properties (true/false, default: false)"},"getCohortIds":{"type":"string","required":false,"visibility":"user-or-llm","description":"Include cohort IDs the user belongs to (true/false, default: false)"},"getComputations":{"type":"string","required":false,"visibility":"user-or-llm","description":"Include computed user properties (true/false, default: false)"}},"oauth":{"required":false,"provider":"amplitude","credentialKind":"service-account","credentialParams":{"apiKey":"providerWorkspaceId","secretKey":"accessToken"},"credentialSuppliedParams":["apiKey","secretKey"]},"hostedApiKey":"none"},"amplitude_user_search":{"id":"amplitude_user_search","name":"Amplitude User Search","description":"Search for a user by User ID, Device ID, or Amplitude ID using the Dashboard REST API.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Amplitude API Key"},"secretKey":{"type":"string","required":true,"visibility":"user-only","description":"Amplitude Secret Key"},"user":{"type":"string","required":true,"visibility":"user-or-llm","description":"User ID, Device ID, or Amplitude ID to search for"},"dataResidency":{"type":"string","required":false,"visibility":"user-or-llm","description":"Data residency region: \\"us\\" (default) or \\"eu\\""}},"oauth":{"required":false,"provider":"amplitude","credentialKind":"service-account","credentialParams":{"apiKey":"providerWorkspaceId","secretKey":"accessToken","dataResidency":"domain"},"credentialSuppliedParams":["apiKey","secretKey","dataResidency"]},"hostedApiKey":"none"},"apify_get_dataset_items":{"id":"apify_get_dataset_items","name":"APIFY Get Dataset Items","description":"Retrieve items stored in an APIFY dataset","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"APIFY API token from console.apify.com/account#/integrations"},"datasetId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Dataset ID to read items from. Example: \\"9RnD3Pql2vGZkc5H5\\""},"itemLimit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Max items to return (1-250000). Default: all items. Example: 500"},"offset":{"type":"number","required":false,"visibility":"user-or-llm","description":"Number of items to skip at the start. Default: 0"},"fields":{"type":"string","required":false,"visibility":"user-or-llm","description":"Comma-separated list of fields to include. Example: \\"title,url,price\\""}},"oauth":{"required":false,"provider":"apify","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"apify_get_run":{"id":"apify_get_run","name":"APIFY Get Run","description":"Get the status and details of an APIFY actor run","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"APIFY API token from console.apify.com/account#/integrations"},"runId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Actor run ID to fetch. Example: \\"HG7ML7M8z78YcAPEB\\""}},"oauth":{"required":false,"provider":"apify","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"apify_run_actor_async":{"id":"apify_run_actor_async","name":"APIFY Run Actor (Async)","description":"Start an APIFY Actor run and poll it within the same workflow step until completion or the polling deadline","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"APIFY API token from console.apify.com/account#/integrations"},"actorId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Actor ID or username/actor-name. Examples: \\"apify/web-scraper\\", \\"janedoe/my-actor\\", \\"moJRLRc85AitArpNN\\""},"input":{"type":"string","required":false,"visibility":"user-or-llm","description":"Actor input as JSON string. Example: { \\"startUrls\\": [ { \\"url\\": \\"https://example.com\\" } ], \\"maxPages\\": 10 }"},"waitForFinish":{"type":"number","required":false,"visibility":"user-or-llm","description":"Initial wait time in seconds (0-60) before polling starts. Example: 30"},"itemLimit":{"type":"number","required":false,"default":100,"visibility":"user-or-llm","description":"Max dataset items to fetch (1-250000). Default: 100. Example: 500"},"memory":{"type":"number","required":false,"visibility":"user-or-llm","description":"Memory in megabytes allocated for the actor run (128-32768). Example: 1024 for 1GB, 2048 for 2GB"},"timeout":{"type":"number","required":false,"visibility":"user-or-llm","description":"Timeout in seconds for the actor run. Example: 300 for 5 minutes, 3600 for 1 hour"},"build":{"type":"string","required":false,"visibility":"user-or-llm","description":"Actor build to run. Examples: \\"latest\\", \\"beta\\", \\"1.2.3\\", \\"build-tag-name\\""}},"oauth":{"required":false,"provider":"apify","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"apify_run_actor_sync":{"id":"apify_run_actor_sync","name":"APIFY Run Actor (Sync)","description":"Run an APIFY actor synchronously and get results (max 5 minutes)","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"APIFY API token from console.apify.com/account#/integrations"},"actorId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Actor ID or username/actor-name. Examples: \\"apify/web-scraper\\", \\"janedoe/my-actor\\", \\"moJRLRc85AitArpNN\\""},"input":{"type":"string","required":false,"visibility":"user-or-llm","description":"Actor input as JSON string. Example: { \\"startUrls\\": [ { \\"url\\": \\"https://example.com\\" } ], \\"maxPages\\": 10 }"},"memory":{"type":"number","required":false,"visibility":"user-or-llm","description":"Memory in megabytes allocated for the actor run (128-32768). Example: 1024 for 1GB, 2048 for 2GB"},"timeout":{"type":"number","required":false,"visibility":"user-or-llm","description":"Timeout in seconds for the actor run. Example: 300 for 5 minutes, 3600 for 1 hour"},"build":{"type":"string","required":false,"visibility":"user-or-llm","description":"Actor build to run. Examples: \\"latest\\", \\"beta\\", \\"1.2.3\\", \\"build-tag-name\\""}},"oauth":{"required":false,"provider":"apify","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"apify_run_task":{"id":"apify_run_task","name":"APIFY Run Task","description":"Run a saved APIFY actor task synchronously and get dataset items (max 5 minutes)","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"APIFY API token from console.apify.com/account#/integrations"},"taskId":{"type":"string","required":true,"visibility":"user-or-llm","description":"Task ID or username/task-name. Examples: \\"janedoe/my-task\\", \\"moJRLRc85AitArpNN\\""},"input":{"type":"string","required":false,"visibility":"user-or-llm","description":"JSON string that overrides the task\'s saved input. Example: { \\"startUrls\\": [ { \\"url\\": \\"https://example.com\\" } ] }"},"itemLimit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Max dataset items to return (1-250000). Example: 500"},"memory":{"type":"number","required":false,"visibility":"user-or-llm","description":"Memory in megabytes allocated for the run (128-32768). Example: 1024 for 1GB"},"timeout":{"type":"number","required":false,"visibility":"user-or-llm","description":"Timeout in seconds for the run. Example: 300 for 5 minutes"},"build":{"type":"string","required":false,"visibility":"user-or-llm","description":"Actor build to run. Examples: \\"latest\\", \\"beta\\", \\"1.2.3\\""}},"oauth":{"required":false,"provider":"apify","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"apollo_account_bulk_create":{"id":"apollo_account_bulk_create","name":"Apollo Bulk Create Accounts","description":"Create up to 100 accounts at once in your Apollo database. Set run_dedupe=true to deduplicate by domain, organization_id, and name. Master key required.","version":"1.0.0","params":{"credentialType":{"type":"string","required":false,"visibility":"hidden","description":"Stored credential type supplied by credential resolution"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Apollo API key (master key required)"},"accounts":{"type":"array","required":true,"visibility":"user-or-llm","description":"Array of accounts to create (max 100). Each account should include a name, and may optionally include domain, phone, phone_status_cd, raw_address, owner_id, linkedin_url, facebook_url, twitter_url, salesforce_id, and hubspot_id."},"append_label_names":{"type":"array","required":false,"visibility":"user-only","description":"Array of label names to add to ALL accounts in this request"},"run_dedupe":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"When true, performs aggressive deduplication by domain, organization_id, and name (defaults to false)"}},"oauth":{"required":false,"provider":"apollo","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"],"authoritativeParams":["credentialType"]},"hostedApiKey":"none"},"apollo_account_bulk_update":{"id":"apollo_account_bulk_update","name":"Apollo Bulk Update Accounts","description":"Update up to 1000 existing accounts at once in your Apollo database (higher limit than contacts!). Each account must include an id field. Master key required.","version":"1.0.0","params":{"credentialType":{"type":"string","required":false,"visibility":"hidden","description":"Stored credential type supplied by credential resolution"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Apollo API key (master key required)"},"account_ids":{"type":"array","required":false,"visibility":"user-or-llm","description":"Array of account IDs to update with the same values (max 1000). Use with name/owner_id for uniform updates. Use either this OR account_attributes."},"name":{"type":"string","required":false,"visibility":"user-or-llm","description":"When using account_ids, apply this name to all accounts"},"owner_id":{"type":"string","required":false,"visibility":"user-or-llm","description":"When using account_ids, apply this owner to all accounts"},"account_stage_id":{"type":"string","required":false,"visibility":"user-or-llm","description":"When using account_ids, apply this account stage to all accounts"},"account_attributes":{"type":"json","required":false,"visibility":"user-or-llm","description":"Array of account objects with individual updates (each must include id). Example: [{\\"id\\": \\"acc1\\", \\"name\\": \\"Acme\\", \\"owner_id\\": \\"u1\\", \\"account_stage_id\\": \\"s1\\", \\"typed_custom_fields\\": {\\"field_id\\": \\"value\\"}}]"},"async":{"type":"boolean","required":false,"visibility":"user-only","description":"When true, processes the update asynchronously. Only supported when using account_ids; returns 422 if used with account_attributes."}},"oauth":{"required":false,"provider":"apollo","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"],"authoritativeParams":["credentialType"]},"hostedApiKey":"none"},"apollo_account_create":{"id":"apollo_account_create","name":"Apollo Create Account","description":"Create a new account (company) in your Apollo database","version":"1.0.0","params":{"credentialType":{"type":"string","required":false,"visibility":"hidden","description":"Stored credential type supplied by credential resolution"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Apollo API key (master key required)"},"name":{"type":"string","required":true,"visibility":"user-or-llm","description":"Company name (e.g., \\"Acme Corporation\\")"},"domain":{"type":"string","required":false,"visibility":"user-or-llm","description":"Company domain without www. prefix (e.g., \\"acme.com\\")"},"phone":{"type":"string","required":false,"visibility":"user-or-llm","description":"Primary phone number for the account"},"owner_id":{"type":"string","required":false,"visibility":"user-only","description":"Apollo user ID of the account owner"},"account_stage_id":{"type":"string","required":false,"visibility":"user-only","description":"Apollo ID for the account stage to assign this account to"},"raw_address":{"type":"string","required":false,"visibility":"user-or-llm","description":"Corporate location (e.g., \\"San Francisco, CA, USA\\")"},"typed_custom_fields":{"type":"json","required":false,"visibility":"user-only","description":"Custom field values as { custom_field_id: value } map"}},"oauth":{"required":false,"provider":"apollo","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"],"authoritativeParams":["credentialType"]},"hostedApiKey":"none"},"apollo_account_search":{"id":"apollo_account_search","name":"Apollo Search Accounts","description":"Search your team\'s accounts in Apollo. Display limit: 50,000 records (100 records per page, 500 pages max). Use filters to narrow results. Master key required.","version":"1.0.0","params":{"credentialType":{"type":"string","required":false,"visibility":"hidden","description":"Stored credential type supplied by credential resolution"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Apollo API key (master key required)"},"q_organization_name":{"type":"string","required":false,"visibility":"user-or-llm","description":"Filter accounts by organization name (partial-match search)"},"account_stage_ids":{"type":"array","required":false,"visibility":"user-only","description":"Filter by account stage IDs"},"account_label_ids":{"type":"array","required":false,"visibility":"user-only","description":"Filter by account label IDs"},"sort_by_field":{"type":"string","required":false,"visibility":"user-or-llm","description":"Sort field: \\"account_last_activity_date\\", \\"account_created_at\\", or \\"account_updated_at\\""},"sort_ascending":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Sort ascending when true. Defaults to descending."},"page":{"type":"number","required":false,"visibility":"user-or-llm","description":"Page number for pagination (e.g., 1, 2, 3)"},"per_page":{"type":"number","required":false,"visibility":"user-or-llm","description":"Results per page, max 100 (e.g., 25, 50, 100)"}},"oauth":{"required":false,"provider":"apollo","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"],"authoritativeParams":["credentialType"]},"hostedApiKey":"none"},"apollo_account_update":{"id":"apollo_account_update","name":"Apollo Update Account","description":"Update an existing account in your Apollo database","version":"1.0.0","params":{"credentialType":{"type":"string","required":false,"visibility":"hidden","description":"Stored credential type supplied by credential resolution"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Apollo API key"},"account_id":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the account to update (e.g., \\"acc_abc123\\")"},"name":{"type":"string","required":false,"visibility":"user-or-llm","description":"Company name (e.g., \\"Acme Corporation\\")"},"domain":{"type":"string","required":false,"visibility":"user-or-llm","description":"Company domain (e.g., \\"acme.com\\")"},"phone":{"type":"string","required":false,"visibility":"user-or-llm","description":"Company phone number"},"owner_id":{"type":"string","required":false,"visibility":"user-only","description":"Apollo user ID of the account owner"},"account_stage_id":{"type":"string","required":false,"visibility":"user-only","description":"Apollo ID for the account stage to assign this account to"},"raw_address":{"type":"string","required":false,"visibility":"user-or-llm","description":"Corporate location (e.g., \\"San Francisco, CA, USA\\")"},"typed_custom_fields":{"type":"json","required":false,"visibility":"user-only","description":"Custom field values as { custom_field_id: value } map"}},"oauth":{"required":false,"provider":"apollo","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"],"authoritativeParams":["credentialType"]},"hostedApiKey":"none"},"apollo_contact_bulk_create":{"id":"apollo_contact_bulk_create","name":"Apollo Bulk Create Contacts","description":"Create up to 100 contacts at once in your Apollo database. Supports deduplication to prevent creating duplicate contacts. Master key required.","version":"1.0.0","params":{"credentialType":{"type":"string","required":false,"visibility":"hidden","description":"Stored credential type supplied by credential resolution"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Apollo API key (master key required)"},"contacts":{"type":"array","required":true,"visibility":"user-or-llm","description":"Array of contacts to create (max 100). Each contact may include first_name, last_name, email, title, organization_name, account_id, owner_id, contact_stage_id, linkedin_url, phone (single string) or phone_numbers (array of {raw_number, position}), contact_emails, typed_custom_fields, and CRM IDs (salesforce_contact_id, hubspot_id, team_id) for cross-system matching"},"append_label_names":{"type":"array","required":false,"visibility":"user-or-llm","description":"Label names to add to all contacts in this request (e.g., [\\"Hot Lead\\"])"},"run_dedupe":{"type":"boolean","required":false,"visibility":"user-only","description":"Enable deduplication to prevent creating duplicate contacts. When true, existing contacts are returned without modification"}},"oauth":{"required":false,"provider":"apollo","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"],"authoritativeParams":["credentialType"]},"hostedApiKey":"none"},"apollo_contact_bulk_update":{"id":"apollo_contact_bulk_update","name":"Apollo Bulk Update Contacts","description":"Update up to 100 existing contacts at once in your Apollo database. Each contact must include an id field. Master key required.","version":"1.0.0","params":{"credentialType":{"type":"string","required":false,"visibility":"hidden","description":"Stored credential type supplied by credential resolution"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Apollo API key (master key required)"},"contact_ids":{"type":"array","required":false,"visibility":"user-or-llm","description":"Array of contact IDs to update. Must be paired with an object-form contact_attributes specifying the fields to apply uniformly to all listed contacts."},"contact_attributes":{"type":"json","required":false,"visibility":"user-or-llm","description":"Required. Either an array of per-contact updates (each with id) — used standalone — or a single object of attributes to apply to all contact_ids. Supported fields: owner_id, email, organization_name, title, first_name, last_name, account_id, present_raw_address, linkedin_url, typed_custom_fields"},"async":{"type":"boolean","required":false,"visibility":"user-only","description":"Force asynchronous processing. Automatically enabled for >100 contacts"}},"oauth":{"required":false,"provider":"apollo","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"],"authoritativeParams":["credentialType"]},"hostedApiKey":"none"},"apollo_contact_create":{"id":"apollo_contact_create","name":"Apollo Create Contact","description":"Create a new contact in your Apollo database","version":"1.0.0","params":{"credentialType":{"type":"string","required":false,"visibility":"hidden","description":"Stored credential type supplied by credential resolution"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Apollo API key"},"first_name":{"type":"string","required":true,"visibility":"user-or-llm","description":"First name of the contact"},"last_name":{"type":"string","required":true,"visibility":"user-or-llm","description":"Last name of the contact"},"email":{"type":"string","required":false,"visibility":"user-or-llm","description":"Email address of the contact"},"title":{"type":"string","required":false,"visibility":"user-or-llm","description":"Job title (e.g., \\"VP of Sales\\", \\"Software Engineer\\")"},"account_id":{"type":"string","required":false,"visibility":"user-or-llm","description":"Apollo account ID to associate with (e.g., \\"acc_abc123\\")"},"owner_id":{"type":"string","required":false,"visibility":"user-only","description":"User ID of the contact owner (accepted by Apollo but not officially documented for POST /contacts)"},"organization_name":{"type":"string","required":false,"visibility":"user-or-llm","description":"Name of the contact\'s employer (e.g., \\"Apollo\\")"},"website_url":{"type":"string","required":false,"visibility":"user-or-llm","description":"Corporate website URL (e.g., \\"https://www.apollo.io/\\")"},"label_names":{"type":"array","required":false,"visibility":"user-or-llm","description":"Lists/labels to add the contact to (e.g., [\\"Prospects\\"])"},"contact_stage_id":{"type":"string","required":false,"visibility":"user-or-llm","description":"Apollo ID for the contact stage"},"present_raw_address":{"type":"string","required":false,"visibility":"user-or-llm","description":"Personal location for the contact (e.g., \\"Atlanta, United States\\")"},"direct_phone":{"type":"string","required":false,"visibility":"user-or-llm","description":"Primary phone number"},"corporate_phone":{"type":"string","required":false,"visibility":"user-or-llm","description":"Work/office phone number"},"mobile_phone":{"type":"string","required":false,"visibility":"user-or-llm","description":"Mobile phone number"},"home_phone":{"type":"string","required":false,"visibility":"user-or-llm","description":"Home phone number"},"other_phone":{"type":"string","required":false,"visibility":"user-or-llm","description":"Alternative phone number"},"typed_custom_fields":{"type":"json","required":false,"visibility":"user-or-llm","description":"Custom field values keyed by custom field ID"},"run_dedupe":{"type":"boolean","required":false,"visibility":"user-only","description":"When true, Apollo deduplicates against existing contacts"}},"oauth":{"required":false,"provider":"apollo","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"],"authoritativeParams":["credentialType"]},"hostedApiKey":"none"},"apollo_contact_search":{"id":"apollo_contact_search","name":"Apollo Search Contacts","description":"Search your team\'s contacts in Apollo","version":"1.0.0","params":{"credentialType":{"type":"string","required":false,"visibility":"hidden","description":"Stored credential type supplied by credential resolution"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Apollo API key"},"q_keywords":{"type":"string","required":false,"visibility":"user-or-llm","description":"Keywords to search for"},"contact_stage_ids":{"type":"array","required":false,"visibility":"user-only","description":"Filter by contact stage IDs"},"contact_label_ids":{"type":"array","required":false,"visibility":"user-only","description":"Filter by Apollo label IDs (lists)"},"sort_by_field":{"type":"string","required":false,"visibility":"user-only","description":"Sort field: contact_last_activity_date, contact_email_last_opened_at, contact_email_last_clicked_at, contact_created_at, or contact_updated_at"},"sort_ascending":{"type":"boolean","required":false,"visibility":"user-only","description":"When true, sort ascending. Must be used together with sort_by_field"},"page":{"type":"number","required":false,"visibility":"user-or-llm","description":"Page number for pagination (e.g., 1, 2, 3)"},"per_page":{"type":"number","required":false,"visibility":"user-or-llm","description":"Results per page, max 100 (e.g., 25, 50, 100)"}},"oauth":{"required":false,"provider":"apollo","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"],"authoritativeParams":["credentialType"]},"hostedApiKey":"none"},"apollo_contact_update":{"id":"apollo_contact_update","name":"Apollo Update Contact","description":"Update an existing contact in your Apollo database","version":"1.0.0","params":{"credentialType":{"type":"string","required":false,"visibility":"hidden","description":"Stored credential type supplied by credential resolution"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Apollo API key"},"contact_id":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the contact to update (e.g., \\"con_abc123\\")"},"first_name":{"type":"string","required":false,"visibility":"user-or-llm","description":"First name of the contact"},"last_name":{"type":"string","required":false,"visibility":"user-or-llm","description":"Last name of the contact"},"email":{"type":"string","required":false,"visibility":"user-or-llm","description":"Email address"},"title":{"type":"string","required":false,"visibility":"user-or-llm","description":"Job title (e.g., \\"VP of Sales\\", \\"Software Engineer\\")"},"account_id":{"type":"string","required":false,"visibility":"user-or-llm","description":"Apollo account ID (e.g., \\"acc_abc123\\")"},"owner_id":{"type":"string","required":false,"visibility":"user-only","description":"User ID of the contact owner (accepted by Apollo but not officially documented for PATCH /contacts/{id})"},"organization_name":{"type":"string","required":false,"visibility":"user-or-llm","description":"Name of the contact\'s employer (e.g., \\"Apollo\\")"},"website_url":{"type":"string","required":false,"visibility":"user-or-llm","description":"Corporate website URL (e.g., \\"https://www.apollo.io/\\")"},"label_names":{"type":"array","required":false,"visibility":"user-or-llm","description":"Lists/labels to add the contact to (e.g., [\\"Prospects\\"])"},"contact_stage_id":{"type":"string","required":false,"visibility":"user-or-llm","description":"Apollo ID for the contact stage"},"present_raw_address":{"type":"string","required":false,"visibility":"user-or-llm","description":"Personal location for the contact (e.g., \\"Atlanta, United States\\")"},"direct_phone":{"type":"string","required":false,"visibility":"user-or-llm","description":"Primary phone number"},"corporate_phone":{"type":"string","required":false,"visibility":"user-or-llm","description":"Work/office phone number"},"mobile_phone":{"type":"string","required":false,"visibility":"user-or-llm","description":"Mobile phone number"},"home_phone":{"type":"string","required":false,"visibility":"user-or-llm","description":"Home phone number"},"other_phone":{"type":"string","required":false,"visibility":"user-or-llm","description":"Alternative phone number"},"typed_custom_fields":{"type":"json","required":false,"visibility":"user-or-llm","description":"Custom field values keyed by custom field ID"}},"oauth":{"required":false,"provider":"apollo","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"],"authoritativeParams":["credentialType"]},"hostedApiKey":"none"},"apollo_email_accounts":{"id":"apollo_email_accounts","name":"Apollo Get Email Accounts","description":"Get list of team\'s linked email accounts in Apollo","version":"1.0.0","params":{"credentialType":{"type":"string","required":false,"visibility":"hidden","description":"Stored credential type supplied by credential resolution"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Apollo API key (master key required)"}},"oauth":{"required":false,"provider":"apollo","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"],"authoritativeParams":["credentialType"]},"hostedApiKey":"none"},"apollo_opportunity_create":{"id":"apollo_opportunity_create","name":"Apollo Create Opportunity","description":"Create a new deal for an account in your Apollo database (master key required)","version":"1.0.0","params":{"credentialType":{"type":"string","required":false,"visibility":"hidden","description":"Stored credential type supplied by credential resolution"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Apollo API key (master key required)"},"name":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the opportunity/deal (e.g., \\"Enterprise License - Q1\\")"},"account_id":{"type":"string","required":false,"visibility":"user-or-llm","description":"ID of the account this opportunity belongs to (e.g., \\"acc_abc123\\")"},"amount":{"type":"string","required":false,"visibility":"user-or-llm","description":"Monetary value as a plain number string with no commas or currency symbols"},"opportunity_stage_id":{"type":"string","required":false,"visibility":"user-only","description":"ID of the opportunity stage"},"owner_id":{"type":"string","required":false,"visibility":"user-only","description":"User ID of the opportunity owner"},"closed_date":{"type":"string","required":false,"visibility":"user-or-llm","description":"Expected close date in YYYY-MM-DD format"},"typed_custom_fields":{"type":"json","required":false,"visibility":"user-only","description":"Custom field values as { custom_field_id: value } map"}},"oauth":{"required":false,"provider":"apollo","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"],"authoritativeParams":["credentialType"]},"hostedApiKey":"none"},"apollo_opportunity_get":{"id":"apollo_opportunity_get","name":"Apollo Get Opportunity","description":"Retrieve complete details of a specific deal/opportunity by ID","version":"1.0.0","params":{"credentialType":{"type":"string","required":false,"visibility":"hidden","description":"Stored credential type supplied by credential resolution"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Apollo API key"},"opportunity_id":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the opportunity to retrieve (e.g., \\"opp_abc123\\")"}},"oauth":{"required":false,"provider":"apollo","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"],"authoritativeParams":["credentialType"]},"hostedApiKey":"none"},"apollo_opportunity_search":{"id":"apollo_opportunity_search","name":"Apollo Search Opportunities","description":"Search and list all deals/opportunities in your team\'s Apollo account","version":"1.0.0","params":{"credentialType":{"type":"string","required":false,"visibility":"hidden","description":"Stored credential type supplied by credential resolution"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Apollo API key"},"sort_by_field":{"type":"string","required":false,"visibility":"user-or-llm","description":"Sort field: \\"amount\\", \\"is_closed\\", or \\"is_won\\""},"page":{"type":"number","required":false,"visibility":"user-or-llm","description":"Page number for pagination (e.g., 1, 2, 3)"},"per_page":{"type":"number","required":false,"visibility":"user-or-llm","description":"Results per page, max 100 (e.g., 25, 50, 100)"}},"oauth":{"required":false,"provider":"apollo","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"],"authoritativeParams":["credentialType"]},"hostedApiKey":"none"},"apollo_opportunity_update":{"id":"apollo_opportunity_update","name":"Apollo Update Opportunity","description":"Update an existing deal/opportunity in your Apollo database","version":"1.0.0","params":{"credentialType":{"type":"string","required":false,"visibility":"hidden","description":"Stored credential type supplied by credential resolution"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Apollo API key"},"opportunity_id":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the opportunity to update (e.g., \\"opp_abc123\\")"},"name":{"type":"string","required":false,"visibility":"user-or-llm","description":"Name of the opportunity/deal (e.g., \\"Enterprise License - Q1\\")"},"amount":{"type":"string","required":false,"visibility":"user-or-llm","description":"Monetary value as a plain number string with no commas or currency symbols"},"opportunity_stage_id":{"type":"string","required":false,"visibility":"user-only","description":"ID of the opportunity stage"},"owner_id":{"type":"string","required":false,"visibility":"user-only","description":"User ID of the opportunity owner"},"closed_date":{"type":"string","required":false,"visibility":"user-or-llm","description":"Expected close date in YYYY-MM-DD format"},"typed_custom_fields":{"type":"json","required":false,"visibility":"user-only","description":"Custom field values as { custom_field_id: value } map"}},"oauth":{"required":false,"provider":"apollo","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"],"authoritativeParams":["credentialType"]},"hostedApiKey":"none"},"apollo_organization_bulk_enrich":{"id":"apollo_organization_bulk_enrich","name":"Apollo Bulk Organization Enrichment","description":"Enrich data for up to 10 organizations at once using Apollo","version":"1.0.0","params":{"credentialType":{"type":"string","required":false,"visibility":"hidden","description":"Stored credential type supplied by credential resolution"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Apollo API key"},"domains":{"type":"array","required":true,"visibility":"user-or-llm","description":"Array of company domains to enrich (max 10, no www. or @, e.g., [\\"apollo.io\\", \\"stripe.com\\"])"}},"oauth":{"required":false,"provider":"apollo","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"],"authoritativeParams":["credentialType"]},"hostedApiKey":"none"},"apollo_organization_enrich":{"id":"apollo_organization_enrich","name":"Apollo Organization Enrichment","description":"Enrich data for a single organization using Apollo","version":"1.0.0","params":{"credentialType":{"type":"string","required":false,"visibility":"hidden","description":"Stored credential type supplied by credential resolution"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Apollo API key"},"domain":{"type":"string","required":true,"visibility":"user-or-llm","description":"Company domain (e.g., \\"apollo.io\\", \\"acme.com\\")"}},"oauth":{"required":false,"provider":"apollo","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"],"authoritativeParams":["credentialType"]},"hostedApiKey":"none"},"apollo_organization_search":{"id":"apollo_organization_search","name":"Apollo Organization Search","description":"Search Apollo\'s database for companies using filters","version":"1.0.0","params":{"credentialType":{"type":"string","required":false,"visibility":"hidden","description":"Stored credential type supplied by credential resolution"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Apollo API key"},"organization_locations":{"type":"array","required":false,"visibility":"user-or-llm","description":"Company HQ locations (cities, US states, or countries)"},"organization_not_locations":{"type":"array","required":false,"visibility":"user-or-llm","description":"Exclude companies whose HQ is in these locations"},"organization_num_employees_ranges":{"type":"array","required":false,"visibility":"user-or-llm","description":"Employee count ranges as \\"min,max\\" strings (e.g., [\\"1,10\\", \\"250,500\\", \\"10000,20000\\"])"},"q_organization_keyword_tags":{"type":"array","required":false,"visibility":"user-or-llm","description":"Industry or keyword tags"},"q_organization_name":{"type":"string","required":false,"visibility":"user-or-llm","description":"Organization name to search for (e.g., \\"Acme\\", \\"TechCorp\\")"},"organization_ids":{"type":"array","required":false,"visibility":"user-or-llm","description":"Apollo organization IDs to include (e.g., [\\"5e66b6381e05b4008c8331b8\\"])"},"q_organization_domains_list":{"type":"array","required":false,"visibility":"user-or-llm","description":"Domain names to filter by (no www. or @, up to 1,000)"},"page":{"type":"number","required":false,"visibility":"user-or-llm","description":"Page number for pagination (e.g., 1, 2, 3)"},"per_page":{"type":"number","required":false,"visibility":"user-or-llm","description":"Results per page, max 100 (e.g., 25, 50, 100)"}},"oauth":{"required":false,"provider":"apollo","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"],"authoritativeParams":["credentialType"]},"hostedApiKey":"none"},"apollo_people_bulk_enrich":{"id":"apollo_people_bulk_enrich","name":"Apollo Bulk People Enrichment","description":"Enrich data for up to 10 people at once using Apollo","version":"1.0.0","params":{"credentialType":{"type":"string","required":false,"visibility":"hidden","description":"Stored credential type supplied by credential resolution"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Apollo API key"},"people":{"type":"array","required":true,"visibility":"user-or-llm","description":"Array of people to enrich (max 10)"},"reveal_personal_emails":{"type":"boolean","required":false,"visibility":"user-only","description":"Reveal personal email addresses (uses credits)"},"reveal_phone_number":{"type":"boolean","required":false,"visibility":"user-only","description":"Reveal phone numbers (uses credits, requires webhook_url)"},"webhook_url":{"type":"string","required":false,"visibility":"user-only","description":"Webhook URL for async phone number delivery (required when reveal_phone_number is true)"}},"oauth":{"required":false,"provider":"apollo","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"],"authoritativeParams":["credentialType"]},"hostedApiKey":"none"},"apollo_people_enrich":{"id":"apollo_people_enrich","name":"Apollo People Enrichment","description":"Enrich data for a single person using Apollo","version":"1.0.0","params":{"credentialType":{"type":"string","required":false,"visibility":"hidden","description":"Stored credential type supplied by credential resolution"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Apollo API key"},"first_name":{"type":"string","required":false,"visibility":"user-or-llm","description":"First name of the person"},"last_name":{"type":"string","required":false,"visibility":"user-or-llm","description":"Last name of the person"},"name":{"type":"string","required":false,"visibility":"user-or-llm","description":"Full name of the person (alternative to first_name/last_name)"},"id":{"type":"string","required":false,"visibility":"user-or-llm","description":"Apollo ID for the person"},"hashed_email":{"type":"string","required":false,"visibility":"user-or-llm","description":"MD5 or SHA-256 hashed email"},"email":{"type":"string","required":false,"visibility":"user-or-llm","description":"Email address of the person"},"organization_name":{"type":"string","required":false,"visibility":"user-or-llm","description":"Company name where the person works"},"domain":{"type":"string","required":false,"visibility":"user-or-llm","description":"Company domain (e.g., \\"apollo.io\\", \\"acme.com\\")"},"linkedin_url":{"type":"string","required":false,"visibility":"user-or-llm","description":"LinkedIn profile URL"},"reveal_personal_emails":{"type":"boolean","required":false,"visibility":"user-only","description":"Reveal personal email addresses (uses credits)"},"reveal_phone_number":{"type":"boolean","required":false,"visibility":"user-only","description":"Reveal phone numbers (uses credits, requires webhook_url)"},"webhook_url":{"type":"string","required":false,"visibility":"user-only","description":"Webhook URL for async phone number delivery (required when reveal_phone_number is true)"}},"oauth":{"required":false,"provider":"apollo","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"],"authoritativeParams":["credentialType"]},"hostedApiKey":"none"},"apollo_people_search":{"id":"apollo_people_search","name":"Apollo People Search","description":"Search Apollo\'s database for people using demographic filters","version":"1.0.0","params":{"credentialType":{"type":"string","required":false,"visibility":"hidden","description":"Stored credential type supplied by credential resolution"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Apollo API key"},"person_titles":{"type":"array","required":false,"visibility":"user-or-llm","description":"Job titles to search for (e.g., [\\"CEO\\", \\"VP of Sales\\"])"},"include_similar_titles":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Whether to return people with job titles similar to person_titles"},"person_locations":{"type":"array","required":false,"visibility":"user-or-llm","description":"Locations to search in (e.g., [\\"San Francisco, CA\\", \\"New York, NY\\"])"},"person_seniorities":{"type":"array","required":false,"visibility":"user-or-llm","description":"Seniority levels (one of: owner, founder, c_suite, partner, vp, head, director, manager, senior, entry, intern)"},"organization_ids":{"type":"array","required":false,"visibility":"user-or-llm","description":"Apollo organization IDs to filter by (e.g., [\\"5e66b6381e05b4008c8331b8\\"])"},"organization_names":{"type":"array","required":false,"visibility":"user-or-llm","description":"Company names to search within (legacy filter)"},"organization_locations":{"type":"array","required":false,"visibility":"user-or-llm","description":"Headquarters locations of the people\'s current employer (e.g., [\'texas\', \'tokyo\', \'spain\'])"},"q_organization_domains_list":{"type":"array","required":false,"visibility":"user-or-llm","description":"Employer domain names (e.g., [\\"apollo.io\\", \\"microsoft.com\\"]) — up to 1,000, no www. or @"},"organization_num_employees_ranges":{"type":"array","required":false,"visibility":"user-or-llm","description":"Employee count ranges for the person\'s current employer. Each entry is \\"min,max\\" (e.g., [\\"1,10\\", \\"250,500\\", \\"10000,20000\\"])"},"contact_email_status":{"type":"array","required":false,"visibility":"user-or-llm","description":"Email statuses to filter by: \\"verified\\", \\"unverified\\", \\"likely to engage\\", \\"unavailable\\""},"q_keywords":{"type":"string","required":false,"visibility":"user-or-llm","description":"Keywords to search for"},"page":{"type":"number","required":false,"visibility":"user-or-llm","description":"Page number for pagination, default 1 (e.g., 1, 2, 3)"},"per_page":{"type":"number","required":false,"visibility":"user-or-llm","description":"Results per page, default 25, max 100 (e.g., 25, 50, 100)"}},"oauth":{"required":false,"provider":"apollo","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"],"authoritativeParams":["credentialType"]},"hostedApiKey":"none"},"apollo_sequence_add_contacts":{"id":"apollo_sequence_add_contacts","name":"Apollo Add Contacts to Sequence","description":"Add contacts to an Apollo sequence","version":"1.0.0","params":{"credentialType":{"type":"string","required":false,"visibility":"hidden","description":"Stored credential type supplied by credential resolution"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Apollo API key (master key required)"},"sequence_id":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the sequence to add contacts to (e.g., \\"seq_abc123\\")"},"contact_ids":{"type":"array","required":false,"visibility":"user-or-llm","description":"Array of contact IDs to add to the sequence (e.g., [\\"con_abc123\\", \\"con_def456\\"]). Either contact_ids or label_names must be provided."},"label_names":{"type":"array","required":false,"visibility":"user-or-llm","description":"Array of label names to identify contacts to add to the sequence. Either contact_ids or label_names must be provided."},"send_email_from_email_account_id":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the email account to send from. Use the Get Email Accounts operation to look this up."},"send_email_from_email_address":{"type":"string","required":false,"visibility":"user-only","description":"Specific email address to send from within the email account."},"sequence_no_email":{"type":"boolean","required":false,"visibility":"user-only","description":"Add contacts even if they have no email address"},"sequence_unverified_email":{"type":"boolean","required":false,"visibility":"user-only","description":"Add contacts with unverified email addresses"},"sequence_job_change":{"type":"boolean","required":false,"visibility":"user-only","description":"Add contacts who recently changed jobs"},"sequence_active_in_other_campaigns":{"type":"boolean","required":false,"visibility":"user-only","description":"Add contacts active in other campaigns"},"sequence_finished_in_other_campaigns":{"type":"boolean","required":false,"visibility":"user-only","description":"Add contacts who finished other campaigns"},"sequence_same_company_in_same_campaign":{"type":"boolean","required":false,"visibility":"user-only","description":"Add contacts even if others from the same company are in the sequence"},"contacts_without_ownership_permission":{"type":"boolean","required":false,"visibility":"user-only","description":"Add contacts without ownership permission"},"add_if_in_queue":{"type":"boolean","required":false,"visibility":"user-only","description":"Add contacts even if they are in the queue"},"contact_verification_skipped":{"type":"boolean","required":false,"visibility":"user-only","description":"Skip contact verification when adding"},"user_id":{"type":"string","required":false,"visibility":"user-only","description":"ID of the user performing the action"},"status":{"type":"string","required":false,"visibility":"user-only","description":"Initial status for added contacts: \\"active\\" or \\"paused\\""},"auto_unpause_at":{"type":"string","required":false,"visibility":"user-only","description":"ISO 8601 datetime to automatically unpause contacts"}},"oauth":{"required":false,"provider":"apollo","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"],"authoritativeParams":["credentialType"]},"hostedApiKey":"none"},"apollo_sequence_search":{"id":"apollo_sequence_search","name":"Apollo Search Sequences","description":"Search for sequences/campaigns in your team\'s Apollo account (master key required)","version":"1.0.0","params":{"credentialType":{"type":"string","required":false,"visibility":"hidden","description":"Stored credential type supplied by credential resolution"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Apollo API key (master key required)"},"q_name":{"type":"string","required":false,"visibility":"user-or-llm","description":"Search sequences by name (e.g., \\"Outbound Q1\\", \\"Follow-up\\")"},"page":{"type":"number","required":false,"visibility":"user-or-llm","description":"Page number for pagination (e.g., 1, 2, 3)"},"per_page":{"type":"number","required":false,"visibility":"user-or-llm","description":"Results per page, max 100 (e.g., 25, 50, 100)"}},"oauth":{"required":false,"provider":"apollo","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"],"authoritativeParams":["credentialType"]},"hostedApiKey":"none"},"apollo_task_create":{"id":"apollo_task_create","name":"Apollo Create Task","description":"Create one or more tasks in Apollo (one task per contact_id, master key required)","version":"1.0.0","params":{"credentialType":{"type":"string","required":false,"visibility":"hidden","description":"Stored credential type supplied by credential resolution"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Apollo API key (master key required)"},"user_id":{"type":"string","required":true,"visibility":"user-or-llm","description":"ID of the Apollo user the task is assigned to"},"contact_ids":{"type":"array","required":true,"visibility":"user-or-llm","description":"Array of contact IDs. One task is created per contact."},"priority":{"type":"string","required":false,"visibility":"user-or-llm","description":"Task priority: \\"high\\", \\"medium\\", or \\"low\\" (defaults to \\"medium\\")"},"due_at":{"type":"string","required":true,"visibility":"user-or-llm","description":"Due date/time in ISO 8601 format (e.g., \\"2024-12-31T23:59:59Z\\")"},"type":{"type":"string","required":true,"visibility":"user-or-llm","description":"Task type: \\"call\\", \\"outreach_manual_email\\", \\"linkedin_step_connect\\", \\"linkedin_step_message\\", \\"linkedin_step_view_profile\\", \\"linkedin_step_interact_post\\", or \\"action_item\\""},"status":{"type":"string","required":true,"visibility":"user-or-llm","description":"Task status: \\"scheduled\\", \\"completed\\", or \\"skipped\\""},"note":{"type":"string","required":false,"visibility":"user-or-llm","description":"Free-form note providing context for the task"}},"oauth":{"required":false,"provider":"apollo","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"],"authoritativeParams":["credentialType"]},"hostedApiKey":"none"},"apollo_task_search":{"id":"apollo_task_search","name":"Apollo Search Tasks","description":"Search for tasks in Apollo","version":"1.0.0","params":{"credentialType":{"type":"string","required":false,"visibility":"hidden","description":"Stored credential type supplied by credential resolution"},"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Apollo API key (master key required)"},"sort_by_field":{"type":"string","required":false,"visibility":"user-or-llm","description":"Sort field: \\"task_due_at\\" or \\"task_priority\\""},"open_factor_names":{"type":"array","required":false,"visibility":"user-or-llm","description":"Filter by status. Common values: [\\"task_types\\"] for open tasks, [\\"task_completed_at\\"] for completed tasks."},"page":{"type":"number","required":false,"visibility":"user-or-llm","description":"Page number for pagination (e.g., 1, 2, 3)"},"per_page":{"type":"number","required":false,"visibility":"user-or-llm","description":"Results per page, max 100 (e.g., 25, 50, 100)"}},"oauth":{"required":false,"provider":"apollo","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"],"authoritativeParams":["credentialType"]},"hostedApiKey":"none"},"appconfig_create_application":{"id":"appconfig_create_application","name":"AppConfig Create Application","description":"Create an application in AWS AppConfig","version":"1.0","params":{"region":{"type":"string","required":true,"visibility":"user-only","description":"AWS region (e.g., us-east-1)"},"accessKeyId":{"type":"string","required":true,"visibility":"user-only","description":"AWS access key ID"},"secretAccessKey":{"type":"string","required":true,"visibility":"user-only","description":"AWS secret access key"},"name":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the application to create"},"description":{"type":"string","required":false,"visibility":"user-or-llm","description":"Description of the application"}},"oauth":{"required":false,"provider":"aws","credentialKind":"service-account","credentialSuppliedParams":["accessKeyId","secretAccessKey","awsAccessKeyId","awsSecretAccessKey"]},"hostedApiKey":"none"},"appconfig_create_configuration_profile":{"id":"appconfig_create_configuration_profile","name":"AppConfig Create Configuration Profile","description":"Create a configuration profile in an AWS AppConfig application","version":"1.0","params":{"region":{"type":"string","required":true,"visibility":"user-only","description":"AWS region (e.g., us-east-1)"},"accessKeyId":{"type":"string","required":true,"visibility":"user-only","description":"AWS access key ID"},"secretAccessKey":{"type":"string","required":true,"visibility":"user-only","description":"AWS secret access key"},"applicationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The application ID to create the configuration profile in"},"name":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the configuration profile"},"locationUri":{"type":"string","required":true,"visibility":"user-or-llm","description":"Where the configuration is stored. Use \\"hosted\\" for AppConfig-hosted configurations, or an SSM/S3 URI"},"description":{"type":"string","required":false,"visibility":"user-or-llm","description":"Description of the configuration profile"},"retrievalRoleArn":{"type":"string","required":false,"visibility":"user-or-llm","description":"ARN of an IAM role to retrieve the configuration (required for non-hosted URIs)"},"type":{"type":"string","required":false,"visibility":"user-or-llm","description":"Profile type: AWS.Freeform (default) or AWS.AppConfig.FeatureFlags"}},"oauth":{"required":false,"provider":"aws","credentialKind":"service-account","credentialSuppliedParams":["accessKeyId","secretAccessKey","awsAccessKeyId","awsSecretAccessKey"]},"hostedApiKey":"none"},"appconfig_create_environment":{"id":"appconfig_create_environment","name":"AppConfig Create Environment","description":"Create an environment for an AWS AppConfig application","version":"1.0","params":{"region":{"type":"string","required":true,"visibility":"user-only","description":"AWS region (e.g., us-east-1)"},"accessKeyId":{"type":"string","required":true,"visibility":"user-only","description":"AWS access key ID"},"secretAccessKey":{"type":"string","required":true,"visibility":"user-only","description":"AWS secret access key"},"applicationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The application ID to create the environment in"},"name":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the environment to create"},"description":{"type":"string","required":false,"visibility":"user-or-llm","description":"Description of the environment"}},"oauth":{"required":false,"provider":"aws","credentialKind":"service-account","credentialSuppliedParams":["accessKeyId","secretAccessKey","awsAccessKeyId","awsSecretAccessKey"]},"hostedApiKey":"none"},"appconfig_create_hosted_configuration_version":{"id":"appconfig_create_hosted_configuration_version","name":"AppConfig Create Hosted Configuration Version","description":"Create a new hosted configuration version for an AppConfig configuration profile","version":"1.0","params":{"region":{"type":"string","required":true,"visibility":"user-only","description":"AWS region (e.g., us-east-1)"},"accessKeyId":{"type":"string","required":true,"visibility":"user-only","description":"AWS access key ID"},"secretAccessKey":{"type":"string","required":true,"visibility":"user-only","description":"AWS secret access key"},"applicationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The application ID that owns the configuration profile"},"configurationProfileId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The configuration profile ID to add the version to"},"content":{"type":"string","required":true,"visibility":"user-or-llm","description":"The configuration content (e.g., a JSON or YAML document)"},"contentType":{"type":"string","required":true,"visibility":"user-or-llm","description":"Content type of the configuration (e.g., application/json, text/plain)"},"description":{"type":"string","required":false,"visibility":"user-or-llm","description":"Description of the configuration version"},"latestVersionNumber":{"type":"number","required":false,"visibility":"user-or-llm","description":"The version number of the latest version, used for optimistic concurrency"},"versionLabel":{"type":"string","required":false,"visibility":"user-or-llm","description":"A user-defined label for the configuration version"}},"oauth":{"required":false,"provider":"aws","credentialKind":"service-account","credentialSuppliedParams":["accessKeyId","secretAccessKey","awsAccessKeyId","awsSecretAccessKey"]},"hostedApiKey":"none"},"appconfig_delete_application":{"id":"appconfig_delete_application","name":"AppConfig Delete Application","description":"Delete an AWS AppConfig application","version":"1.0","params":{"region":{"type":"string","required":true,"visibility":"user-only","description":"AWS region (e.g., us-east-1)"},"accessKeyId":{"type":"string","required":true,"visibility":"user-only","description":"AWS access key ID"},"secretAccessKey":{"type":"string","required":true,"visibility":"user-only","description":"AWS secret access key"},"applicationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The application ID to delete"}},"oauth":{"required":false,"provider":"aws","credentialKind":"service-account","credentialSuppliedParams":["accessKeyId","secretAccessKey","awsAccessKeyId","awsSecretAccessKey"]},"hostedApiKey":"none"},"appconfig_delete_configuration_profile":{"id":"appconfig_delete_configuration_profile","name":"AppConfig Delete Configuration Profile","description":"Delete an AWS AppConfig configuration profile","version":"1.0","params":{"region":{"type":"string","required":true,"visibility":"user-only","description":"AWS region (e.g., us-east-1)"},"accessKeyId":{"type":"string","required":true,"visibility":"user-only","description":"AWS access key ID"},"secretAccessKey":{"type":"string","required":true,"visibility":"user-only","description":"AWS secret access key"},"applicationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The application ID that owns the configuration profile"},"configurationProfileId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The configuration profile ID to delete"}},"oauth":{"required":false,"provider":"aws","credentialKind":"service-account","credentialSuppliedParams":["accessKeyId","secretAccessKey","awsAccessKeyId","awsSecretAccessKey"]},"hostedApiKey":"none"},"appconfig_delete_environment":{"id":"appconfig_delete_environment","name":"AppConfig Delete Environment","description":"Delete an AWS AppConfig environment","version":"1.0","params":{"region":{"type":"string","required":true,"visibility":"user-only","description":"AWS region (e.g., us-east-1)"},"accessKeyId":{"type":"string","required":true,"visibility":"user-only","description":"AWS access key ID"},"secretAccessKey":{"type":"string","required":true,"visibility":"user-only","description":"AWS secret access key"},"applicationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The application ID that owns the environment"},"environmentId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The environment ID to delete"}},"oauth":{"required":false,"provider":"aws","credentialKind":"service-account","credentialSuppliedParams":["accessKeyId","secretAccessKey","awsAccessKeyId","awsSecretAccessKey"]},"hostedApiKey":"none"},"appconfig_delete_hosted_configuration_version":{"id":"appconfig_delete_hosted_configuration_version","name":"AppConfig Delete Hosted Configuration Version","description":"Delete a specific hosted configuration version from an AppConfig profile","version":"1.0","params":{"region":{"type":"string","required":true,"visibility":"user-only","description":"AWS region (e.g., us-east-1)"},"accessKeyId":{"type":"string","required":true,"visibility":"user-only","description":"AWS access key ID"},"secretAccessKey":{"type":"string","required":true,"visibility":"user-only","description":"AWS secret access key"},"applicationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The application ID that owns the configuration profile"},"configurationProfileId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The configuration profile ID that owns the version"},"versionNumber":{"type":"number","required":true,"visibility":"user-or-llm","description":"The version number to delete"}},"oauth":{"required":false,"provider":"aws","credentialKind":"service-account","credentialSuppliedParams":["accessKeyId","secretAccessKey","awsAccessKeyId","awsSecretAccessKey"]},"hostedApiKey":"none"},"appconfig_get_application":{"id":"appconfig_get_application","name":"AppConfig Get Application","description":"Get details about a single AWS AppConfig application","version":"1.0","params":{"region":{"type":"string","required":true,"visibility":"user-only","description":"AWS region (e.g., us-east-1)"},"accessKeyId":{"type":"string","required":true,"visibility":"user-only","description":"AWS access key ID"},"secretAccessKey":{"type":"string","required":true,"visibility":"user-only","description":"AWS secret access key"},"applicationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The application ID to retrieve"}},"oauth":{"required":false,"provider":"aws","credentialKind":"service-account","credentialSuppliedParams":["accessKeyId","secretAccessKey","awsAccessKeyId","awsSecretAccessKey"]},"hostedApiKey":"none"},"appconfig_get_configuration":{"id":"appconfig_get_configuration","name":"AppConfig Get Configuration","description":"Retrieve the latest deployed configuration for an AppConfig application, environment, and profile","version":"1.0","params":{"region":{"type":"string","required":true,"visibility":"user-only","description":"AWS region (e.g., us-east-1)"},"accessKeyId":{"type":"string","required":true,"visibility":"user-only","description":"AWS access key ID"},"secretAccessKey":{"type":"string","required":true,"visibility":"user-only","description":"AWS secret access key"},"applicationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The application ID or name to retrieve configuration for"},"environmentId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The environment ID or name to retrieve configuration for"},"configurationProfileId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The configuration profile ID or name to retrieve"}},"oauth":{"required":false,"provider":"aws","credentialKind":"service-account","credentialSuppliedParams":["accessKeyId","secretAccessKey","awsAccessKeyId","awsSecretAccessKey"]},"hostedApiKey":"none"},"appconfig_get_configuration_profile":{"id":"appconfig_get_configuration_profile","name":"AppConfig Get Configuration Profile","description":"Get details about a single AWS AppConfig configuration profile","version":"1.0","params":{"region":{"type":"string","required":true,"visibility":"user-only","description":"AWS region (e.g., us-east-1)"},"accessKeyId":{"type":"string","required":true,"visibility":"user-only","description":"AWS access key ID"},"secretAccessKey":{"type":"string","required":true,"visibility":"user-only","description":"AWS secret access key"},"applicationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The application ID that owns the configuration profile"},"configurationProfileId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The configuration profile ID to retrieve"}},"oauth":{"required":false,"provider":"aws","credentialKind":"service-account","credentialSuppliedParams":["accessKeyId","secretAccessKey","awsAccessKeyId","awsSecretAccessKey"]},"hostedApiKey":"none"},"appconfig_get_deployment":{"id":"appconfig_get_deployment","name":"AppConfig Get Deployment","description":"Get details about a specific AWS AppConfig deployment","version":"1.0","params":{"region":{"type":"string","required":true,"visibility":"user-only","description":"AWS region (e.g., us-east-1)"},"accessKeyId":{"type":"string","required":true,"visibility":"user-only","description":"AWS access key ID"},"secretAccessKey":{"type":"string","required":true,"visibility":"user-only","description":"AWS secret access key"},"applicationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The application ID of the deployment"},"environmentId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The environment ID of the deployment"},"deploymentNumber":{"type":"number","required":true,"visibility":"user-or-llm","description":"The sequence number of the deployment"}},"oauth":{"required":false,"provider":"aws","credentialKind":"service-account","credentialSuppliedParams":["accessKeyId","secretAccessKey","awsAccessKeyId","awsSecretAccessKey"]},"hostedApiKey":"none"},"appconfig_get_environment":{"id":"appconfig_get_environment","name":"AppConfig Get Environment","description":"Get details about a single AWS AppConfig environment","version":"1.0","params":{"region":{"type":"string","required":true,"visibility":"user-only","description":"AWS region (e.g., us-east-1)"},"accessKeyId":{"type":"string","required":true,"visibility":"user-only","description":"AWS access key ID"},"secretAccessKey":{"type":"string","required":true,"visibility":"user-only","description":"AWS secret access key"},"applicationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The application ID that owns the environment"},"environmentId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The environment ID to retrieve"}},"oauth":{"required":false,"provider":"aws","credentialKind":"service-account","credentialSuppliedParams":["accessKeyId","secretAccessKey","awsAccessKeyId","awsSecretAccessKey"]},"hostedApiKey":"none"},"appconfig_get_hosted_configuration_version":{"id":"appconfig_get_hosted_configuration_version","name":"AppConfig Get Hosted Configuration Version","description":"Retrieve a specific hosted configuration version from an AppConfig profile","version":"1.0","params":{"region":{"type":"string","required":true,"visibility":"user-only","description":"AWS region (e.g., us-east-1)"},"accessKeyId":{"type":"string","required":true,"visibility":"user-only","description":"AWS access key ID"},"secretAccessKey":{"type":"string","required":true,"visibility":"user-only","description":"AWS secret access key"},"applicationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The application ID that owns the configuration profile"},"configurationProfileId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The configuration profile ID to read the version from"},"versionNumber":{"type":"number","required":true,"visibility":"user-or-llm","description":"The version number to retrieve"}},"oauth":{"required":false,"provider":"aws","credentialKind":"service-account","credentialSuppliedParams":["accessKeyId","secretAccessKey","awsAccessKeyId","awsSecretAccessKey"]},"hostedApiKey":"none"},"appconfig_list_applications":{"id":"appconfig_list_applications","name":"AppConfig List Applications","description":"List applications in AWS AppConfig","version":"1.0","params":{"region":{"type":"string","required":true,"visibility":"user-only","description":"AWS region (e.g., us-east-1)"},"accessKeyId":{"type":"string","required":true,"visibility":"user-only","description":"AWS access key ID"},"secretAccessKey":{"type":"string","required":true,"visibility":"user-only","description":"AWS secret access key"},"maxResults":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of applications to return (1-50)"},"nextToken":{"type":"string","required":false,"visibility":"user-or-llm","description":"Pagination token from a previous response"}},"oauth":{"required":false,"provider":"aws","credentialKind":"service-account","credentialSuppliedParams":["accessKeyId","secretAccessKey","awsAccessKeyId","awsSecretAccessKey"]},"hostedApiKey":"none"},"appconfig_list_configuration_profiles":{"id":"appconfig_list_configuration_profiles","name":"AppConfig List Configuration Profiles","description":"List configuration profiles for an AWS AppConfig application","version":"1.0","params":{"region":{"type":"string","required":true,"visibility":"user-only","description":"AWS region (e.g., us-east-1)"},"accessKeyId":{"type":"string","required":true,"visibility":"user-only","description":"AWS access key ID"},"secretAccessKey":{"type":"string","required":true,"visibility":"user-only","description":"AWS secret access key"},"applicationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The application ID that owns the configuration profiles"},"maxResults":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of configuration profiles to return (1-50)"},"nextToken":{"type":"string","required":false,"visibility":"user-or-llm","description":"Pagination token from a previous response"}},"oauth":{"required":false,"provider":"aws","credentialKind":"service-account","credentialSuppliedParams":["accessKeyId","secretAccessKey","awsAccessKeyId","awsSecretAccessKey"]},"hostedApiKey":"none"},"appconfig_list_deployment_strategies":{"id":"appconfig_list_deployment_strategies","name":"AppConfig List Deployment Strategies","description":"List deployment strategies available in AWS AppConfig","version":"1.0","params":{"region":{"type":"string","required":true,"visibility":"user-only","description":"AWS region (e.g., us-east-1)"},"accessKeyId":{"type":"string","required":true,"visibility":"user-only","description":"AWS access key ID"},"secretAccessKey":{"type":"string","required":true,"visibility":"user-only","description":"AWS secret access key"},"maxResults":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of deployment strategies to return (1-50)"},"nextToken":{"type":"string","required":false,"visibility":"user-or-llm","description":"Pagination token from a previous response"}},"oauth":{"required":false,"provider":"aws","credentialKind":"service-account","credentialSuppliedParams":["accessKeyId","secretAccessKey","awsAccessKeyId","awsSecretAccessKey"]},"hostedApiKey":"none"},"appconfig_list_deployments":{"id":"appconfig_list_deployments","name":"AppConfig List Deployments","description":"List deployments for an AWS AppConfig environment","version":"1.0","params":{"region":{"type":"string","required":true,"visibility":"user-only","description":"AWS region (e.g., us-east-1)"},"accessKeyId":{"type":"string","required":true,"visibility":"user-only","description":"AWS access key ID"},"secretAccessKey":{"type":"string","required":true,"visibility":"user-only","description":"AWS secret access key"},"applicationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The application ID of the deployments"},"environmentId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The environment ID of the deployments"},"maxResults":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of deployments to return (1-50)"},"nextToken":{"type":"string","required":false,"visibility":"user-or-llm","description":"Pagination token from a previous response"}},"oauth":{"required":false,"provider":"aws","credentialKind":"service-account","credentialSuppliedParams":["accessKeyId","secretAccessKey","awsAccessKeyId","awsSecretAccessKey"]},"hostedApiKey":"none"},"appconfig_list_environments":{"id":"appconfig_list_environments","name":"AppConfig List Environments","description":"List environments for an AWS AppConfig application","version":"1.0","params":{"region":{"type":"string","required":true,"visibility":"user-only","description":"AWS region (e.g., us-east-1)"},"accessKeyId":{"type":"string","required":true,"visibility":"user-only","description":"AWS access key ID"},"secretAccessKey":{"type":"string","required":true,"visibility":"user-only","description":"AWS secret access key"},"applicationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The application ID that owns the environments"},"maxResults":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of environments to return (1-50)"},"nextToken":{"type":"string","required":false,"visibility":"user-or-llm","description":"Pagination token from a previous response"}},"oauth":{"required":false,"provider":"aws","credentialKind":"service-account","credentialSuppliedParams":["accessKeyId","secretAccessKey","awsAccessKeyId","awsSecretAccessKey"]},"hostedApiKey":"none"},"appconfig_list_hosted_configuration_versions":{"id":"appconfig_list_hosted_configuration_versions","name":"AppConfig List Hosted Configuration Versions","description":"List hosted configuration versions for an AWS AppConfig configuration profile","version":"1.0","params":{"region":{"type":"string","required":true,"visibility":"user-only","description":"AWS region (e.g., us-east-1)"},"accessKeyId":{"type":"string","required":true,"visibility":"user-only","description":"AWS access key ID"},"secretAccessKey":{"type":"string","required":true,"visibility":"user-only","description":"AWS secret access key"},"applicationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The application ID that owns the configuration profile"},"configurationProfileId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The configuration profile ID to list versions for"},"maxResults":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of versions to return (1-50)"},"nextToken":{"type":"string","required":false,"visibility":"user-or-llm","description":"Pagination token from a previous response"}},"oauth":{"required":false,"provider":"aws","credentialKind":"service-account","credentialSuppliedParams":["accessKeyId","secretAccessKey","awsAccessKeyId","awsSecretAccessKey"]},"hostedApiKey":"none"},"appconfig_start_deployment":{"id":"appconfig_start_deployment","name":"AppConfig Start Deployment","description":"Start deploying a configuration version to an AWS AppConfig environment","version":"1.0","params":{"region":{"type":"string","required":true,"visibility":"user-only","description":"AWS region (e.g., us-east-1)"},"accessKeyId":{"type":"string","required":true,"visibility":"user-only","description":"AWS access key ID"},"secretAccessKey":{"type":"string","required":true,"visibility":"user-only","description":"AWS secret access key"},"applicationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The application ID to deploy in"},"environmentId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The environment ID to deploy to"},"deploymentStrategyId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The deployment strategy ID to use"},"configurationProfileId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The configuration profile ID to deploy"},"configurationVersion":{"type":"string","required":true,"visibility":"user-or-llm","description":"The configuration version to deploy"},"description":{"type":"string","required":false,"visibility":"user-or-llm","description":"Description of the deployment"}},"oauth":{"required":false,"provider":"aws","credentialKind":"service-account","credentialSuppliedParams":["accessKeyId","secretAccessKey","awsAccessKeyId","awsSecretAccessKey"]},"hostedApiKey":"none"},"appconfig_stop_deployment":{"id":"appconfig_stop_deployment","name":"AppConfig Stop Deployment","description":"Stop an in-progress AWS AppConfig deployment","version":"1.0","params":{"region":{"type":"string","required":true,"visibility":"user-only","description":"AWS region (e.g., us-east-1)"},"accessKeyId":{"type":"string","required":true,"visibility":"user-only","description":"AWS access key ID"},"secretAccessKey":{"type":"string","required":true,"visibility":"user-only","description":"AWS secret access key"},"applicationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The application ID of the deployment"},"environmentId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The environment ID of the deployment"},"deploymentNumber":{"type":"number","required":true,"visibility":"user-or-llm","description":"The sequence number of the deployment to stop"}},"oauth":{"required":false,"provider":"aws","credentialKind":"service-account","credentialSuppliedParams":["accessKeyId","secretAccessKey","awsAccessKeyId","awsSecretAccessKey"]},"hostedApiKey":"none"},"appconfig_update_application":{"id":"appconfig_update_application","name":"AppConfig Update Application","description":"Update the name or description of an AWS AppConfig application","version":"1.0","params":{"region":{"type":"string","required":true,"visibility":"user-only","description":"AWS region (e.g., us-east-1)"},"accessKeyId":{"type":"string","required":true,"visibility":"user-only","description":"AWS access key ID"},"secretAccessKey":{"type":"string","required":true,"visibility":"user-only","description":"AWS secret access key"},"applicationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The application ID to update"},"name":{"type":"string","required":false,"visibility":"user-or-llm","description":"New name for the application"},"description":{"type":"string","required":false,"visibility":"user-or-llm","description":"New description for the application"}},"oauth":{"required":false,"provider":"aws","credentialKind":"service-account","credentialSuppliedParams":["accessKeyId","secretAccessKey","awsAccessKeyId","awsSecretAccessKey"]},"hostedApiKey":"none"},"appconfig_update_configuration_profile":{"id":"appconfig_update_configuration_profile","name":"AppConfig Update Configuration Profile","description":"Update the name, description, or retrieval role of an AppConfig configuration profile","version":"1.0","params":{"region":{"type":"string","required":true,"visibility":"user-only","description":"AWS region (e.g., us-east-1)"},"accessKeyId":{"type":"string","required":true,"visibility":"user-only","description":"AWS access key ID"},"secretAccessKey":{"type":"string","required":true,"visibility":"user-only","description":"AWS secret access key"},"applicationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The application ID that owns the configuration profile"},"configurationProfileId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The configuration profile ID to update"},"name":{"type":"string","required":false,"visibility":"user-or-llm","description":"New name for the configuration profile"},"description":{"type":"string","required":false,"visibility":"user-or-llm","description":"New description for the configuration profile"},"retrievalRoleArn":{"type":"string","required":false,"visibility":"user-or-llm","description":"New ARN of the IAM role used to retrieve the configuration"}},"oauth":{"required":false,"provider":"aws","credentialKind":"service-account","credentialSuppliedParams":["accessKeyId","secretAccessKey","awsAccessKeyId","awsSecretAccessKey"]},"hostedApiKey":"none"},"appconfig_update_environment":{"id":"appconfig_update_environment","name":"AppConfig Update Environment","description":"Update the name or description of an AWS AppConfig environment","version":"1.0","params":{"region":{"type":"string","required":true,"visibility":"user-only","description":"AWS region (e.g., us-east-1)"},"accessKeyId":{"type":"string","required":true,"visibility":"user-only","description":"AWS access key ID"},"secretAccessKey":{"type":"string","required":true,"visibility":"user-only","description":"AWS secret access key"},"applicationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The application ID that owns the environment"},"environmentId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The environment ID to update"},"name":{"type":"string","required":false,"visibility":"user-or-llm","description":"New name for the environment"},"description":{"type":"string","required":false,"visibility":"user-or-llm","description":"New description for the environment"}},"oauth":{"required":false,"provider":"aws","credentialKind":"service-account","credentialSuppliedParams":["accessKeyId","secretAccessKey","awsAccessKeyId","awsSecretAccessKey"]},"hostedApiKey":"none"},"arxiv_get_author_papers":{"id":"arxiv_get_author_papers","name":"ArXiv Get Author Papers","description":"Search for papers by a specific author on ArXiv.","version":"1.0.0","params":{"authorName":{"type":"string","required":true,"visibility":"user-or-llm","description":"Author name to search for"},"maxResults":{"type":"number","required":false,"visibility":"user-only","description":"Maximum number of results to return (default: 10, max: 2000)"}},"hostedApiKey":"none"},"arxiv_get_paper":{"id":"arxiv_get_paper","name":"ArXiv Get Paper","description":"Get detailed information about a specific ArXiv paper by its ID.","version":"1.0.0","params":{"paperId":{"type":"string","required":true,"visibility":"user-or-llm","description":"ArXiv paper ID (e.g., \\"1706.03762\\")"}},"hostedApiKey":"none"},"arxiv_search":{"id":"arxiv_search","name":"ArXiv Search","description":"Search for academic papers on ArXiv by keywords, authors, titles, or other fields.","version":"1.0.0","params":{"searchQuery":{"type":"string","required":true,"visibility":"user-or-llm","description":"The search query to execute"},"searchField":{"type":"string","required":false,"visibility":"user-only","description":"Field to search in: all, ti (title), au (author), abs (abstract), co (comment), jr (journal), cat (category), rn (report number)"},"maxResults":{"type":"number","required":false,"visibility":"user-only","description":"Maximum number of results to return (default: 10, max: 2000)"},"sortBy":{"type":"string","required":false,"visibility":"user-only","description":"Sort by: relevance, lastUpdatedDate, submittedDate (default: relevance)"},"sortOrder":{"type":"string","required":false,"visibility":"user-only","description":"Sort order: ascending, descending (default: descending)"}},"hostedApiKey":"none"},"asana_add_comment":{"id":"asana_add_comment","name":"Asana Add Comment","description":"Add a comment (story) to an Asana task","version":"1.0.0","params":{"accessToken":{"type":"string","required":true,"visibility":"hidden","description":"OAuth access token for Asana"},"taskGid":{"type":"string","required":true,"visibility":"user-or-llm","description":"Asana task GID (numeric string)"},"text":{"type":"string","required":true,"visibility":"user-or-llm","description":"The text content of the comment"}},"oauth":{"required":true,"provider":"asana"},"hostedApiKey":"none"},"asana_add_followers":{"id":"asana_add_followers","name":"Asana Add Followers","description":"Add one or more followers to an Asana task","version":"1.0.0","params":{"accessToken":{"type":"string","required":true,"visibility":"hidden","description":"OAuth access token for Asana"},"taskGid":{"type":"string","required":true,"visibility":"user-or-llm","description":"GID of the Asana task (numeric string)"},"followers":{"type":"array","required":true,"visibility":"user-or-llm","description":"Array of user GIDs to add as followers to the task"}},"oauth":{"required":true,"provider":"asana"},"hostedApiKey":"none"},"asana_create_project":{"id":"asana_create_project","name":"Asana Create Project","description":"Create a new project in an Asana workspace","version":"1.0.0","params":{"accessToken":{"type":"string","required":true,"visibility":"hidden","description":"OAuth access token for Asana"},"workspace":{"type":"string","required":true,"visibility":"user-or-llm","description":"Asana workspace GID (numeric string) where the project will be created"},"name":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the project"},"notes":{"type":"string","required":false,"visibility":"user-or-llm","description":"Notes or description for the project"}},"oauth":{"required":true,"provider":"asana"},"hostedApiKey":"none"},"asana_create_section":{"id":"asana_create_section","name":"Asana Create Section","description":"Create a new section in an Asana project","version":"1.0.0","params":{"accessToken":{"type":"string","required":true,"visibility":"hidden","description":"OAuth access token for Asana"},"projectGid":{"type":"string","required":true,"visibility":"user-or-llm","description":"GID of the Asana project (numeric string) to add the section to"},"name":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the section"}},"oauth":{"required":true,"provider":"asana"},"hostedApiKey":"none"},"asana_create_subtask":{"id":"asana_create_subtask","name":"Asana Create Subtask","description":"Create a subtask under an existing Asana task","version":"1.0.0","params":{"accessToken":{"type":"string","required":true,"visibility":"hidden","description":"OAuth access token for Asana"},"taskGid":{"type":"string","required":true,"visibility":"user-or-llm","description":"GID of the parent Asana task (numeric string)"},"name":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the subtask"},"notes":{"type":"string","required":false,"visibility":"user-or-llm","description":"Notes or description for the subtask"},"assignee":{"type":"string","required":false,"visibility":"user-or-llm","description":"User GID to assign the subtask to"},"due_on":{"type":"string","required":false,"visibility":"user-or-llm","description":"Due date in YYYY-MM-DD format"}},"oauth":{"required":true,"provider":"asana"},"hostedApiKey":"none"},"asana_create_task":{"id":"asana_create_task","name":"Asana Create Task","description":"Create a new task in Asana","version":"1.0.0","params":{"accessToken":{"type":"string","required":true,"visibility":"hidden","description":"OAuth access token for Asana"},"workspace":{"type":"string","required":true,"visibility":"user-or-llm","description":"Asana workspace GID (numeric string) where the task will be created"},"name":{"type":"string","required":true,"visibility":"user-or-llm","description":"Name of the task"},"notes":{"type":"string","required":false,"visibility":"user-or-llm","description":"Notes or description for the task"},"assignee":{"type":"string","required":false,"visibility":"user-or-llm","description":"User GID to assign the task to"},"due_on":{"type":"string","required":false,"visibility":"user-or-llm","description":"Due date in YYYY-MM-DD format"}},"oauth":{"required":true,"provider":"asana"},"hostedApiKey":"none"},"asana_delete_task":{"id":"asana_delete_task","name":"Asana Delete Task","description":"Delete an Asana task by its GID (moves it to the trash)","version":"1.0.0","params":{"accessToken":{"type":"string","required":true,"visibility":"hidden","description":"OAuth access token for Asana"},"taskGid":{"type":"string","required":true,"visibility":"user-or-llm","description":"GID of the Asana task to delete (numeric string)"}},"oauth":{"required":true,"provider":"asana"},"hostedApiKey":"none"},"asana_get_project":{"id":"asana_get_project","name":"Asana Get Project","description":"Retrieve a single Asana project by its GID","version":"1.0.0","params":{"accessToken":{"type":"string","required":true,"visibility":"hidden","description":"OAuth access token for Asana"},"projectGid":{"type":"string","required":true,"visibility":"user-or-llm","description":"Asana project GID (numeric string) to retrieve"}},"oauth":{"required":true,"provider":"asana"},"hostedApiKey":"none"},"asana_get_projects":{"id":"asana_get_projects","name":"Asana Get Projects","description":"Retrieve all projects from an Asana workspace","version":"1.0.0","params":{"accessToken":{"type":"string","required":true,"visibility":"hidden","description":"OAuth access token for Asana"},"workspace":{"type":"string","required":true,"visibility":"user-or-llm","description":"Asana workspace GID (numeric string) to retrieve projects from"}},"oauth":{"required":true,"provider":"asana"},"hostedApiKey":"none"},"asana_get_task":{"id":"asana_get_task","name":"Asana Get Task","description":"Retrieve a single task by GID or get multiple tasks with filters","version":"1.0.0","params":{"accessToken":{"type":"string","required":true,"visibility":"hidden","description":"OAuth access token for Asana"},"taskGid":{"type":"string","required":false,"visibility":"user-or-llm","description":"The globally unique identifier (GID) of the task. If not provided, will get multiple tasks."},"workspace":{"type":"string","required":false,"visibility":"user-or-llm","description":"Asana workspace GID (numeric string) to filter tasks (required when not using taskGid)"},"project":{"type":"string","required":false,"visibility":"user-or-llm","description":"Asana project GID (numeric string) to filter tasks"},"limit":{"type":"number","required":false,"visibility":"user-or-llm","description":"Maximum number of tasks to return (default: 50)"}},"oauth":{"required":true,"provider":"asana"},"hostedApiKey":"none"},"asana_list_sections":{"id":"asana_list_sections","name":"Asana List Sections","description":"List all sections in an Asana project","version":"1.0.0","params":{"accessToken":{"type":"string","required":true,"visibility":"hidden","description":"OAuth access token for Asana"},"projectGid":{"type":"string","required":true,"visibility":"user-or-llm","description":"GID of the Asana project (numeric string) to list sections from"}},"oauth":{"required":true,"provider":"asana"},"hostedApiKey":"none"},"asana_list_workspaces":{"id":"asana_list_workspaces","name":"Asana List Workspaces","description":"List all Asana workspaces and organizations the authenticated user belongs to","version":"1.0.0","params":{"accessToken":{"type":"string","required":true,"visibility":"hidden","description":"OAuth access token for Asana"}},"oauth":{"required":true,"provider":"asana"},"hostedApiKey":"none"},"asana_search_tasks":{"id":"asana_search_tasks","name":"Asana Search Tasks","description":"Search for tasks in an Asana workspace","version":"1.0.0","params":{"accessToken":{"type":"string","required":true,"visibility":"hidden","description":"OAuth access token for Asana"},"workspace":{"type":"string","required":true,"visibility":"user-or-llm","description":"Asana workspace GID (numeric string) to search tasks in"},"text":{"type":"string","required":false,"visibility":"user-or-llm","description":"Text to search for in task names"},"assignee":{"type":"string","required":false,"visibility":"user-or-llm","description":"Filter tasks by assignee user GID"},"projects":{"type":"array","required":false,"visibility":"user-or-llm","description":"Array of Asana project GIDs (numeric strings) to filter tasks by"},"completed":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Filter by completion status"}},"oauth":{"required":true,"provider":"asana"},"hostedApiKey":"none"},"asana_update_task":{"id":"asana_update_task","name":"Asana Update Task","description":"Update an existing task in Asana","version":"1.0.0","params":{"accessToken":{"type":"string","required":true,"visibility":"hidden","description":"OAuth access token for Asana"},"taskGid":{"type":"string","required":true,"visibility":"user-or-llm","description":"Asana task GID (numeric string) of the task to update"},"name":{"type":"string","required":false,"visibility":"user-or-llm","description":"Updated name for the task"},"notes":{"type":"string","required":false,"visibility":"user-or-llm","description":"Updated notes or description for the task"},"assignee":{"type":"string","required":false,"visibility":"user-or-llm","description":"Updated assignee user GID"},"completed":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Mark task as completed or not completed"},"due_on":{"type":"string","required":false,"visibility":"user-or-llm","description":"Updated due date in YYYY-MM-DD format"}},"oauth":{"required":true,"provider":"asana"},"hostedApiKey":"none"},"ashby_add_candidate_tag":{"id":"ashby_add_candidate_tag","name":"Ashby Add Candidate Tag","description":"Adds a tag to a candidate in Ashby and returns the updated candidate.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ashby API Key"},"onBehalfOfUserId":{"type":"string","required":false,"visibility":"user-or-llm","description":"Active Ashby user UUID to attribute this mutation to; the API key must permit on-behalf-of calls"},"candidateId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The UUID of the candidate to add the tag to"},"tagId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The UUID of the tag to add"}},"oauth":{"required":false,"provider":"ashby","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"ashby_anonymize_candidate":{"id":"ashby_anonymize_candidate","name":"Ashby Anonymize Candidate","description":"Remove personally identifiable information from an Ashby candidate while retaining the candidate record and its applications. This operation does not delete the candidate. Requires the candidatesWrite permission.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ashby API Key"},"onBehalfOfUserId":{"type":"string","required":false,"visibility":"user-or-llm","description":"Active Ashby user UUID to attribute this mutation to; the API key must permit on-behalf-of calls"},"candidateId":{"type":"string","required":true,"visibility":"user-or-llm","description":"UUID of the candidate to anonymize"}},"oauth":{"required":false,"provider":"ashby","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"ashby_change_application_source":{"id":"ashby_change_application_source","name":"Ashby Change Application Source","description":"Changes the source attributed to an existing application, so programmatically created applications report correctly on the recruiting side. Requires the candidatesWrite permission.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ashby API Key"},"onBehalfOfUserId":{"type":"string","required":false,"visibility":"user-or-llm","description":"Active Ashby user UUID to attribute this mutation to; the API key must permit on-behalf-of calls"},"applicationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"UUID of the application whose source should change"},"sourceId":{"type":"string","required":false,"visibility":"user-or-llm","description":"UUID of the source to attribute the application to, as returned by List Sources. Omit only when unsetSource is true."},"unsetSource":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Set true to deliberately clear the application source. Required to unset, so that a missing or empty sourceId cannot wipe attribution by accident."}},"oauth":{"required":false,"provider":"ashby","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"ashby_change_application_stage":{"id":"ashby_change_application_stage","name":"Ashby Change Application Stage","description":"Moves an application to a different interview stage. Requires an archive reason when moving to an Archived stage.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ashby API Key"},"onBehalfOfUserId":{"type":"string","required":false,"visibility":"user-or-llm","description":"Active Ashby user UUID to attribute this mutation to; the API key must permit on-behalf-of calls"},"applicationId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The UUID of the application to update the stage of"},"interviewStageId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The UUID of the interview stage to move the application to"},"archiveReasonId":{"type":"string","required":false,"visibility":"user-or-llm","description":"Archive reason UUID. Required when moving to an Archived stage, ignored otherwise"},"archiveEmail":{"type":"json","required":false,"visibility":"user-or-llm","description":"Archive email configuration with communicationTemplateId and optional sendAt ISO 8601 timestamp. Pass null or omit to send no archive email."}},"oauth":{"required":false,"provider":"ashby","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"ashby_create_application":{"id":"ashby_create_application","name":"Ashby Create Application","description":"Creates a new application for a candidate on a job. Optionally specify interview plan, stage, source, and credited user.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ashby API Key"},"onBehalfOfUserId":{"type":"string","required":false,"visibility":"user-or-llm","description":"Active Ashby user UUID to attribute this mutation to; the API key must permit on-behalf-of calls"},"candidateId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The UUID of the candidate to consider for the job"},"jobId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The UUID of the job to consider the candidate for"},"interviewPlanId":{"type":"string","required":false,"visibility":"user-or-llm","description":"UUID of the interview plan to use (defaults to the job default plan)"},"interviewStageId":{"type":"string","required":false,"visibility":"user-or-llm","description":"UUID of the interview stage to place the application in, or FirstPreInterviewScreen (defaults to the first Lead stage)"},"sourceId":{"type":"string","required":false,"visibility":"user-or-llm","description":"UUID of the source to set on the application"},"creditedToUserId":{"type":"string","required":false,"visibility":"user-or-llm","description":"UUID of the user the application is credited to"},"createdAt":{"type":"string","required":false,"visibility":"user-or-llm","description":"ISO 8601 timestamp to set as the application creation date (defaults to now)"},"applicationHistory":{"type":"json","required":false,"visibility":"user-or-llm","description":"Optional documented application history entries to create with the application"}},"oauth":{"required":false,"provider":"ashby","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"ashby_create_candidate":{"id":"ashby_create_candidate","name":"Ashby Create Candidate","description":"Creates a new candidate record in Ashby.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ashby API Key"},"onBehalfOfUserId":{"type":"string","required":false,"visibility":"user-or-llm","description":"Active Ashby user UUID to attribute this mutation to; the API key must permit on-behalf-of calls"},"name":{"type":"string","required":true,"visibility":"user-or-llm","description":"The candidate full name"},"email":{"type":"string","required":false,"visibility":"user-or-llm","description":"Primary email address for the candidate"},"phoneNumber":{"type":"string","required":false,"visibility":"user-or-llm","description":"Primary phone number for the candidate"},"linkedInUrl":{"type":"string","required":false,"visibility":"user-or-llm","description":"LinkedIn profile URL"},"githubUrl":{"type":"string","required":false,"visibility":"user-or-llm","description":"GitHub profile URL"},"website":{"type":"string","required":false,"visibility":"user-or-llm","description":"Personal website URL"},"sourceId":{"type":"string","required":false,"visibility":"user-or-llm","description":"UUID of the source to attribute the candidate to"},"creditedToUserId":{"type":"string","required":false,"visibility":"user-or-llm","description":"UUID of the Ashby user to credit with sourcing this candidate"},"createdAt":{"type":"string","required":false,"visibility":"user-or-llm","description":"Backdated creation timestamp in ISO 8601 (e.g. 2024-01-01T00:00:00Z). Defaults to now."},"alternateEmailAddresses":{"type":"json","required":false,"visibility":"user-or-llm","description":"Array of additional email address strings to add to the candidate, e.g. [\\"a@x.com\\",\\"b@y.com\\"]"},"location":{"type":"json","required":false,"visibility":"user-or-llm","description":"Candidate location object with optional city, region, and country"}},"oauth":{"required":false,"provider":"ashby","credentialKind":"service-account","credentialParams":{"apiKey":"accessToken"},"credentialSuppliedParams":["apiKey"]},"hostedApiKey":"none"},"ashby_create_note":{"id":"ashby_create_note","name":"Ashby Create Note","description":"Creates a note on a candidate in Ashby. Supports plain text and HTML content (bold, italic, underline, links, lists, code).","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Ashby API Key"},"onBehalfOfUserId":{"type":"string","required":false,"visibility":"user-or-llm","description":"Active Ashby user UUID to attribute this mutation to; the API key must permit on-behalf-of calls"},"candidateId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The UUID of the candidate to add the note to"},"note":{"type":"string","required":true,"visibility":"user-or-llm","description":"The note content. If noteType is text/html, supports: , , , ,