diff --git a/apps/docs/content/docs/integrations/bitbucket.mdx b/apps/docs/content/docs/integrations/bitbucket.mdx index d0712cd7a4e..2739a067b51 100644 --- a/apps/docs/content/docs/integrations/bitbucket.mdx +++ b/apps/docs/content/docs/integrations/bitbucket.mdx @@ -346,6 +346,9 @@ List repository commits in reverse chronological order | --------- | ---- | -------- | ----------- | | `workspaceSlug` | string | Yes | Bitbucket workspace slug or UUID | | `repoSlug` | string | Yes | Bitbucket repository slug or UUID | +| `include` | array | No | Branches, tags, or commit hashes whose history to include; omit to list commits on every ref | +| `exclude` | array | No | Branches, tags, or commit hashes whose reachable commits to leave out | +| `path` | string | No | Only list commits that changed this file or directory | | `nextUrl` | string | No | Opaque next-page URL returned by a previous Bitbucket call | | `pageLen` | number | No | Results per page \(1-100\) | @@ -602,11 +605,15 @@ List pull requests in a Bitbucket Cloud repository | ↳ `commitHash` | string | Commit hash | | ↳ `repositoryUuid` | string | Repository UUID | | ↳ `repositoryFullName` | string | Repository full name | +| ↳ `mergeStrategies` | array | Merge strategies available when this endpoint is the destination | +| ↳ `defaultMergeStrategy` | string | Default merge strategy when this endpoint is the destination | | ↳ `destination` | object | Destination endpoint | | ↳ `branchName` | string | Branch name | | ↳ `commitHash` | string | Commit hash | | ↳ `repositoryUuid` | string | Repository UUID | | ↳ `repositoryFullName` | string | Repository full name | +| ↳ `mergeStrategies` | array | Merge strategies available when this endpoint is the destination | +| ↳ `defaultMergeStrategy` | string | Default merge strategy when this endpoint is the destination | | ↳ `mergeCommitHash` | string | Merge commit hash | | ↳ `commentCount` | number | Comment count | | ↳ `taskCount` | number | Open task count | @@ -692,11 +699,15 @@ Get a pull request by repository-scoped ID | ↳ `commitHash` | string | Commit hash | | ↳ `repositoryUuid` | string | Repository UUID | | ↳ `repositoryFullName` | string | Repository full name | +| ↳ `mergeStrategies` | array | Merge strategies available when this endpoint is the destination | +| ↳ `defaultMergeStrategy` | string | Default merge strategy when this endpoint is the destination | | ↳ `destination` | object | Destination endpoint | | ↳ `branchName` | string | Branch name | | ↳ `commitHash` | string | Commit hash | | ↳ `repositoryUuid` | string | Repository UUID | | ↳ `repositoryFullName` | string | Repository full name | +| ↳ `mergeStrategies` | array | Merge strategies available when this endpoint is the destination | +| ↳ `defaultMergeStrategy` | string | Default merge strategy when this endpoint is the destination | | ↳ `mergeCommitHash` | string | Merge commit hash | | ↳ `commentCount` | number | Comment count | | ↳ `taskCount` | number | Open task count | @@ -788,11 +799,15 @@ Create a pull request between repository branches | ↳ `commitHash` | string | Commit hash | | ↳ `repositoryUuid` | string | Repository UUID | | ↳ `repositoryFullName` | string | Repository full name | +| ↳ `mergeStrategies` | array | Merge strategies available when this endpoint is the destination | +| ↳ `defaultMergeStrategy` | string | Default merge strategy when this endpoint is the destination | | ↳ `destination` | object | Destination endpoint | | ↳ `branchName` | string | Branch name | | ↳ `commitHash` | string | Commit hash | | ↳ `repositoryUuid` | string | Repository UUID | | ↳ `repositoryFullName` | string | Repository full name | +| ↳ `mergeStrategies` | array | Merge strategies available when this endpoint is the destination | +| ↳ `defaultMergeStrategy` | string | Default merge strategy when this endpoint is the destination | | ↳ `mergeCommitHash` | string | Merge commit hash | | ↳ `commentCount` | number | Comment count | | ↳ `taskCount` | number | Open task count | @@ -884,11 +899,15 @@ Start an asynchronous pull request merge and return a task to poll when needed | ↳ `commitHash` | string | Commit hash | | ↳ `repositoryUuid` | string | Repository UUID | | ↳ `repositoryFullName` | string | Repository full name | +| ↳ `mergeStrategies` | array | Merge strategies available when this endpoint is the destination | +| ↳ `defaultMergeStrategy` | string | Default merge strategy when this endpoint is the destination | | ↳ `destination` | object | Destination endpoint | | ↳ `branchName` | string | Branch name | | ↳ `commitHash` | string | Commit hash | | ↳ `repositoryUuid` | string | Repository UUID | | ↳ `repositoryFullName` | string | Repository full name | +| ↳ `mergeStrategies` | array | Merge strategies available when this endpoint is the destination | +| ↳ `defaultMergeStrategy` | string | Default merge strategy when this endpoint is the destination | | ↳ `mergeCommitHash` | string | Merge commit hash | | ↳ `commentCount` | number | Comment count | | ↳ `taskCount` | number | Open task count | @@ -977,11 +996,15 @@ Poll the status of an asynchronous pull request merge task | ↳ `commitHash` | string | Commit hash | | ↳ `repositoryUuid` | string | Repository UUID | | ↳ `repositoryFullName` | string | Repository full name | +| ↳ `mergeStrategies` | array | Merge strategies available when this endpoint is the destination | +| ↳ `defaultMergeStrategy` | string | Default merge strategy when this endpoint is the destination | | ↳ `destination` | object | Destination endpoint | | ↳ `branchName` | string | Branch name | | ↳ `commitHash` | string | Commit hash | | ↳ `repositoryUuid` | string | Repository UUID | | ↳ `repositoryFullName` | string | Repository full name | +| ↳ `mergeStrategies` | array | Merge strategies available when this endpoint is the destination | +| ↳ `defaultMergeStrategy` | string | Default merge strategy when this endpoint is the destination | | ↳ `mergeCommitHash` | string | Merge commit hash | | ↳ `commentCount` | number | Comment count | | ↳ `taskCount` | number | Open task count | @@ -1067,11 +1090,15 @@ Decline an open pull request | ↳ `commitHash` | string | Commit hash | | ↳ `repositoryUuid` | string | Repository UUID | | ↳ `repositoryFullName` | string | Repository full name | +| ↳ `mergeStrategies` | array | Merge strategies available when this endpoint is the destination | +| ↳ `defaultMergeStrategy` | string | Default merge strategy when this endpoint is the destination | | ↳ `destination` | object | Destination endpoint | | ↳ `branchName` | string | Branch name | | ↳ `commitHash` | string | Commit hash | | ↳ `repositoryUuid` | string | Repository UUID | | ↳ `repositoryFullName` | string | Repository full name | +| ↳ `mergeStrategies` | array | Merge strategies available when this endpoint is the destination | +| ↳ `defaultMergeStrategy` | string | Default merge strategy when this endpoint is the destination | | ↳ `mergeCommitHash` | string | Merge commit hash | | ↳ `commentCount` | number | Comment count | | ↳ `taskCount` | number | Open task count | diff --git a/apps/docs/content/docs/integrations/confluence.mdx b/apps/docs/content/docs/integrations/confluence.mdx index 0eb3aee5812..1b14222bcb2 100644 --- a/apps/docs/content/docs/integrations/confluence.mdx +++ b/apps/docs/content/docs/integrations/confluence.mdx @@ -86,6 +86,10 @@ Retrieve content from Confluence pages using the Confluence API. | Parameter | Type | Description | | --------- | ---- | ----------- | | `ts` | string | ISO 8601 timestamp of the operation | +| `labels` | array | Labels on the content \(first 50\) | +| ↳ `id` | string | Unique label identifier | +| ↳ `name` | string | Label name | +| ↳ `prefix` | string | Label prefix/type \(e.g., global, my, team\) | | `pageId` | string | Confluence page ID | | `title` | string | Page title | | `content` | string | Page content with HTML tags stripped | @@ -93,6 +97,9 @@ Retrieve content from Confluence pages using the Confluence API. | `spaceId` | string | ID of the space containing the page | | `parentId` | string | ID of the parent page | | `authorId` | string | Account ID of the page author | +| `ownerId` | string | Account ID of the current page owner | +| `lastOwnerId` | string | Account ID of the previous page owner | +| `parentType` | string | Type of the parent content \(e.g., page, whiteboard, database, embed, folder\) | | `createdAt` | string | ISO 8601 timestamp when the page was created | | `url` | string | URL to view the page in Confluence | | `body` | object | Raw page body content in storage format | @@ -236,7 +243,7 @@ List all pages within a specific Confluence space. Supports pagination and filte | `spaceId` | string | Yes | The ID of the Confluence space to list pages from | | `limit` | number | No | Maximum number of pages to return \(default: 50, max: 250\) | | `status` | string | No | Filter pages by status: current, archived, trashed, or draft | -| `bodyFormat` | string | No | Format for page body content: storage, atlas_doc_format, or view. If not specified, body is not included. | +| `bodyFormat` | string | No | Format for page body content: storage or atlas_doc_format. If not specified, body is not included. | | `cursor` | string | No | Pagination cursor from previous response to get the next page of results | #### Output @@ -251,6 +258,7 @@ List all pages within a specific Confluence space. Supports pagination and filte | ↳ `spaceId` | string | ID of the space containing the page | | ↳ `parentId` | string | ID of the parent page \(null if top-level\) | | ↳ `authorId` | string | Account ID of the page author | +| ↳ `ownerId` | string | Account ID of the current page owner | | ↳ `createdAt` | string | ISO 8601 timestamp when the page was created | | ↳ `version` | object | Page version information | | ↳ `number` | number | Version number | @@ -509,6 +517,8 @@ Search for content across Confluence pages, blog posts, and other content. | `domain` | string | Yes | Your Confluence domain \(e.g., yourcompany.atlassian.net\) | | `query` | string | Yes | Search query string | | `limit` | number | No | Maximum number of results to return \(default: 25\) | +| `cql` | string | No | Extra CQL clauses ANDed with the text search, e.g. type = page AND space = "ENG" AND lastModified > now\("-7d"\) | +| `cursor` | string | No | Pagination cursor from a previous response \(nextCursor\) | #### Output @@ -529,6 +539,8 @@ Search for content across Confluence pages, blog posts, and other content. | ↳ `name` | string | Space name | | ↳ `lastModified` | string | ISO 8601 timestamp of last modification | | ↳ `entityType` | string | Entity type identifier \(e.g., content, space\) | +| `totalSize` | number | Total number of matching results | +| `nextCursor` | string | Cursor for fetching the next page of results | @@ -547,6 +559,7 @@ Search for content within a specific Confluence space. Optionally filter by text | `query` | string | No | Text search query. If not provided, returns all content in the space. | | `contentType` | string | No | Filter by content type: page, blogpost, attachment, or comment | | `limit` | number | No | Maximum number of results to return \(default: 25, max: 250\) | +| `cursor` | string | No | Pagination cursor from a previous response \(nextCursor\) | #### Output @@ -569,6 +582,7 @@ Search for content within a specific Confluence space. Optionally filter by text | ↳ `name` | string | Space name | | ↳ `lastModified` | string | ISO 8601 timestamp of last modification | | ↳ `entityType` | string | Entity type identifier \(e.g., content, space\) | +| `nextCursor` | string | Cursor for fetching the next page of results | @@ -623,13 +637,17 @@ Get a specific Confluence blog post by ID, including its content. | --------- | ---- | -------- | ----------- | | `domain` | string | Yes | Your Confluence domain \(e.g., yourcompany.atlassian.net\) | | `blogPostId` | string | Yes | The ID of the blog post to retrieve | -| `bodyFormat` | string | No | Format for blog post body: storage, atlas_doc_format, or view | +| `bodyFormat` | string | No | Format for blog post body: storage, atlas_doc_format, view, or export_view \(default: storage\) | #### Output | Parameter | Type | Description | | --------- | ---- | ----------- | | `ts` | string | ISO 8601 timestamp of the operation | +| `labels` | array | Labels on the content \(first 50\) | +| ↳ `id` | string | Unique label identifier | +| ↳ `name` | string | Label name | +| ↳ `prefix` | string | Label prefix/type \(e.g., global, my, team\) | | `id` | string | Blog post ID | | `title` | string | Blog post title | | `status` | string | Blog post status | @@ -716,7 +734,7 @@ List all blog posts within a specific Confluence space. | `spaceId` | string | Yes | The ID of the Confluence space to list blog posts from | | `limit` | number | No | Maximum number of blog posts to return \(default: 25, max: 250\) | | `status` | string | No | Filter by status: current, archived, trashed, or draft | -| `bodyFormat` | string | No | Format for blog post body: storage, atlas_doc_format, or view | +| `bodyFormat` | string | No | Format for blog post body: storage or atlas_doc_format. If not specified, body is not included. | | `cursor` | string | No | Pagination cursor from previous response | #### Output @@ -765,6 +783,7 @@ Add a comment to a Confluence page. | `domain` | string | Yes | Your Confluence domain \(e.g., yourcompany.atlassian.net\) | | `pageId` | string | Yes | Confluence page ID to comment on | | `comment` | string | Yes | Comment text in Confluence storage format | +| `parentCommentId` | string | No | ID of a footer or inline comment to reply to. When set, the comment is posted as a reply in that thread. | #### Output @@ -773,6 +792,15 @@ Add a comment to a Confluence page. | `ts` | string | Timestamp of creation | | `commentId` | string | Created comment ID | | `pageId` | string | Page ID | +| `parentCommentId` | string | ID of the parent comment when the comment is a reply | +| `status` | string | Comment status \(e.g., current\) | +| `version` | object | Comment version information | +| ↳ `number` | number | Version number | +| ↳ `message` | string | Version message | +| ↳ `minorEdit` | boolean | Whether this is a minor edit | +| ↳ `authorId` | string | Account ID of the version author | +| ↳ `createdAt` | string | ISO 8601 timestamp of version creation | +| `webUrl` | string | URL to view the comment in Confluence | @@ -789,8 +817,9 @@ List all comments on a Confluence page. | `domain` | string | Yes | Your Confluence domain \(e.g., yourcompany.atlassian.net\) | | `pageId` | string | Yes | Confluence page ID to list comments from | | `limit` | number | No | Maximum number of comments to return \(default: 25\) | -| `bodyFormat` | string | No | Format for the comment body: storage, atlas_doc_format, view, or export_view \(default: storage\) | +| `bodyFormat` | string | No | Format for the comment body: storage or atlas_doc_format \(default: storage\) | | `cursor` | string | No | Pagination cursor from previous response | +| `commentType` | string | No | Which comments to list: footer \(comments at the bottom of the page\) or inline \(comments attached to highlighted text\). Default: footer | #### Output @@ -815,6 +844,11 @@ List all comments on a Confluence page. | ↳ `minorEdit` | boolean | Whether this is a minor edit | | ↳ `authorId` | string | Account ID of the version author | | ↳ `createdAt` | string | ISO 8601 timestamp of version creation | +| ↳ `commentType` | string | Comment type that was listed \(footer or inline\) | +| ↳ `resolutionStatus` | string | Inline comment resolution status \(open, reopened, resolved, dangling\) | +| ↳ `inlineOriginalSelection` | string | Page text the inline comment is attached to | +| ↳ `inlineMarkerRef` | string | Marker reference of the highlighted text for an inline comment | +| ↳ `webUrl` | string | URL to view the comment in Confluence | | `nextCursor` | string | Cursor for fetching the next page of results | @@ -927,6 +961,8 @@ List all attachments on a Confluence page. | ↳ `pageId` | string | ID of the page the attachment belongs to | | ↳ `blogPostId` | string | ID of the blog post the attachment belongs to | | ↳ `comment` | string | Comment/description of the attachment | +| ↳ `createdAt` | string | ISO 8601 timestamp when the attachment was created | +| ↳ `fileId` | string | Media file ID of the attachment | | ↳ `version` | object | Attachment version information | | ↳ `number` | number | Version number | | ↳ `message` | string | Version message | @@ -1067,6 +1103,7 @@ Retrieve all pages that have a specific label applied. | ↳ `spaceId` | string | ID of the space containing the page | | ↳ `parentId` | string | ID of the parent page \(null if top-level\) | | ↳ `authorId` | string | Account ID of the page author | +| ↳ `ownerId` | string | Account ID of the current page owner | | ↳ `createdAt` | string | ISO 8601 timestamp when the page was created | | ↳ `version` | object | Page version information | | ↳ `number` | number | Version number | @@ -1137,6 +1174,7 @@ Get details about a specific Confluence space. | `description` | object | Space description content | | ↳ `value` | string | Description text content | | ↳ `representation` | string | Content representation format \(e.g., plain, view, storage\) | +| `spaceOwnerId` | string | Account ID of the space owner | @@ -1258,9 +1296,11 @@ List all Confluence spaces accessible to the user. | ↳ `authorId` | string | Account ID of the space creator | | ↳ `createdAt` | string | ISO 8601 timestamp when the space was created | | ↳ `homepageId` | string | ID of the space homepage | -| ↳ `description` | object | Space description | +| ↳ `description` | object | Space description \(plain text\) | | ↳ `value` | string | Description text content | | ↳ `representation` | string | Content representation format \(e.g., plain, view, storage\) | +| ↳ `spaceOwnerId` | string | Account ID of the space owner | +| ↳ `webUrl` | string | URL to view the space in Confluence | | `nextCursor` | string | Cursor for fetching the next page of results | diff --git a/apps/docs/content/docs/integrations/jira.mdx b/apps/docs/content/docs/integrations/jira.mdx index 851e72f4496..2bc99e6a352 100644 --- a/apps/docs/content/docs/integrations/jira.mdx +++ b/apps/docs/content/docs/integrations/jira.mdx @@ -106,6 +106,9 @@ Retrieve detailed information about a specific Jira issue | `self` | string | REST API URL for this issue | | `summary` | string | Issue summary | | `description` | string | Issue description text \(extracted from ADF\) | +| `descriptionAdf` | json | Issue description as the raw Atlassian Document Format \(ADF\) document | +| `renderedDescription` | string | Issue description rendered as HTML \(requires the renderedFields expansion\) | +| `environment` | string | Environment text \(extracted from ADF\) | | `status` | object | Issue status | | ↳ `id` | string | Status ID | | ↳ `name` | string | Status name \(e.g., Open, In Progress, Done\) | @@ -274,6 +277,16 @@ Retrieve detailed information about a specific Jira issue | ↳ `timeZone` | string | User timezone | | ↳ `authorName` | string | Attachment author display name | | ↳ `created` | string | ISO 8601 timestamp when the attachment was created | +| `watchers` | array | Users watching the issue | +| ↳ `accountId` | string | Atlassian account ID of the user | +| ↳ `displayName` | string | Display name of the user | +| ↳ `active` | boolean | Whether the user account is active | +| ↳ `emailAddress` | string | Email address of the user | +| ↳ `accountType` | string | Type of account \(e.g., atlassian, app, customer\) | +| ↳ `avatarUrl` | string | URL to the user avatar \(48x48\) | +| ↳ `timeZone` | string | User timezone | +| `customFields` | json | Every customfield_* value Jira returned, keyed by field ID \(e.g., sprint, story points, team\). Use the names output or Get Fields to map IDs to names. | +| `names` | json | Map of field ID to display name for every returned field | | `issueKey` | string | Issue key \(e.g., PROJ-123\) | | `issue` | json | Complete raw Jira issue object from the API | | `files` | file[] | Downloaded attachment files \(only when includeAttachments is true\) | @@ -303,6 +316,8 @@ Update a Jira issue | `environment` | string | No | Environment information for the issue | | `customFieldId` | string | No | Custom field ID to update \(e.g., customfield_10001\) | | `customFieldValue` | string | No | Value for the custom field | +| `customFields` | json | No | Additional fields as a JSON object mapping field IDs to Jira field values \(e.g., \{"customfield_10016": 5, "customfield_10020": 42, "customfield_10050": \{"value": "Option A"\}\}\). Numeric keys become customfield_<n>. Explicit params take precedence for the same field. | +| `parent` | json | No | New parent issue key or ID \(e.g., "PROJ-123" or \{ "key": "PROJ-123" \}\) to move a subtask or set the epic | | `notifyUsers` | boolean | No | Whether to send email notifications about this update \(default: true\) | #### Output @@ -342,6 +357,7 @@ Create a new Jira issue | `environment` | string | No | Environment information for the issue | | `customFieldId` | string | No | Custom field ID \(e.g., customfield_10001\) | | `customFieldValue` | string | No | Value for the custom field | +| `customFields` | json | No | Additional fields as a JSON object mapping field IDs to Jira field values \(e.g., \{"customfield_10016": 5, "customfield_10020": 42, "customfield_10050": \{"value": "Option A"\}\}\). Numeric keys become customfield_<n>. Explicit params take precedence for the same field. | #### Output @@ -501,6 +517,7 @@ Move a Jira issue between workflow statuses (e.g., To Do -> In Progress) | `transitionId` | string | Yes | ID of the transition to execute \(e.g., "11" for "To Do", "21" for "In Progress"\) | | `comment` | string | No | Optional comment to add when transitioning the issue | | `resolution` | string | No | Resolution name to set during transition \(e.g., "Fixed", "Won't Fix"\) | +| `fields` | json | No | Fields to set on the transition screen, as a JSON object mapping field IDs to Jira values \(e.g., \{"assignee": \{"accountId": "5b10..."\}, "customfield_10010": "value"\}\). The resolution param takes precedence over a resolution set here. | #### Output @@ -532,6 +549,7 @@ Search for Jira issues using JQL (Jira Query Language) | `nextPageToken` | string | No | Cursor token for the next page of results. Omit for the first page. | | `maxResults` | number | No | Maximum number of results to return per page \(default: 50\) | | `fields` | array | No | Array of field names to return \(default: all fields\). | +| `expand` | string | No | Comma-separated expansions: renderedFields, names, schema, transitions, operations, editmeta, changelog | #### Output @@ -544,6 +562,9 @@ Search for Jira issues using JQL (Jira Query Language) | ↳ `self` | string | REST API URL for this issue | | ↳ `summary` | string | Issue summary | | ↳ `description` | string | Issue description text \(extracted from ADF\) | +| ↳ `descriptionAdf` | json | Issue description as the raw Atlassian Document Format \(ADF\) document | +| ↳ `renderedDescription` | string | Issue description rendered as HTML \(requires the renderedFields expansion\) | +| ↳ `environment` | string | Environment text \(extracted from ADF\) | | ↳ `status` | object | Issue status | | ↳ `id` | string | Status ID | | ↳ `name` | string | Status name \(e.g., Open, In Progress, Done\) | @@ -598,8 +619,81 @@ Search for Jira issues using JQL (Jira Query Language) | ↳ `duedate` | string | Due date \(YYYY-MM-DD\) | | ↳ `created` | string | ISO 8601 timestamp when the issue was created | | ↳ `updated` | string | ISO 8601 timestamp when the issue was last updated | +| ↳ `creator` | object | Issue creator | +| ↳ `accountId` | string | Atlassian account ID of the user | +| ↳ `displayName` | string | Display name of the user | +| ↳ `active` | boolean | Whether the user account is active | +| ↳ `emailAddress` | string | Email address of the user | +| ↳ `accountType` | string | Type of account \(e.g., atlassian, app, customer\) | +| ↳ `avatarUrl` | string | URL to the user avatar \(48x48\) | +| ↳ `timeZone` | string | User timezone | +| ↳ `fixVersions` | array | Fix versions | +| ↳ `id` | string | Version ID | +| ↳ `name` | string | Version name | +| ↳ `released` | boolean | Whether the version is released | +| ↳ `releaseDate` | string | Release date \(YYYY-MM-DD\) | +| ↳ `resolutiondate` | string | ISO 8601 timestamp when the issue was resolved | +| ↳ `timetracking` | object | Time tracking information | +| ↳ `originalEstimate` | string | Original estimate in human-readable format \(e.g., 1w 2d\) | +| ↳ `remainingEstimate` | string | Remaining estimate in human-readable format | +| ↳ `timeSpent` | string | Time spent in human-readable format | +| ↳ `originalEstimateSeconds` | number | Original estimate in seconds | +| ↳ `remainingEstimateSeconds` | number | Remaining estimate in seconds | +| ↳ `timeSpentSeconds` | number | Time spent in seconds | +| ↳ `parent` | object | Parent issue \(subtask parent or epic\) | +| ↳ `id` | string | Parent issue ID | +| ↳ `key` | string | Parent issue key | +| ↳ `summary` | string | Parent issue summary | +| ↳ `issuelinks` | array | Linked issues | +| ↳ `id` | string | Issue link ID | +| ↳ `type` | object | Link type information | +| ↳ `id` | string | Link type ID | +| ↳ `name` | string | Link type name \(e.g., Blocks, Relates\) | +| ↳ `inward` | string | Inward description \(e.g., is blocked by\) | +| ↳ `outward` | string | Outward description \(e.g., blocks\) | +| ↳ `inwardIssue` | object | Inward linked issue | +| ↳ `id` | string | Issue ID | +| ↳ `key` | string | Issue key | +| ↳ `statusName` | string | Issue status name | +| ↳ `summary` | string | Issue summary | +| ↳ `outwardIssue` | object | Outward linked issue | +| ↳ `id` | string | Issue ID | +| ↳ `key` | string | Issue key | +| ↳ `statusName` | string | Issue status name | +| ↳ `summary` | string | Issue summary | +| ↳ `subtasks` | array | Subtask issues | +| ↳ `id` | string | Subtask issue ID | +| ↳ `key` | string | Subtask issue key | +| ↳ `summary` | string | Subtask summary | +| ↳ `statusName` | string | Subtask status name | +| ↳ `issueTypeName` | string | Subtask issue type name | +| ↳ `votes` | object | Vote information | +| ↳ `votes` | number | Number of votes | +| ↳ `hasVoted` | boolean | Whether the current user has voted | +| ↳ `watches` | object | Watch information | +| ↳ `watchCount` | number | Number of watchers | +| ↳ `isWatching` | boolean | Whether the current user is watching | +| ↳ `attachments` | array | Attachment metadata \(no file contents\) | +| ↳ `id` | string | Attachment ID | +| ↳ `filename` | string | Attachment file name | +| ↳ `mimeType` | string | MIME type of the attachment | +| ↳ `size` | number | File size in bytes | +| ↳ `content` | string | URL to download the attachment content | +| ↳ `thumbnail` | string | URL to the attachment thumbnail | +| ↳ `author` | object | Attachment author | +| ↳ `accountId` | string | Atlassian account ID of the user | +| ↳ `displayName` | string | Display name of the user | +| ↳ `active` | boolean | Whether the user account is active | +| ↳ `emailAddress` | string | Email address of the user | +| ↳ `accountType` | string | Type of account \(e.g., atlassian, app, customer\) | +| ↳ `avatarUrl` | string | URL to the user avatar \(48x48\) | +| ↳ `timeZone` | string | User timezone | +| ↳ `authorName` | string | Attachment author display name | +| ↳ `created` | string | ISO 8601 timestamp when the attachment was created | +| ↳ `customFields` | json | Every customfield_* value Jira returned, keyed by field ID \(e.g., sprint, story points, team\). Use the names output or Get Fields to map IDs to names. | | `nextPageToken` | string | Cursor token for the next page. Null when no more results. | | `isLast` | boolean | Whether this is the last page of results | +| `names` | json | Map of field ID to display name \(e.g., customfield_10020 → "Sprint"\). Only returned when expand includes names. | | `total` | number | Always null. The Jira /search/jql endpoint does not return a total count; use isLast and nextPageToken for pagination. | @@ -1374,7 +1468,7 @@ Trigger workflow when a comment is deleted from a Jira issue | Parameter | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Jira using HMAC signature | -| `jqlFilter` | string | No | Filter which comment deletions trigger this workflow using JQL | +| `jqlFilter` | string | No | Filter which comment deletions trigger this workflow using JQL. Sim does not evaluate this filter: enter the same JQL in the Jira webhook's JQL field so Jira only sends matching events. | #### Output @@ -1461,7 +1555,7 @@ Trigger workflow when a comment is updated on a Jira issue | Parameter | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Jira using HMAC signature | -| `jqlFilter` | string | No | Filter which comment updates trigger this workflow using JQL | +| `jqlFilter` | string | No | Filter which comment updates trigger this workflow using JQL. Sim does not evaluate this filter: enter the same JQL in the Jira webhook's JQL field so Jira only sends matching events. | #### Output @@ -1548,7 +1642,7 @@ Trigger workflow when a comment is added to a Jira issue | Parameter | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Jira using HMAC signature | -| `jqlFilter` | string | No | Filter which issue comments trigger this workflow using JQL | +| `jqlFilter` | string | No | Filter which issue comments trigger this workflow using JQL. Sim does not evaluate this filter: enter the same JQL in the Jira webhook's JQL field so Jira only sends matching events. | #### Output @@ -1635,7 +1729,7 @@ Trigger workflow when a new issue is created in Jira | Parameter | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Jira using HMAC signature | -| `jqlFilter` | string | No | Filter which issues trigger this workflow using JQL \(Jira Query Language\) | +| `jqlFilter` | string | No | Filter which issues trigger this workflow using JQL \(Jira Query Language\). Sim does not evaluate this filter: enter the same JQL in the Jira webhook's JQL field so Jira only sends matching events. | #### Output @@ -1710,7 +1804,7 @@ Trigger workflow when an issue is deleted in Jira | Parameter | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Jira using HMAC signature | -| `jqlFilter` | string | No | Filter which issue deletions trigger this workflow using JQL | +| `jqlFilter` | string | No | Filter which issue deletions trigger this workflow using JQL. Sim does not evaluate this filter: enter the same JQL in the Jira webhook's JQL field so Jira only sends matching events. | #### Output @@ -1785,7 +1879,7 @@ Trigger workflow when an issue is updated in Jira | Parameter | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Jira using HMAC signature | -| `jqlFilter` | string | No | Filter which issue updates trigger this workflow using JQL | +| `jqlFilter` | string | No | Filter which issue updates trigger this workflow using JQL. Sim does not evaluate this filter: enter the same JQL in the Jira webhook's JQL field so Jira only sends matching events. | | `fieldFilters` | string | No | Comma-separated list of Jira field names. Only trigger when one of these fields changes. Leave empty to trigger on any field change. | #### Output @@ -2174,7 +2268,7 @@ Trigger workflow when time is logged on a Jira issue | Parameter | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Jira using HMAC signature | -| `jqlFilter` | string | No | Filter which worklog entries trigger this workflow using JQL | +| `jqlFilter` | string | No | Filter which worklog entries trigger this workflow using JQL. Sim does not evaluate this filter: enter the same JQL in the Jira webhook's JQL field so Jira only sends matching events. | #### Output @@ -2265,7 +2359,7 @@ Trigger workflow when a worklog entry is deleted from a Jira issue | Parameter | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Jira using HMAC signature | -| `jqlFilter` | string | No | Filter which worklog deletions trigger this workflow using JQL | +| `jqlFilter` | string | No | Filter which worklog deletions trigger this workflow using JQL. Sim does not evaluate this filter: enter the same JQL in the Jira webhook's JQL field so Jira only sends matching events. | #### Output @@ -2356,7 +2450,7 @@ Trigger workflow when a worklog entry is updated on a Jira issue | Parameter | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `webhookSecret` | string | No | Optional secret to validate webhook deliveries from Jira using HMAC signature | -| `jqlFilter` | string | No | Filter which worklog updates trigger this workflow using JQL | +| `jqlFilter` | string | No | Filter which worklog updates trigger this workflow using JQL. Sim does not evaluate this filter: enter the same JQL in the Jira webhook's JQL field so Jira only sends matching events. | #### Output diff --git a/apps/docs/content/docs/integrations/jira_service_management.mdx b/apps/docs/content/docs/integrations/jira_service_management.mdx index e673dbb4920..b9e2401c7d6 100644 --- a/apps/docs/content/docs/integrations/jira_service_management.mdx +++ b/apps/docs/content/docs/integrations/jira_service_management.mdx @@ -98,7 +98,8 @@ Get all service desks from Jira Service Management | ↳ `projectId` | string | Associated Jira project ID | | ↳ `projectName` | string | Associated project name | | ↳ `projectKey` | string | Associated project key | -| ↳ `name` | string | Service desk name | +| ↳ `projectTypeKey` | string | Associated project type key \(e.g., service_desk\) | +| ↳ `name` | string | Service desk name \(not returned by the Service Desk API; use projectName\) | | ↳ `description` | string | Service desk description | | ↳ `leadDisplayName` | string | Project lead display name | | `total` | number | Total number of service desks | @@ -177,8 +178,14 @@ Create a new service request in Jira Service Management | `createdDate` | json | Creation date with iso8601, friendly, epochMillis | | `currentStatus` | json | Current status with status name and category | | `reporter` | json | Reporter user with accountId, displayName, emailAddress | +| `requestFieldValues` | array | Field values stored on the created request | +| ↳ `fieldId` | string | Field identifier | +| ↳ `label` | string | Human-readable field label | +| ↳ `value` | json | Field value | +| ↳ `renderedValue` | json | HTML-rendered field value | | `success` | boolean | Whether the request was created successfully | | `url` | string | URL to the created request | +| `webUrl` | string | Customer portal URL for the request \(from _links.web\) | @@ -194,7 +201,7 @@ Get a single service request from Jira Service Management | --------- | ---- | -------- | ----------- | | `domain` | string | Yes | Your Jira domain \(e.g., yourcompany.atlassian.net\) | | `issueIdOrKey` | string | Yes | Issue ID or key \(e.g., SD-123\) | -| `expand` | string | No | Comma-separated fields to expand: participant, status, sla, requestType, serviceDesk, attachment, comment, action | +| `expand` | string | No | Comma-separated fields to expand: participant, status, sla, requestType, serviceDesk, attachment, comment, action, comment.attachment, comment.renderedBody | #### Output @@ -221,6 +228,18 @@ Get a single service request from Jira Service Management | ↳ `value` | json | Field value | | ↳ `renderedValue` | json | HTML-rendered field value | | `url` | string | URL to the request | +| `webUrl` | string | Customer portal URL for the request \(from _links.web\) | +| `participants` | array | Request participants \(returned when expand includes participant\) | +| ↳ `accountId` | string | Atlassian account ID | +| ↳ `displayName` | string | User display name | +| ↳ `emailAddress` | string | User email address | +| ↳ `active` | boolean | Whether the account is active | +| `slas` | array | SLA records \(returned when expand includes sla\) | +| ↳ `id` | string | SLA metric ID | +| ↳ `name` | string | SLA metric name | +| ↳ `slaDisplayFormat` | string | How the SLA time is displayed \(e.g., NEW_SLA_FORMAT\) | +| ↳ `completedCycles` | json | Completed SLA cycles with startTime, stopTime, breachTime, breached, goalDuration, elapsedTime, remainingTime \(each time as DateDTO, durations as DurationDTO\) | +| ↳ `ongoingCycle` | json | Ongoing SLA cycle with startTime, breachTime, breached, paused, withinCalendarHours, goalDuration, elapsedTime, remainingTime | | `request` | json | The service request object | @@ -237,8 +256,10 @@ Get multiple service requests from Jira Service Management | --------- | ---- | -------- | ----------- | | `domain` | string | Yes | Your Jira domain \(e.g., yourcompany.atlassian.net\) | | `serviceDeskId` | string | No | Filter by service desk ID \(e.g., "1", "2"\) | -| `requestOwnership` | string | No | Filter by ownership: OWNED_REQUESTS, PARTICIPATED_REQUESTS, APPROVER, ALL_REQUESTS | +| `requestOwnership` | string | No | Filter by ownership: OWNED_REQUESTS, PARTICIPATED_REQUESTS, APPROVER, ORGANIZATION \(with organizationId\), ALL_ORGANIZATIONS, ALL_REQUESTS | | `requestStatus` | string | No | Filter by status: OPEN_REQUESTS, CLOSED_REQUESTS, ALL_REQUESTS | +| `approvalStatus` | string | No | Filter approver requests: MY_PENDING_APPROVAL or MY_HISTORY_APPROVAL \(only with requestOwnership APPROVER\) | +| `organizationId` | string | No | Filter by customer organization ID \(only with requestOwnership ORGANIZATION\) | | `requestTypeId` | string | No | Filter by request type ID | | `searchTerm` | string | No | Search term to filter requests \(e.g., "password reset", "laptop"\) | | `expand` | string | No | Comma-separated fields to expand: participant, status, sla, requestType, serviceDesk, attachment, comment, action | @@ -270,6 +291,12 @@ Get multiple service requests from Jira Service Management | ↳ `label` | string | Human-readable field label | | ↳ `value` | json | Field value | | ↳ `renderedValue` | json | HTML-rendered field value | +| ↳ `_links` | json | Request links: web \(customer portal URL\), agent, jiraRest, self | +| ↳ `participants` | json | Paged participants \(values, size, isLastPage\) when expand includes participant | +| ↳ `sla` | json | Paged SLA records \(values with ongoingCycle, completedCycles\) when expand includes sla | +| ↳ `status` | json | Paged status history when expand includes status | +| ↳ `requestType` | json | Request type details when expand includes requestType | +| ↳ `serviceDesk` | json | Service desk details when expand includes serviceDesk | | `total` | number | Total number of requests in current page | | `isLastPage` | boolean | Whether this is the last page | @@ -428,6 +455,9 @@ Get organizations for a service desk in Jira Service Management | `organizations` | array | List of organizations | | ↳ `id` | string | Organization ID | | ↳ `name` | string | Organization name | +| ↳ `uuid` | string | Organization UUID | +| ↳ `created` | json | Creation date with iso8601, friendly, epochMillis | +| ↳ `scimManaged` | boolean | Whether the organization is managed by SCIM | | `total` | number | Total number of organizations | | `isLastPage` | boolean | Whether this is the last page | @@ -538,6 +568,7 @@ Get SLA information for a service request in Jira Service Management | `slas` | array | List of SLA metrics | | ↳ `id` | string | SLA metric ID | | ↳ `name` | string | SLA metric name | +| ↳ `slaDisplayFormat` | string | How the SLA time is displayed \(e.g., NEW_SLA_FORMAT\) | | ↳ `completedCycles` | json | Completed SLA cycles with startTime, stopTime, breachTime, breached, goalDuration, elapsedTime, remainingTime \(each time as DateDTO, durations as DurationDTO\) | | ↳ `ongoingCycle` | json | Ongoing SLA cycle with startTime, breachTime, breached, paused, withinCalendarHours, goalDuration, elapsedTime, remainingTime | | `total` | number | Total number of SLAs | @@ -1272,7 +1303,7 @@ Search Assets (Insight/CMDB) objects using AQL (Assets Query Language), e.g. obj | `workspaceId` | string | No | Assets workspace ID \(resolved automatically when omitted\) | | `qlQuery` | string | Yes | AQL query string \(e.g., objectType = "Host" AND "Operating System" = "Ubuntu"\) | | `page` | number | No | Page number \(1-based, defaults to 1\) | -| `resultsPerPage` | number | No | Results per page \(e.g., 25, 50\) | +| `resultsPerPage` | number | No | Results per page \(e.g., 25, 50; defaults to 25\) | | `includeAttributes` | boolean | No | Include resolved attribute values on each object \(defaults to true\) | | `objectTypeId` | string | No | Optionally scope the search to a single object type ID | | `objectSchemaId` | string | No | Optionally scope the search to a single object schema ID | @@ -1288,9 +1319,12 @@ Search Assets (Insight/CMDB) objects using AQL (Assets Query Language), e.g. obj | ↳ `objectKey` | string | Object key \(e.g., HOST-123\) | | ↳ `objectType` | json | Object type metadata | | ↳ `attributes` | json | Resolved attribute values | -| `total` | number | Total number of matching objects \(totalFilterCount\) | +| `total` | number | Total number of matching objects | | `pageNumber` | number | Current page number | | `pageSize` | number | Number of objects on this page | +| `startAt` | number | Index of the first object on this page | +| `maxResults` | number | Maximum objects requested for this page | +| `isLast` | boolean | Whether this is the last page of results | diff --git a/apps/docs/content/docs/integrations/trello.mdx b/apps/docs/content/docs/integrations/trello.mdx index 443251cf93c..ddf5603034a 100644 --- a/apps/docs/content/docs/integrations/trello.mdx +++ b/apps/docs/content/docs/integrations/trello.mdx @@ -83,6 +83,8 @@ List cards from a Trello board or list | `boardId` | string | No | Trello board ID to list open cards from. Provide either boardId or listId | | `listId` | string | No | Trello list ID to list cards from. Provide either boardId or listId | | `filter` | string | No | Which cards to return: open, closed, or all \(defaults to open\) | +| `since` | string | No | Only return cards created since this date \(ISO 8601\) or card ID | +| `before` | string | No | Only return cards created before this date \(ISO 8601\) or card ID | #### Output @@ -103,6 +105,54 @@ List cards from a Trello board or list | ↳ `color` | string | Label color | | ↳ `due` | string | Card due date in ISO 8601 format | | ↳ `dueComplete` | boolean | Whether the due date is complete | +| ↳ `start` | string | Card start date in ISO 8601 format | +| ↳ `pos` | number | Position of the card in its list | +| ↳ `shortUrl` | string | Short card URL without the name slug | +| ↳ `shortLink` | string | 8-character short card ID | +| ↳ `idShort` | number | Board-specific numeric card ID \(can change when the card moves\) | +| ↳ `idMembers` | array | Member IDs assigned to the card | +| ↳ `idChecklists` | array | Checklist IDs on the card | +| ↳ `dateLastActivity` | string | When the card last had activity \(ISO 8601\) | +| ↳ `badges` | object | Card badge counts shown on the front of the card | +| ↳ `votes` | number | Vote count | +| ↳ `comments` | number | Comment count | +| ↳ `attachments` | number | Attachment count | +| ↳ `checkItems` | number | Total checklist items | +| ↳ `checkItemsChecked` | number | Completed checklist items | +| ↳ `description` | boolean | Whether the card has a description | +| ↳ `subscribed` | boolean | Whether the current member is subscribed | +| ↳ `location` | boolean | Whether the card has a location | +| ↳ `due` | string | Due date | +| ↳ `start` | string | Start date | +| ↳ `dueComplete` | boolean | Whether the due date is complete | +| ↳ `checklists` | array | Checklists with their items. Only returned when checklists are requested | +| ↳ `id` | string | Checklist ID | +| ↳ `name` | string | Checklist name | +| ↳ `idCard` | string | Card ID | +| ↳ `idBoard` | string | Board ID | +| ↳ `pos` | number | Checklist position | +| ↳ `checkItems` | array | Checklist items | +| ↳ `id` | string | Checklist item ID | +| ↳ `name` | string | Checklist item name | +| ↳ `state` | string | complete or incomplete | +| ↳ `pos` | number | Item position | +| ↳ `idChecklist` | string | Checklist ID | +| ↳ `due` | string | Item due date | +| ↳ `idMember` | string | Assigned member ID | +| ↳ `attachments` | array | Card attachments. Only returned when attachments are requested | +| ↳ `id` | string | Attachment ID | +| ↳ `name` | string | Attachment name | +| ↳ `url` | string | Attachment URL | +| ↳ `mimeType` | string | Attachment MIME type | +| ↳ `bytes` | number | File size in bytes | +| ↳ `date` | string | When the attachment was added | +| ↳ `idMember` | string | ID of the member who added it | +| ↳ `isUpload` | boolean | Whether the attachment was uploaded | +| ↳ `pos` | number | Attachment position | +| ↳ `members` | array | Member objects on the card. Only returned when members are requested | +| ↳ `id` | string | Member ID | +| ↳ `fullName` | string | Member full name | +| ↳ `username` | string | Member username | | `count` | number | Number of cards returned | @@ -121,6 +171,9 @@ Search Trello cards and boards by keyword | `idBoards` | array | No | Restrict the search to these board IDs | | `modelTypes` | string | No | Comma-separated result types to search: cards, boards, or all \(default all\) | | `cardsLimit` | number | No | Maximum number of cards to return \(1-1000, default 10\) | +| `cardsPage` | number | No | Page of card results to return \(0-100, default 0\) | +| `boardsLimit` | number | No | Maximum number of boards to return \(1-1000, default 10\) | +| `partial` | boolean | No | Match the start of words as well as whole words \(default false\) | #### Output @@ -134,6 +187,61 @@ Search Trello cards and boards by keyword | ↳ `idBoard` | string | Board ID containing the card | | ↳ `idList` | string | List ID containing the card | | ↳ `closed` | boolean | Whether the card is archived | +| ↳ `labelIds` | array | Label IDs applied to the card | +| ↳ `labels` | array | Labels applied to the card | +| ↳ `id` | string | Label ID | +| ↳ `name` | string | Label name | +| ↳ `color` | string | Label color | +| ↳ `due` | string | Card due date in ISO 8601 format | +| ↳ `dueComplete` | boolean | Whether the due date is complete | +| ↳ `start` | string | Card start date in ISO 8601 format | +| ↳ `pos` | number | Position of the card in its list | +| ↳ `shortUrl` | string | Short card URL without the name slug | +| ↳ `shortLink` | string | 8-character short card ID | +| ↳ `idShort` | number | Board-specific numeric card ID \(can change when the card moves\) | +| ↳ `idMembers` | array | Member IDs assigned to the card | +| ↳ `idChecklists` | array | Checklist IDs on the card | +| ↳ `dateLastActivity` | string | When the card last had activity \(ISO 8601\) | +| ↳ `badges` | object | Card badge counts shown on the front of the card | +| ↳ `votes` | number | Vote count | +| ↳ `comments` | number | Comment count | +| ↳ `attachments` | number | Attachment count | +| ↳ `checkItems` | number | Total checklist items | +| ↳ `checkItemsChecked` | number | Completed checklist items | +| ↳ `description` | boolean | Whether the card has a description | +| ↳ `subscribed` | boolean | Whether the current member is subscribed | +| ↳ `location` | boolean | Whether the card has a location | +| ↳ `due` | string | Due date | +| ↳ `start` | string | Start date | +| ↳ `dueComplete` | boolean | Whether the due date is complete | +| ↳ `checklists` | array | Checklists with their items. Only returned when checklists are requested | +| ↳ `id` | string | Checklist ID | +| ↳ `name` | string | Checklist name | +| ↳ `idCard` | string | Card ID | +| ↳ `idBoard` | string | Board ID | +| ↳ `pos` | number | Checklist position | +| ↳ `checkItems` | array | Checklist items | +| ↳ `id` | string | Checklist item ID | +| ↳ `name` | string | Checklist item name | +| ↳ `state` | string | complete or incomplete | +| ↳ `pos` | number | Item position | +| ↳ `idChecklist` | string | Checklist ID | +| ↳ `due` | string | Item due date | +| ↳ `idMember` | string | Assigned member ID | +| ↳ `attachments` | array | Card attachments. Only returned when attachments are requested | +| ↳ `id` | string | Attachment ID | +| ↳ `name` | string | Attachment name | +| ↳ `url` | string | Attachment URL | +| ↳ `mimeType` | string | Attachment MIME type | +| ↳ `bytes` | number | File size in bytes | +| ↳ `date` | string | When the attachment was added | +| ↳ `idMember` | string | ID of the member who added it | +| ↳ `isUpload` | boolean | Whether the attachment was uploaded | +| ↳ `pos` | number | Attachment position | +| ↳ `members` | array | Member objects on the card. Only returned when members are requested | +| ↳ `id` | string | Member ID | +| ↳ `fullName` | string | Member full name | +| ↳ `username` | string | Member username | | `boards` | array | Boards matching the search query | | ↳ `id` | string | Board ID | | ↳ `name` | string | Board name | @@ -160,6 +268,7 @@ Create a new card in a Trello list | `desc` | string | No | Description of the card | | `pos` | string | No | Position of the card \(top, bottom, or positive float\) | | `due` | string | No | Due date \(ISO 8601 format\) | +| `start` | string | No | Start date \(ISO 8601 format\) | | `dueComplete` | boolean | No | Whether the due date should be marked complete | | `labelIds` | array | No | Label IDs to attach to the card | | `memberIds` | array | No | Member IDs to assign to the card | @@ -168,7 +277,7 @@ Create a new card in a Trello list | Parameter | Type | Description | | --------- | ---- | ----------- | -| `card` | json | Created card \(id, name, desc, url, idBoard, idList, closed, labelIds, labels, due, dueComplete\) | +| `card` | json | Created card \(id, name, desc, url, shortUrl, shortLink, idShort, idBoard, idList, closed, pos, labelIds, labels, idMembers, idChecklists, due, start, dueComplete, dateLastActivity, badges, checklists, attachments, members\) | | ↳ `id` | string | Card ID | | ↳ `name` | string | Card name | | ↳ `desc` | string | Card description | @@ -183,6 +292,54 @@ Create a new card in a Trello list | ↳ `color` | string | Label color | | ↳ `due` | string | Card due date in ISO 8601 format | | ↳ `dueComplete` | boolean | Whether the due date is complete | +| ↳ `start` | string | Card start date in ISO 8601 format | +| ↳ `pos` | number | Position of the card in its list | +| ↳ `shortUrl` | string | Short card URL without the name slug | +| ↳ `shortLink` | string | 8-character short card ID | +| ↳ `idShort` | number | Board-specific numeric card ID \(can change when the card moves\) | +| ↳ `idMembers` | array | Member IDs assigned to the card | +| ↳ `idChecklists` | array | Checklist IDs on the card | +| ↳ `dateLastActivity` | string | When the card last had activity \(ISO 8601\) | +| ↳ `badges` | object | Card badge counts shown on the front of the card | +| ↳ `votes` | number | Vote count | +| ↳ `comments` | number | Comment count | +| ↳ `attachments` | number | Attachment count | +| ↳ `checkItems` | number | Total checklist items | +| ↳ `checkItemsChecked` | number | Completed checklist items | +| ↳ `description` | boolean | Whether the card has a description | +| ↳ `subscribed` | boolean | Whether the current member is subscribed | +| ↳ `location` | boolean | Whether the card has a location | +| ↳ `due` | string | Due date | +| ↳ `start` | string | Start date | +| ↳ `dueComplete` | boolean | Whether the due date is complete | +| ↳ `checklists` | array | Checklists with their items. Only returned when checklists are requested | +| ↳ `id` | string | Checklist ID | +| ↳ `name` | string | Checklist name | +| ↳ `idCard` | string | Card ID | +| ↳ `idBoard` | string | Board ID | +| ↳ `pos` | number | Checklist position | +| ↳ `checkItems` | array | Checklist items | +| ↳ `id` | string | Checklist item ID | +| ↳ `name` | string | Checklist item name | +| ↳ `state` | string | complete or incomplete | +| ↳ `pos` | number | Item position | +| ↳ `idChecklist` | string | Checklist ID | +| ↳ `due` | string | Item due date | +| ↳ `idMember` | string | Assigned member ID | +| ↳ `attachments` | array | Card attachments. Only returned when attachments are requested | +| ↳ `id` | string | Attachment ID | +| ↳ `name` | string | Attachment name | +| ↳ `url` | string | Attachment URL | +| ↳ `mimeType` | string | Attachment MIME type | +| ↳ `bytes` | number | File size in bytes | +| ↳ `date` | string | When the attachment was added | +| ↳ `idMember` | string | ID of the member who added it | +| ↳ `isUpload` | boolean | Whether the attachment was uploaded | +| ↳ `pos` | number | Attachment position | +| ↳ `members` | array | Member objects on the card. Only returned when members are requested | +| ↳ `id` | string | Member ID | +| ↳ `fullName` | string | Member full name | +| ↳ `username` | string | Member username | @@ -203,12 +360,17 @@ Update an existing card on Trello | `idList` | string | No | Trello list ID to move card to \(24-character hex string\) | | `due` | string | No | Due date \(ISO 8601 format\) | | `dueComplete` | boolean | No | Mark the due date as complete | +| `start` | string | No | Start date \(ISO 8601 format\) | +| `pos` | string | No | Position of the card in its list \(top, bottom, or positive float\) | +| `idBoard` | string | No | Trello board ID to move the card to \(use with idList\) | +| `labelIds` | array | No | Replace the card labels with these label IDs. An empty list leaves labels unchanged; use Remove Label to take one off | +| `memberIds` | array | No | Replace the card members with these member IDs. An empty list leaves members unchanged; use Remove Member to take one off | #### Output | Parameter | Type | Description | | --------- | ---- | ----------- | -| `card` | json | Updated card \(id, name, desc, url, idBoard, idList, closed, labelIds, labels, due, dueComplete\) | +| `card` | json | Updated card \(id, name, desc, url, shortUrl, shortLink, idShort, idBoard, idList, closed, pos, labelIds, labels, idMembers, idChecklists, due, start, dueComplete, dateLastActivity, badges, checklists, attachments, members\) | | ↳ `id` | string | Card ID | | ↳ `name` | string | Card name | | ↳ `desc` | string | Card description | @@ -223,6 +385,54 @@ Update an existing card on Trello | ↳ `color` | string | Label color | | ↳ `due` | string | Card due date in ISO 8601 format | | ↳ `dueComplete` | boolean | Whether the due date is complete | +| ↳ `start` | string | Card start date in ISO 8601 format | +| ↳ `pos` | number | Position of the card in its list | +| ↳ `shortUrl` | string | Short card URL without the name slug | +| ↳ `shortLink` | string | 8-character short card ID | +| ↳ `idShort` | number | Board-specific numeric card ID \(can change when the card moves\) | +| ↳ `idMembers` | array | Member IDs assigned to the card | +| ↳ `idChecklists` | array | Checklist IDs on the card | +| ↳ `dateLastActivity` | string | When the card last had activity \(ISO 8601\) | +| ↳ `badges` | object | Card badge counts shown on the front of the card | +| ↳ `votes` | number | Vote count | +| ↳ `comments` | number | Comment count | +| ↳ `attachments` | number | Attachment count | +| ↳ `checkItems` | number | Total checklist items | +| ↳ `checkItemsChecked` | number | Completed checklist items | +| ↳ `description` | boolean | Whether the card has a description | +| ↳ `subscribed` | boolean | Whether the current member is subscribed | +| ↳ `location` | boolean | Whether the card has a location | +| ↳ `due` | string | Due date | +| ↳ `start` | string | Start date | +| ↳ `dueComplete` | boolean | Whether the due date is complete | +| ↳ `checklists` | array | Checklists with their items. Only returned when checklists are requested | +| ↳ `id` | string | Checklist ID | +| ↳ `name` | string | Checklist name | +| ↳ `idCard` | string | Card ID | +| ↳ `idBoard` | string | Board ID | +| ↳ `pos` | number | Checklist position | +| ↳ `checkItems` | array | Checklist items | +| ↳ `id` | string | Checklist item ID | +| ↳ `name` | string | Checklist item name | +| ↳ `state` | string | complete or incomplete | +| ↳ `pos` | number | Item position | +| ↳ `idChecklist` | string | Checklist ID | +| ↳ `due` | string | Item due date | +| ↳ `idMember` | string | Assigned member ID | +| ↳ `attachments` | array | Card attachments. Only returned when attachments are requested | +| ↳ `id` | string | Attachment ID | +| ↳ `name` | string | Attachment name | +| ↳ `url` | string | Attachment URL | +| ↳ `mimeType` | string | Attachment MIME type | +| ↳ `bytes` | number | File size in bytes | +| ↳ `date` | string | When the attachment was added | +| ↳ `idMember` | string | ID of the member who added it | +| ↳ `isUpload` | boolean | Whether the attachment was uploaded | +| ↳ `pos` | number | Attachment position | +| ↳ `members` | array | Member objects on the card. Only returned when members are requested | +| ↳ `id` | string | Member ID | +| ↳ `fullName` | string | Member full name | +| ↳ `username` | string | Member username | @@ -460,12 +670,15 @@ Retrieve a single Trello card by ID | Parameter | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `cardId` | string | Yes | Trello card ID \(24-character hex string\) | +| `includeChecklists` | boolean | No | Include each card checklist with its items \(default false\) | +| `includeAttachments` | boolean | No | Include card attachments \(default false\) | +| `includeMembers` | boolean | No | Include member objects for the members on the card \(default false\) | #### Output | Parameter | Type | Description | | --------- | ---- | ----------- | -| `card` | json | Card \(id, name, desc, url, idBoard, idList, closed, labelIds, labels, due, dueComplete\) | +| `card` | json | Card \(id, name, desc, url, shortUrl, shortLink, idShort, idBoard, idList, closed, pos, labelIds, labels, idMembers, idChecklists, due, start, dueComplete, dateLastActivity, badges, checklists, attachments, members\) | | ↳ `id` | string | Card ID | | ↳ `name` | string | Card name | | ↳ `desc` | string | Card description | @@ -480,6 +693,54 @@ Retrieve a single Trello card by ID | ↳ `color` | string | Label color | | ↳ `due` | string | Card due date in ISO 8601 format | | ↳ `dueComplete` | boolean | Whether the due date is complete | +| ↳ `start` | string | Card start date in ISO 8601 format | +| ↳ `pos` | number | Position of the card in its list | +| ↳ `shortUrl` | string | Short card URL without the name slug | +| ↳ `shortLink` | string | 8-character short card ID | +| ↳ `idShort` | number | Board-specific numeric card ID \(can change when the card moves\) | +| ↳ `idMembers` | array | Member IDs assigned to the card | +| ↳ `idChecklists` | array | Checklist IDs on the card | +| ↳ `dateLastActivity` | string | When the card last had activity \(ISO 8601\) | +| ↳ `badges` | object | Card badge counts shown on the front of the card | +| ↳ `votes` | number | Vote count | +| ↳ `comments` | number | Comment count | +| ↳ `attachments` | number | Attachment count | +| ↳ `checkItems` | number | Total checklist items | +| ↳ `checkItemsChecked` | number | Completed checklist items | +| ↳ `description` | boolean | Whether the card has a description | +| ↳ `subscribed` | boolean | Whether the current member is subscribed | +| ↳ `location` | boolean | Whether the card has a location | +| ↳ `due` | string | Due date | +| ↳ `start` | string | Start date | +| ↳ `dueComplete` | boolean | Whether the due date is complete | +| ↳ `checklists` | array | Checklists with their items. Only returned when checklists are requested | +| ↳ `id` | string | Checklist ID | +| ↳ `name` | string | Checklist name | +| ↳ `idCard` | string | Card ID | +| ↳ `idBoard` | string | Board ID | +| ↳ `pos` | number | Checklist position | +| ↳ `checkItems` | array | Checklist items | +| ↳ `id` | string | Checklist item ID | +| ↳ `name` | string | Checklist item name | +| ↳ `state` | string | complete or incomplete | +| ↳ `pos` | number | Item position | +| ↳ `idChecklist` | string | Checklist ID | +| ↳ `due` | string | Item due date | +| ↳ `idMember` | string | Assigned member ID | +| ↳ `attachments` | array | Card attachments. Only returned when attachments are requested | +| ↳ `id` | string | Attachment ID | +| ↳ `name` | string | Attachment name | +| ↳ `url` | string | Attachment URL | +| ↳ `mimeType` | string | Attachment MIME type | +| ↳ `bytes` | number | File size in bytes | +| ↳ `date` | string | When the attachment was added | +| ↳ `idMember` | string | ID of the member who added it | +| ↳ `isUpload` | boolean | Whether the attachment was uploaded | +| ↳ `pos` | number | Attachment position | +| ↳ `members` | array | Member objects on the card. Only returned when members are requested | +| ↳ `id` | string | Member ID | +| ↳ `fullName` | string | Member full name | +| ↳ `username` | string | Member username | diff --git a/apps/sim/blocks/blocks/bitbucket.ts b/apps/sim/blocks/blocks/bitbucket.ts index efbdabc1d43..75f6a873b90 100644 --- a/apps/sim/blocks/blocks/bitbucket.ts +++ b/apps/sim/blocks/blocks/bitbucket.ts @@ -549,6 +549,30 @@ export const BitbucketBlock: BlockConfig = { }, placeholder: 'src/index.ts', }, + { + id: 'commitPath', + title: 'Changed Path', + type: 'short-input', + mode: 'advanced', + condition: { field: 'operation', value: 'bitbucket_list_commits' }, + placeholder: 'Only commits that changed this file or directory (for example: src/)', + }, + { + id: 'commitInclude', + title: 'Include Refs', + type: 'short-input', + mode: 'advanced', + condition: { field: 'operation', value: 'bitbucket_list_commits' }, + placeholder: 'Comma-separated branches, tags, or hashes (for example: main)', + }, + { + id: 'commitExclude', + title: 'Exclude Refs', + type: 'short-input', + mode: 'advanced', + condition: { field: 'operation', value: 'bitbucket_list_commits' }, + placeholder: 'Comma-separated branches, tags, or hashes to leave out', + }, { id: 'state', title: 'Pull Request State', @@ -576,6 +600,7 @@ export const BitbucketBlock: BlockConfig = { type: 'short-input', required: true, condition: { field: 'operation', value: 'bitbucket_create_pull_request' }, + placeholder: 'Add retry handling to the sync job', }, { id: 'sourceBranch', @@ -583,6 +608,7 @@ export const BitbucketBlock: BlockConfig = { type: 'short-input', required: true, condition: { field: 'operation', value: 'bitbucket_create_pull_request' }, + placeholder: 'feature/my-branch', }, { id: 'destinationBranch', @@ -598,6 +624,7 @@ export const BitbucketBlock: BlockConfig = { type: 'long-input', mode: 'advanced', condition: { field: 'operation', value: 'bitbucket_create_pull_request' }, + placeholder: 'Describe the change (Markdown)', }, { id: 'reviewerAccountIds', @@ -663,6 +690,7 @@ export const BitbucketBlock: BlockConfig = { type: 'long-input', mode: 'advanced', condition: { field: 'operation', value: 'bitbucket_merge_pull_request' }, + placeholder: 'Defaults to the Bitbucket-generated merge message', }, { id: 'taskId', @@ -673,6 +701,7 @@ export const BitbucketBlock: BlockConfig = { field: 'operation', value: 'bitbucket_get_pull_request_merge_task_status', }, + placeholder: 'Task ID returned by Merge Pull Request', }, { id: 'content', @@ -680,6 +709,7 @@ export const BitbucketBlock: BlockConfig = { type: 'long-input', required: true, condition: { field: 'operation', value: 'bitbucket_create_pull_request_comment' }, + placeholder: 'Comment text (Markdown)', }, { id: 'parentId', @@ -708,6 +738,7 @@ export const BitbucketBlock: BlockConfig = { type: 'short-input', mode: 'advanced', condition: { field: 'operation', value: 'bitbucket_list_pipelines' }, + placeholder: 'main', }, { id: 'pipelineCommitHash', @@ -738,6 +769,7 @@ export const BitbucketBlock: BlockConfig = { type: 'short-input', mode: 'advanced', condition: { field: 'operation', value: 'bitbucket_list_pipelines' }, + placeholder: 'deploy-to-production', }, { id: 'pipelineTriggerType', @@ -797,6 +829,18 @@ export const BitbucketBlock: BlockConfig = { condition: { field: 'operation', value: 'bitbucket_trigger_pipeline' }, placeholder: 'Optional full commit SHA on the selected branch', }, + { + id: 'targetRefType', + title: 'Ref Type', + type: 'dropdown', + mode: 'advanced', + condition: { field: 'operation', value: 'bitbucket_trigger_pipeline' }, + options: [ + { label: 'Branch', id: 'branch' }, + { label: 'Tag', id: 'tag' }, + ], + value: () => 'branch', + }, { id: 'stepUuid', title: 'Step UUID', @@ -947,7 +991,13 @@ export const BitbucketBlock: BlockConfig = { case 'bitbucket_delete_branch': return { ...common, name: optionalString(params.branchName, 'branchName') } case 'bitbucket_list_commits': - return { ...common, ...pagination } + return { + ...common, + include: stringList(params.commitInclude, 'commitInclude'), + exclude: stringList(params.commitExclude, 'commitExclude'), + path: optionalString(params.commitPath, 'commitPath'), + ...pagination, + } case 'bitbucket_get_commit': return { ...common, commit: optionalString(params.revision, 'revision') } case 'bitbucket_list_directory': @@ -1047,7 +1097,7 @@ export const BitbucketBlock: BlockConfig = { case 'bitbucket_trigger_pipeline': return { ...common, - refType: 'branch', + refType: optionalString(params.targetRefType, 'targetRefType') ?? 'branch', refName: optionalString(params.targetRef, 'targetRef'), commitHash: optionalString(params.targetCommitHash, 'targetCommitHash'), } @@ -1083,6 +1133,18 @@ export const BitbucketBlock: BlockConfig = { target: { type: 'string', description: 'Full commit hash or existing ref for the new branch' }, revision: { type: 'string', description: 'Full commit SHA' }, path: { type: 'string', description: 'Repository-relative file or directory path' }, + commitPath: { + type: 'string', + description: 'Only list commits that changed this file or directory', + }, + commitInclude: { + type: 'string', + description: 'Comma-separated refs whose commits to include when listing commits', + }, + commitExclude: { + type: 'string', + description: 'Comma-separated refs whose commits to exclude when listing commits', + }, state: { type: 'string', description: 'Pull request state filter' }, prId: { type: 'number', description: 'Pull request ID' }, title: { type: 'string', description: 'Pull request title' }, @@ -1117,6 +1179,10 @@ export const BitbucketBlock: BlockConfig = { pipelineUuid: { type: 'string', description: 'Pipeline UUID' }, targetRef: { type: 'string', description: 'Pipeline branch target' }, targetCommitHash: { type: 'string', description: 'Optional pipeline target commit SHA' }, + targetRefType: { + type: 'string', + description: 'Pipeline target reference type (branch or tag)', + }, stepUuid: { type: 'string', description: 'Pipeline step UUID' }, maxCharacters: { type: 'number', description: 'Maximum bounded raw content length' }, }, diff --git a/apps/sim/blocks/blocks/confluence.ts b/apps/sim/blocks/blocks/confluence.ts index 3f627ea18a8..4e1d31a0c05 100644 --- a/apps/sim/blocks/blocks/confluence.ts +++ b/apps/sim/blocks/blocks/confluence.ts @@ -1041,6 +1041,20 @@ export const ConfluenceV2Block: BlockConfig = { required: true, condition: { field: 'operation', value: ['search', 'search_in_space'] }, }, + { + id: 'cql', + title: 'CQL Filter', + type: 'long-input', + placeholder: 'type = page AND space = "ENG" AND lastModified > now("-7d")', + mode: 'advanced', + condition: { field: 'operation', value: 'search' }, + wandConfig: { + enabled: true, + prompt: + 'Write Confluence CQL clauses that are ANDed with a text search. Use fields such as type (page, blogpost, attachment, comment), space, label, creator, contributor, created, lastModified, ancestor, and title, with now("-7d")-style relative dates. Do not include a text ~ clause. Return ONLY the CQL expression.', + placeholder: 'Describe how to narrow the search', + }, + }, { id: 'comment', title: 'Comment Text', @@ -1057,6 +1071,14 @@ export const ConfluenceV2Block: BlockConfig = { required: true, condition: { field: 'operation', value: ['update_comment', 'delete_comment'] }, }, + { + id: 'parentCommentId', + title: 'Reply To Comment ID', + type: 'short-input', + placeholder: 'Enter a footer or inline comment ID to reply to (optional)', + mode: 'advanced', + condition: { field: 'operation', value: 'create_comment' }, + }, { id: 'attachmentId', title: 'Attachment ID', @@ -1158,6 +1180,33 @@ export const ConfluenceV2Block: BlockConfig = { value: () => 'storage', condition: { field: 'operation', value: 'list_comments' }, }, + { + id: 'commentType', + title: 'Comment Type', + type: 'dropdown', + options: [ + { label: 'Footer (default)', id: 'footer' }, + { label: 'Inline', id: 'inline' }, + ], + value: () => 'footer', + condition: { field: 'operation', value: 'list_comments' }, + }, + { + id: 'contentBodyFormat', + title: 'Body Format', + type: 'dropdown', + options: [ + { label: 'Default', id: '' }, + { label: 'Storage', id: 'storage' }, + { label: 'Atlas Doc Format', id: 'atlas_doc_format' }, + ], + value: () => '', + mode: 'advanced', + condition: { + field: 'operation', + value: ['get_blogpost', 'list_pages_in_space', 'list_blogposts_in_space'], + }, + }, { id: 'limit', title: 'Limit', @@ -1214,6 +1263,14 @@ export const ConfluenceV2Block: BlockConfig = { ], }, }, + { + id: 'searchCursor', + title: 'Pagination Cursor', + type: 'short-input', + placeholder: 'Enter nextCursor from a previous search (optional)', + mode: 'advanced', + condition: { field: 'operation', value: ['search', 'search_in_space'] }, + }, ...getTrigger('confluence_page_created').subBlocks, ...getTrigger('confluence_page_updated').subBlocks, @@ -1445,10 +1502,20 @@ export const ConfluenceV2Block: BlockConfig = { spacePropertyKey, spacePropertyValue, spacePropertyId, + commentType, + contentBodyFormat, + parentCommentId, + cql, + searchCursor, ...rest } = params const effectivePageId = pageId ? String(pageId).trim() : '' + const scopedBodyFormat = + ['get_blogpost', 'list_pages_in_space', 'list_blogposts_in_space'].includes(operation) && + contentBodyFormat + ? { bodyFormat: contentBodyFormat } + : {} if (operation === 'add_label') { return { @@ -1486,6 +1553,27 @@ export const ConfluenceV2Block: BlockConfig = { operation, bodyFormat: bodyFormat || 'storage', cursor: cursor || undefined, + commentType: commentType || undefined, + ...rest, + } + } + + if (operation === 'create_comment') { + return { + credential: oauthCredential, + pageId: effectivePageId, + operation, + parentCommentId: parentCommentId ? String(parentCommentId).trim() : undefined, + ...rest, + } + } + + if (operation === 'search') { + return { + credential: oauthCredential, + operation, + cql: cql || undefined, + cursor: searchCursor || undefined, ...rest, } } @@ -1514,6 +1602,7 @@ export const ConfluenceV2Block: BlockConfig = { pageId: effectivePageId || undefined, operation, cursor, + ...scopedBodyFormat, ...rest, } } @@ -1611,6 +1700,7 @@ export const ConfluenceV2Block: BlockConfig = { credential: oauthCredential, operation, spaceKey: selectedSpaceKey, + cursor: searchCursor || undefined, ...rest, } } @@ -1708,6 +1798,7 @@ export const ConfluenceV2Block: BlockConfig = { blogPostId: blogPostId || undefined, versionNumber: versionNumber ? Number.parseInt(String(versionNumber), 10) : undefined, operation, + ...scopedBodyFormat, ...rest, } }, @@ -1742,6 +1833,14 @@ export const ConfluenceV2Block: BlockConfig = { blogPostStatus: { type: 'string', description: 'Blog post status (current or draft)' }, purge: { type: 'boolean', description: 'Permanently delete instead of moving to trash' }, bodyFormat: { type: 'string', description: 'Body format for comments' }, + commentType: { type: 'string', description: 'Comment type to list (footer or inline)' }, + contentBodyFormat: { + type: 'string', + description: 'Body format for blog post and page list/get operations', + }, + parentCommentId: { type: 'string', description: 'Comment ID to reply to' }, + cql: { type: 'string', description: 'Extra CQL clauses ANDed with the search query' }, + searchCursor: { type: 'string', description: 'Pagination cursor for search operations' }, limit: { type: 'number', description: 'Maximum number of results' }, cursor: { type: 'string', description: 'Pagination cursor from previous response' }, taskId: { type: 'string', description: 'Task identifier' }, @@ -1808,6 +1907,23 @@ export const ConfluenceV2Block: BlockConfig = { homepageId: { type: 'string', description: 'Space homepage ID' }, description: { type: 'json', description: 'Space description' }, nextCursor: { type: 'string', description: 'Cursor for fetching next page of results' }, + totalSize: { type: 'number', description: 'Total number of matching search results' }, + ownerId: { type: 'string', description: 'Account ID of the current page owner (Read Page)' }, + lastOwnerId: { + type: 'string', + description: 'Account ID of the previous page owner (Read Page)', + }, + parentType: { type: 'string', description: 'Parent content type (Read Page)' }, + parentId: { type: 'string', description: 'Parent page identifier' }, + parentCommentId: { + type: 'string', + description: 'Parent comment ID when the comment is a reply', + }, + spaceOwnerId: { type: 'string', description: 'Account ID of the space owner (Get Space)' }, + webUrl: { type: 'string', description: 'URL to view the blog post or comment in Confluence' }, + authorId: { type: 'string', description: 'Account ID of the content author' }, + createdAt: { type: 'string', description: 'ISO 8601 creation timestamp' }, + spaceKey: { type: 'string', description: 'Space key that was searched (Search in Space)' }, }, } diff --git a/apps/sim/blocks/blocks/jira.ts b/apps/sim/blocks/blocks/jira.ts index 081576bcb62..045562025ce 100644 --- a/apps/sim/blocks/blocks/jira.ts +++ b/apps/sim/blocks/blocks/jira.ts @@ -537,6 +537,37 @@ Return ONLY the date string in YYYY-MM-DD format - no explanations, no quotes, n condition: { field: 'operation', value: ['write', 'update'] }, mode: 'advanced', }, + { + id: 'customFields', + title: 'Additional Fields', + type: 'code', + language: 'json', + placeholder: '{"customfield_10016": 5, "customfield_10050": {"value": "Option A"}}', + condition: { field: 'operation', value: ['write', 'update'] }, + mode: 'advanced', + wandConfig: { + enabled: true, + prompt: `Generate a JSON object mapping Jira field IDs to values for an issue create or edit request, based on the user's description. +Use Jira REST API v3 value shapes: +- Number or text custom fields: "customfield_10016": 5 +- Select lists: "customfield_10050": {"value": "Option A"} +- Multi-select: "customfield_10051": [{"value": "A"}, {"value": "B"}] +- User pickers: "customfield_10060": {"accountId": "5b10a2844c20165700ede21g"} +- Sprint: "customfield_10020": 42 + +Return ONLY the JSON object - no explanations or markdown formatting.`, + placeholder: 'Describe the fields to set (e.g., "story points 5, team Platform")...', + generationType: 'json-object', + }, + }, + { + id: 'updateParentIssue', + title: 'New Parent Issue Key', + type: 'short-input', + placeholder: 'Parent issue key or epic key (e.g., PROJ-123)', + condition: { field: 'operation', value: 'update' }, + mode: 'advanced', + }, { id: 'notifyUsers', title: 'Notify Users', @@ -603,6 +634,24 @@ Return ONLY the comment text - no explanations.`, condition: { field: 'operation', value: 'transition' }, mode: 'advanced', }, + { + id: 'transitionFields', + title: 'Transition Fields', + type: 'code', + language: 'json', + placeholder: '{"assignee": {"accountId": "5b10a2844c20165700ede21g"}}', + condition: { field: 'operation', value: 'transition' }, + mode: 'advanced', + wandConfig: { + enabled: true, + prompt: `Generate a JSON object of Jira fields to set on a transition screen, keyed by field ID, based on the user's description. +Use Jira REST API v3 value shapes (e.g., "assignee": {"accountId": "..."}, "customfield_10050": {"value": "Option A"}). + +Return ONLY the JSON object - no explanations or markdown formatting.`, + placeholder: 'Describe the fields to set (e.g., "assign to the QA lead")...', + generationType: 'json-object', + }, + }, { id: 'jql', title: 'JQL Query', @@ -659,6 +708,21 @@ Return ONLY the JQL query - no explanations or markdown formatting.`, condition: { field: 'operation', value: 'search' }, mode: 'advanced', }, + { + id: 'expand', + title: 'Expand', + type: 'short-input', + placeholder: 'Comma-separated expansions (e.g., names,renderedFields,changelog)', + condition: { field: 'operation', value: 'search' }, + mode: 'advanced', + }, + { + id: 'includeAttachments', + title: 'Download Attachment Files', + type: 'switch', + condition: { field: 'operation', value: ['read', 'get_attachments'] }, + mode: 'advanced', + }, { id: 'commentBody', title: 'Comment Text', @@ -1071,6 +1135,7 @@ Return ONLY the comment text - no explanations.`, environment: params.environment || undefined, customFieldId: params.customFieldId || undefined, customFieldValue: customFieldValue, + customFields: params.customFields || undefined, } return { ...baseParams, @@ -1100,6 +1165,8 @@ Return ONLY the comment text - no explanations.`, environment: params.environment || undefined, customFieldId: params.customFieldId || undefined, customFieldValue: params.customFieldValue || undefined, + customFields: params.customFields || undefined, + parent: String(params.updateParentIssue ?? '').trim() || undefined, notifyUsers: params.notifyUsers === 'false' ? false @@ -1117,6 +1184,10 @@ Return ONLY the comment text - no explanations.`, ...baseParams, issueKey: effectiveIssueKey, ...(effectiveProjectId && { projectId: effectiveProjectId }), + includeAttachments: + params.includeAttachments === true || params.includeAttachments === 'true' + ? true + : undefined, } } case 'read-bulk': { @@ -1146,6 +1217,7 @@ Return ONLY the comment text - no explanations.`, transitionId: params.transitionId, comment: params.transitionComment, resolution: params.resolution || undefined, + fields: params.transitionFields || undefined, } } case 'search': { @@ -1160,6 +1232,7 @@ Return ONLY the comment text - no explanations.`, .map((f: string) => f.trim()) .filter(Boolean) : undefined, + expand: params.expand ? String(params.expand).trim() || undefined : undefined, } } case 'add_comment': { @@ -1196,6 +1269,10 @@ Return ONLY the comment text - no explanations.`, return { ...baseParams, issueKey: effectiveIssueKey, + includeAttachments: + params.includeAttachments === true || params.includeAttachments === 'true' + ? true + : undefined, } } case 'add_attachment': { @@ -1385,6 +1462,20 @@ Return ONLY the comment text - no explanations.`, environment: { type: 'string', description: 'Environment information' }, customFieldId: { type: 'string', description: 'Custom field ID (e.g., customfield_10001)' }, customFieldValue: { type: 'string', description: 'Value for the custom field' }, + customFields: { + type: 'json', + description: 'JSON object mapping field IDs to values for create or update', + }, + updateParentIssue: { type: 'string', description: 'New parent issue key for update' }, + transitionFields: { + type: 'json', + description: 'JSON object of fields to set during a transition', + }, + expand: { type: 'string', description: 'Comma-separated search expansions' }, + includeAttachments: { + type: 'boolean', + description: 'Download attachment file contents for read or get attachments', + }, notifyUsers: { type: 'string', description: 'Whether to send notifications on update' }, deleteSubtasks: { type: 'string', description: 'Whether to delete subtasks (true/false)' }, accountId: { @@ -1461,6 +1552,60 @@ Return ONLY the comment text - no explanations.`, status: { type: 'string', description: 'Issue status name' }, assignee: { type: 'string', description: 'Issue assignee display name or account ID' }, + descriptionAdf: { + type: 'json', + description: 'Issue description as raw Atlassian Document Format (read)', + }, + renderedDescription: { + type: 'string', + description: 'Issue description rendered as HTML (read)', + }, + environment: { type: 'string', description: 'Environment text (read)' }, + statusName: { type: 'string', description: 'Issue status name (read)' }, + priority: { type: 'json', description: 'Issue priority (id, name, iconUrl) (read)' }, + reporter: { + type: 'json', + description: 'Reporter (accountId, displayName, emailAddress, active) (read)', + }, + creator: { + type: 'json', + description: 'Creator (accountId, displayName, emailAddress, active) (read)', + }, + issuetype: { type: 'json', description: 'Issue type (id, name, subtask) (read)' }, + labels: { type: 'json', description: 'Issue labels as an array of strings (read)' }, + components: { type: 'json', description: 'Components [{id, name, description}] (read)' }, + fixVersions: { + type: 'json', + description: 'Fix versions [{id, name, released, releaseDate}] (read)', + }, + resolution: { type: 'json', description: 'Resolution (id, name, description) (read)' }, + resolutiondate: { type: 'string', description: 'When the issue was resolved (read)' }, + duedate: { type: 'string', description: 'Due date YYYY-MM-DD (read)' }, + timetracking: { + type: 'json', + description: + 'Time tracking (originalEstimate, remainingEstimate, timeSpent and their *Seconds) (read)', + }, + parent: { type: 'json', description: 'Parent issue or epic (id, key, summary) (read)' }, + subtasks: { type: 'json', description: 'Subtasks [{id, key, summary, statusName}] (read)' }, + issuelinks: { + type: 'json', + description: 'Issue links [{id, type, inwardIssue, outwardIssue}] (read)', + }, + watches: { type: 'json', description: 'Watch info (watchCount, isWatching) (read)' }, + watchers: { + type: 'json', + description: 'Watching users [{accountId, displayName, emailAddress}] (read)', + }, + customFields: { + type: 'json', + description: + 'Every customfield_* value keyed by field ID, e.g. sprint or story points (read)', + }, + names: { + type: 'json', + description: 'Map of field ID to display name (read; search when expand includes names)', + }, url: { type: 'string', description: 'URL to the created/accessed issue' }, id: { type: 'string', description: 'Jira issue ID' }, key: { type: 'string', description: 'Jira issue key' }, @@ -1473,7 +1618,8 @@ Return ONLY the comment text - no explanations.`, maxResults: { type: 'number', description: 'Maximum results per page' }, issues: { type: 'json', - description: 'Array of matching issues with key, summary, status, assignee, dates', + description: + 'Array of matching issues with key, summary, description, descriptionAdf, status, assignee, reporter, priority, labels, components, fixVersions, parent, subtasks, issuelinks, attachments, timetracking, customFields, dates', }, comments: { @@ -1489,7 +1635,11 @@ Return ONLY the comment text - no explanations.`, type: 'json', description: 'Array of attachments with id, filename, size, mimeType, created, author', }, - files: { type: 'file[]', description: 'Uploaded attachment files' }, + files: { + type: 'file[]', + description: + 'Uploaded attachment files (add attachment) or downloaded attachment files (read or get attachments with Download Attachment Files on)', + }, attachmentIds: { type: 'json', description: 'Uploaded attachment IDs' }, // jira_delete_attachment, jira_delete_comment, jira_delete_issue, jira_delete_worklog, jira_delete_issue_link outputs @@ -1563,7 +1713,7 @@ Return ONLY the comment text - no explanations.`, worklog_id: { type: 'string', description: 'Worklog ID (for worklog events)' }, time_spent: { type: 'string', description: 'Time spent (for worklog events)' }, changelog: { type: 'json', description: 'Changelog object (for update events)' }, - issue: { type: 'json', description: 'Complete issue object from webhook' }, + issue: { type: 'json', description: 'Complete raw issue object (read, webhook)' }, sprint: { type: 'json', description: 'Sprint object (for sprint events)' }, project: { type: 'json', description: 'Project object (for project events)' }, version: { type: 'json', description: 'Version object (for version events)' }, diff --git a/apps/sim/blocks/blocks/jira_service_management.ts b/apps/sim/blocks/blocks/jira_service_management.ts index 48d34480281..52b59ff2da5 100644 --- a/apps/sim/blocks/blocks/jira_service_management.ts +++ b/apps/sim/blocks/blocks/jira_service_management.ts @@ -647,6 +647,30 @@ Return ONLY the comment text - no explanations.`, value: () => 'true', condition: { field: 'operation', value: 'add_comment' }, }, + { + id: 'includePublicComments', + title: 'Include Public Comments', + type: 'dropdown', + options: [ + { label: 'Yes', id: 'true' }, + { label: 'No', id: 'false' }, + ], + value: () => 'true', + mode: 'advanced', + condition: { field: 'operation', value: 'get_comments' }, + }, + { + id: 'includeInternalComments', + title: 'Include Internal Comments', + type: 'dropdown', + options: [ + { label: 'Yes', id: 'true' }, + { label: 'No', id: 'false' }, + ], + value: () => 'true', + mode: 'advanced', + condition: { field: 'operation', value: 'get_comments' }, + }, { id: 'accountIds', title: 'Account IDs', @@ -698,10 +722,48 @@ Return ONLY the comment text - no explanations.`, { label: 'My Requests', id: 'OWNED_REQUESTS' }, { label: 'Participated', id: 'PARTICIPATED_REQUESTS' }, { label: 'Approver', id: 'APPROVER' }, + { label: 'Organization', id: 'ORGANIZATION' }, + { label: 'All My Organizations', id: 'ALL_ORGANIZATIONS' }, ], value: () => 'ALL_REQUESTS', condition: { field: 'operation', value: 'get_requests' }, }, + { + id: 'requestApprovalStatus', + title: 'Approval Status', + type: 'dropdown', + options: [ + { label: 'Any', id: '' }, + { label: 'Pending My Approval', id: 'MY_PENDING_APPROVAL' }, + { label: 'My Approval History', id: 'MY_HISTORY_APPROVAL' }, + ], + value: () => '', + mode: 'advanced', + condition: { + field: 'operation', + value: 'get_requests', + and: { field: 'requestOwnership', value: 'APPROVER' }, + }, + }, + { + id: 'requestOrganizationId', + title: 'Organization ID', + type: 'short-input', + placeholder: 'Customer organization ID (e.g., 3)', + condition: { + field: 'operation', + value: 'get_requests', + and: { field: 'requestOwnership', value: 'ORGANIZATION' }, + }, + }, + { + id: 'requestTypeFilter', + title: 'Request Type ID', + type: 'short-input', + placeholder: 'Filter by request type ID (e.g., 25)', + mode: 'advanced', + condition: { field: 'operation', value: 'get_requests' }, + }, { id: 'requestStatus', title: 'Request Status', @@ -1200,6 +1262,15 @@ Return ONLY the comment text - no explanations.`, serviceDeskId: params.serviceDeskId, requestOwnership: params.requestOwnership, requestStatus: params.requestStatus, + approvalStatus: + params.requestOwnership === 'APPROVER' + ? params.requestApprovalStatus || undefined + : undefined, + organizationId: + params.requestOwnership === 'ORGANIZATION' + ? params.requestOrganizationId || undefined + : undefined, + requestTypeId: params.requestTypeFilter || undefined, searchTerm: params.searchTerm, expand: params.expand, start: toOptionalInt(params.startIndex), @@ -1225,6 +1296,8 @@ Return ONLY the comment text - no explanations.`, return { ...baseParams, issueIdOrKey: params.issueIdOrKey, + isPublic: params.includePublicComments === 'false' ? false : undefined, + internal: params.includeInternalComments === 'false' ? false : undefined, expand: params.expand, start: toOptionalInt(params.startIndex), limit: toOptionalInt(params.maxResults), @@ -1662,6 +1735,17 @@ Return ONLY the comment text - no explanations.`, requestOwnership: { type: 'string', description: 'Request ownership filter' }, requestStatus: { type: 'string', description: 'Request status filter' }, searchTerm: { type: 'string', description: 'Search term for requests' }, + requestApprovalStatus: { + type: 'string', + description: 'Approval status filter for approver requests', + }, + requestOrganizationId: { + type: 'string', + description: 'Organization ID filter for organization requests', + }, + requestTypeFilter: { type: 'string', description: 'Request type ID filter for requests' }, + includePublicComments: { type: 'string', description: 'Include public comments' }, + includeInternalComments: { type: 'string', description: 'Include internal comments' }, includeCount: { type: 'string', description: 'Include issue count for queues' }, startIndex: { type: 'string', description: 'Pagination start index' }, maxResults: { type: 'string', description: 'Maximum results to return' }, @@ -1722,6 +1806,33 @@ Return ONLY the comment text - no explanations.`, request: { type: 'json', description: 'Request object' }, requests: { type: 'json', description: 'Array of requests' }, url: { type: 'string', description: 'URL to the request' }, + webUrl: { + type: 'string', + description: 'Customer portal URL for the request (from _links.web)', + }, + requestTypeId: { type: 'string', description: 'Request type ID' }, + serviceDeskId: { type: 'string', description: 'Service desk ID' }, + createdDate: { + type: 'json', + description: 'Creation date (iso8601, friendly, epochMillis)', + }, + currentStatus: { + type: 'json', + description: 'Current request status (status, statusCategory, statusDate)', + }, + reporter: { + type: 'json', + description: 'Reporter (accountId, displayName, emailAddress, active)', + }, + requestFieldValues: { + type: 'json', + description: 'Request field values [{fieldId, label, value, renderedValue}]', + }, + issueIdOrKey: { type: 'string', description: 'Issue ID or key the operation acted on' }, + author: { + type: 'json', + description: 'Comment author (accountId, displayName, emailAddress)', + }, commentId: { type: 'string', description: 'Comment ID' }, body: { type: 'string', description: 'Comment body' }, isPublic: { type: 'boolean', description: 'Whether comment is public' }, @@ -1739,6 +1850,21 @@ Return ONLY the comment text - no explanations.`, approval: { type: 'json', description: 'Approval object' }, approvalId: { type: 'string', description: 'Approval ID' }, decision: { type: 'string', description: 'Approval decision' }, + id: { type: 'string', description: 'Approval ID (answer approval) or form ID (attach form)' }, + finalDecision: { + type: 'string', + description: 'Final approval decision (approved, declined, pending)', + }, + canAnswerApproval: { + type: 'boolean', + description: 'Whether the current user can answer the approval', + }, + approvers: { + type: 'json', + description: + 'Approvers [{approver: {accountId, displayName, emailAddress}, approverDecision}]', + }, + completedDate: { type: 'json', description: 'Approval completion date' }, total: { type: 'number', description: 'Total count' }, isLastPage: { type: 'boolean', description: 'Whether this is the last page' }, requestTypeFields: { type: 'json', description: 'Array of request type fields' }, @@ -1765,6 +1891,7 @@ Return ONLY the comment text - no explanations.`, description: 'Form publishing and request type configuration', }, updated: { type: 'string', description: 'Last updated timestamp' }, + projectIdOrKey: { type: 'string', description: 'Project ID or key for form templates' }, forms: { type: 'json', description: @@ -1817,7 +1944,13 @@ Return ONLY the comment text - no explanations.`, description: 'Single Assets object (id, label, objectKey, objectType, attributes)', }, objectId: { type: 'string', description: 'Assets object ID (delete operation)' }, - isLast: { type: 'boolean', description: 'Whether this is the last page of schemas' }, + isLast: { + type: 'boolean', + description: 'Whether this is the last page of schemas or AQL search results', + }, + pageNumber: { type: 'number', description: 'AQL search page number' }, + pageSize: { type: 'number', description: 'Number of objects on this AQL search page' }, + startAt: { type: 'number', description: 'Index of the first object on this AQL search page' }, }, triggers: { enabled: true, diff --git a/apps/sim/blocks/blocks/trello.ts b/apps/sim/blocks/blocks/trello.ts index 9a69478c0cb..2e1d4598243 100644 --- a/apps/sim/blocks/blocks/trello.ts +++ b/apps/sim/blocks/blocks/trello.ts @@ -495,6 +495,159 @@ Return ONLY the date/timestamp string - no explanations, no extra text.`, value: 'trello_update_card', }, }, + { + id: 'start', + title: 'Start Date', + type: 'short-input', + placeholder: 'YYYY-MM-DD or ISO 8601 timestamp', + mode: 'advanced', + condition: { + field: 'operation', + value: ['trello_create_card', 'trello_update_card'], + }, + wandConfig: { + enabled: true, + prompt: `Generate a date or timestamp based on the user's description. +The timestamp should be in ISO 8601 format: YYYY-MM-DD or YYYY-MM-DDTHH:MM:SSZ. +Examples: +- "today" -> Calculate today's date in YYYY-MM-DD format +- "next Monday" -> Calculate the next Monday in YYYY-MM-DD format + +Return ONLY the date/timestamp string - no explanations, no extra text.`, + placeholder: 'Describe the start date (e.g. "next Monday")...', + generationType: 'timestamp', + }, + }, + { + id: 'updatePos', + title: 'Position', + type: 'short-input', + placeholder: 'top, bottom, or a positive float', + mode: 'advanced', + condition: { + field: 'operation', + value: 'trello_update_card', + }, + }, + { + id: 'updateLabelIds', + title: 'Replace Label IDs', + type: 'short-input', + placeholder: 'Comma-separated label IDs (replaces existing labels)', + mode: 'advanced', + condition: { + field: 'operation', + value: 'trello_update_card', + }, + wandConfig: { + enabled: true, + prompt: + 'Generate a comma-separated list of Trello label IDs. Return ONLY the comma-separated values - no explanations, no extra text.', + placeholder: 'Describe the label IDs to set...', + }, + }, + { + id: 'updateMemberIds', + title: 'Replace Member IDs', + type: 'short-input', + placeholder: 'Comma-separated member IDs (replaces existing members)', + mode: 'advanced', + condition: { + field: 'operation', + value: 'trello_update_card', + }, + wandConfig: { + enabled: true, + prompt: + 'Generate a comma-separated list of Trello member IDs. Return ONLY the comma-separated values - no explanations, no extra text.', + placeholder: 'Describe the member IDs to set...', + }, + }, + { + id: 'moveCardToBoardId', + title: 'Move to Board ID', + type: 'short-input', + placeholder: 'Board ID to move the card to (set Move to List ID too)', + mode: 'advanced', + condition: { + field: 'operation', + value: 'trello_update_card', + }, + }, + { + id: 'cardSince', + title: 'Cards Since', + type: 'short-input', + placeholder: 'ISO 8601 timestamp or card ID', + mode: 'advanced', + condition: { + field: 'operation', + value: 'trello_list_cards', + }, + wandConfig: { + enabled: true, + prompt: `Generate a date or timestamp based on the user's description. +The timestamp should be in ISO 8601 format: YYYY-MM-DD or YYYY-MM-DDTHH:MM:SSZ. +Examples: +- "1 week ago" -> Calculate the date 1 week ago in YYYY-MM-DD format + +Return ONLY the date/timestamp string - no explanations, no extra text.`, + placeholder: 'Describe the start of the range (e.g. "1 week ago")...', + generationType: 'timestamp', + }, + }, + { + id: 'cardBefore', + title: 'Cards Before', + type: 'short-input', + placeholder: 'ISO 8601 timestamp or card ID', + mode: 'advanced', + condition: { + field: 'operation', + value: 'trello_list_cards', + }, + wandConfig: { + enabled: true, + prompt: `Generate a date or timestamp based on the user's description. +The timestamp should be in ISO 8601 format: YYYY-MM-DD or YYYY-MM-DDTHH:MM:SSZ. +Examples: +- "today" -> Calculate today's date in YYYY-MM-DD format + +Return ONLY the date/timestamp string - no explanations, no extra text.`, + placeholder: 'Describe the end of the range (e.g. "today")...', + generationType: 'timestamp', + }, + }, + { + id: 'includeChecklists', + title: 'Include Checklists', + type: 'switch', + mode: 'advanced', + condition: { + field: 'operation', + value: 'trello_get_card', + }, + }, + { + id: 'includeAttachments', + title: 'Include Attachments', + type: 'switch', + mode: 'advanced', + condition: { + field: 'operation', + value: 'trello_get_card', + }, + }, + { + id: 'includeMembers', + title: 'Include Members', + type: 'switch', + mode: 'advanced', + condition: { + field: 'operation', + value: 'trello_get_card', + }, + }, { id: 'filter', title: 'Action Filter', @@ -862,6 +1015,38 @@ Return ONLY the date/timestamp string - no explanations, no extra text.`, value: 'trello_search', }, }, + { + id: 'searchCardsPage', + title: 'Card Results Page', + type: 'short-input', + placeholder: 'Page of card results (0-100, default 0)', + mode: 'advanced', + condition: { + field: 'operation', + value: 'trello_search', + }, + }, + { + id: 'searchBoardsLimit', + title: 'Board Result Limit', + type: 'short-input', + placeholder: 'Maximum number of boards to return (1-1000, default 10)', + mode: 'advanced', + condition: { + field: 'operation', + value: 'trello_search', + }, + }, + { + id: 'searchPartial', + title: 'Partial Word Match', + type: 'switch', + mode: 'advanced', + condition: { + field: 'operation', + value: ['trello_search'], + }, + }, ], tools: { access: [ @@ -927,6 +1112,8 @@ Return ONLY the date/timestamp string - no explanations, no extra text.`, boardId, listId, filter: getTrimmedString(params.cardFilter), + since: getTrimmedString(params.cardSince), + before: getTrimmedString(params.cardBefore), } } @@ -943,6 +1130,9 @@ Return ONLY the date/timestamp string - no explanations, no extra text.`, idBoards: parseStringArray(params.searchBoardIds), modelTypes: getTrimmedString(params.searchModelTypes), cardsLimit: parseOptionalNumberInput(params.searchCardsLimit, 'cardsLimit'), + cardsPage: parseOptionalNumberInput(params.searchCardsPage, 'cardsPage'), + boardsLimit: parseOptionalNumberInput(params.searchBoardsLimit, 'boardsLimit'), + partial: parseOptionalBooleanInput(params.searchPartial), } } @@ -966,6 +1156,7 @@ Return ONLY the date/timestamp string - no explanations, no extra text.`, pos: getTrimmedString(params.pos), due: getTrimmedString(params.due), dueComplete: parseOptionalBooleanInput(params.dueComplete), + start: getTrimmedString(params.start), labelIds: parseStringArray(params.labelIds), memberIds: parseStringArray(params.memberIds), } @@ -987,6 +1178,11 @@ Return ONLY the date/timestamp string - no explanations, no extra text.`, idList: getTrimmedString(params.idList), due: getTrimmedString(params.due), dueComplete: parseOptionalBooleanInput(params.dueComplete), + start: getTrimmedString(params.start), + pos: getTrimmedString(params.updatePos), + idBoard: getTrimmedString(params.moveCardToBoardId), + labelIds: parseStringArray(params.updateLabelIds), + memberIds: parseStringArray(params.updateMemberIds), } } @@ -1122,6 +1318,9 @@ Return ONLY the date/timestamp string - no explanations, no extra text.`, return { ...baseParams, cardId, + includeChecklists: parseOptionalBooleanInput(params.includeChecklists), + includeAttachments: parseOptionalBooleanInput(params.includeAttachments), + includeMembers: parseOptionalBooleanInput(params.includeMembers), } } @@ -1358,6 +1557,38 @@ Return ONLY the date/timestamp string - no explanations, no extra text.`, description: 'Board IDs to restrict the search to, as an array or comma-separated string', }, searchCardsLimit: { type: 'number', description: 'Maximum number of cards to return' }, + searchCardsPage: { type: 'number', description: 'Page of card search results (0-100)' }, + searchBoardsLimit: { type: 'number', description: 'Maximum number of boards to return' }, + searchPartial: { type: 'boolean', description: 'Match the start of words in the query' }, + start: { type: 'string', description: 'Card start date in ISO 8601 format' }, + updatePos: { + type: 'string', + description: 'New card position (top, bottom, or positive float)', + }, + updateLabelIds: { + type: 'json', + description: 'Label IDs that replace the card labels, as an array or comma-separated string', + }, + updateMemberIds: { + type: 'json', + description: + 'Member IDs that replace the card members, as an array or comma-separated string', + }, + moveCardToBoardId: { type: 'string', description: 'Board ID to move the card to' }, + cardSince: { + type: 'string', + description: 'Only list cards created since this date or card ID', + }, + cardBefore: { + type: 'string', + description: 'Only list cards created before this date or card ID', + }, + includeChecklists: { + type: 'boolean', + description: 'Include checklists and items on a fetched card', + }, + includeAttachments: { type: 'boolean', description: 'Include attachments on a fetched card' }, + includeMembers: { type: 'boolean', description: 'Include member objects on a fetched card' }, }, outputs: { lists: { @@ -1367,12 +1598,12 @@ Return ONLY the date/timestamp string - no explanations, no extra text.`, cards: { type: 'json', description: - 'Cards (id, name, desc, url, idBoard, idList, closed, labelIds, labels, due, dueComplete)', + 'Cards (id, name, desc, url, shortUrl, shortLink, idShort, idBoard, idList, closed, pos, labelIds, labels, idMembers, idChecklists, due, start, dueComplete, dateLastActivity, badges)', }, card: { type: 'json', description: - 'Created, updated, or fetched card (id, name, desc, url, idBoard, idList, closed, labelIds, labels, due, dueComplete)', + 'Created, updated, or fetched card (id, name, desc, url, shortUrl, shortLink, idShort, idBoard, idList, closed, pos, labelIds, labels, idMembers, idChecklists, due, start, dueComplete, dateLastActivity, badges, checklists, attachments, members)', }, board: { type: 'json', diff --git a/apps/sim/lib/api/contracts/tools/confluence.ts b/apps/sim/lib/api/contracts/tools/confluence.ts index 482f7e67e3e..71c149e8ce4 100644 --- a/apps/sim/lib/api/contracts/tools/confluence.ts +++ b/apps/sim/lib/api/contracts/tools/confluence.ts @@ -111,12 +111,14 @@ export const confluenceListAttachmentsQuerySchema = confluencePageScopedSchema.e export const confluenceCreateCommentBodySchema = confluencePageScopedSchema.extend({ comment: z.string({ error: 'Comment is required' }).min(1, 'Comment is required'), + parentCommentId: z.string().optional(), }) export const confluenceListCommentsQuerySchema = confluencePageScopedSchema.extend({ limit: z.string().optional().default('25'), bodyFormat: z.string().optional().default('storage'), cursor: z.string().optional(), + commentType: z.enum(['footer', 'inline']).optional(), }) export const confluenceUpdateCommentBodySchema = confluenceCommentScopedBaseSchema @@ -196,6 +198,8 @@ export const confluencePagesByLabelQuerySchema = confluenceBaseSchema.extend({ export const confluenceSearchBodySchema = confluenceBaseSchema.extend({ query: z.string({ error: 'Search query is required' }).min(1, 'Search query is required'), limit: z.number().optional().default(25), + cql: z.string().optional(), + cursor: z.string().optional(), }) export const confluenceSearchInSpaceBodySchema = confluenceBaseSchema.extend({ @@ -203,6 +207,7 @@ export const confluenceSearchInSpaceBodySchema = confluenceBaseSchema.extend({ query: z.string().optional(), limit: z.number().optional().default(25), contentType: z.string().optional(), + cursor: z.string().optional(), }) export const confluenceSpaceBlogPostsBodySchema = confluenceSpaceScopedSchema.extend({ diff --git a/apps/sim/lib/api/contracts/tools/jsm.ts b/apps/sim/lib/api/contracts/tools/jsm.ts index da5d2b74442..876ecfafdba 100644 --- a/apps/sim/lib/api/contracts/tools/jsm.ts +++ b/apps/sim/lib/api/contracts/tools/jsm.ts @@ -81,6 +81,8 @@ export const jsmRequestsBodySchema = jsmBaseBodySchema.extend({ serviceDeskId: z.string().optional(), requestOwnership: z.string().optional(), requestStatus: z.string().optional(), + approvalStatus: z.string().optional(), + organizationId: z.string().optional(), requestTypeId: z.string().optional(), searchTerm: z.string().optional(), expand: z.string().optional(), diff --git a/apps/sim/lib/internal/confluence/operations.test.ts b/apps/sim/lib/internal/confluence/operations.test.ts index a867c8f84e8..3a001f1ed3d 100644 --- a/apps/sim/lib/internal/confluence/operations.test.ts +++ b/apps/sim/lib/internal/confluence/operations.test.ts @@ -21,7 +21,9 @@ const { mockDownloadServableFileFromStorage } = fileUtilsServerMockFns import { ConfluenceOperationError } from '@/lib/internal/confluence/errors' import { + executeConfluenceListComments, executeConfluenceListPagesInSpace, + executeConfluenceSearch, executeConfluenceSearchInSpace, executeConfluenceUploadAttachment, } from '@/lib/internal/confluence/operations' @@ -97,7 +99,7 @@ describe('Confluence operations', () => { { ...CONNECTION, spaceKey: '12345', query: 'release notes', limit: 25 }, { headers: new Headers(), requestId: 'request-1' } ) - ).resolves.toEqual({ results: [], spaceKey: 'ENG', totalSize: 0 }) + ).resolves.toEqual({ results: [], spaceKey: 'ENG', totalSize: 0, nextCursor: null }) expect(fetchMock).toHaveBeenCalledTimes(2) const searchUrl = String(fetchMock.mock.calls[1][0]) @@ -106,6 +108,98 @@ describe('Confluence operations', () => { ) }) + it('reads comment author and creation time from the version object', async () => { + vi.stubGlobal( + 'fetch', + vi.fn(async () => + Response.json({ + results: [ + { + id: '77', + status: 'current', + title: 'Re: Plan', + pageId: '12345', + version: { number: 1, authorId: 'acct-1', createdAt: '2026-11-01T10:00:00.000Z' }, + body: { + atlas_doc_format: { value: '{"type":"doc"}', representation: 'atlas_doc_format' }, + }, + }, + ], + _links: {}, + }) + ) + ) + + const result = await executeConfluenceListComments( + { ...CONNECTION, pageId: '12345', limit: '25', bodyFormat: 'atlas_doc_format' }, + { headers: new Headers(), requestId: 'request-1' } + ) + + expect(result.comments[0]).toMatchObject({ + authorId: 'acct-1', + createdAt: '2026-11-01T10:00:00.000Z', + body: { value: '{"type":"doc"}', representation: 'atlas_doc_format' }, + }) + }) + + it('returns the space key of each search result', async () => { + const fetchMock = vi.fn(async (request: string | URL | Request) => { + const expand = new URL(String(request)).searchParams.get('expand') + return Response.json({ + results: [ + { + content: { + id: '98765', + type: 'page', + title: 'Release notes', + ...(expand === 'content.space' + ? { space: { id: 4242, key: 'ENG', name: 'Engineering' } } + : {}), + }, + resultGlobalContainer: { title: 'Engineering', displayUrl: '/spaces/ENG' }, + excerpt: 'release', + url: '/spaces/ENG/pages/98765', + }, + ], + totalSize: 1, + _links: {}, + }) + }) + vi.stubGlobal('fetch', fetchMock) + + const result = await executeConfluenceSearch( + { ...CONNECTION, query: 'release', limit: 25 }, + { headers: new Headers(), requestId: 'request-1' } + ) + + expect(result.results[0]).toMatchObject({ + spaceKey: 'ENG', + space: { id: '4242', key: 'ENG', name: 'Engineering' }, + }) + }) + + it('keeps a trailing CQL order by after the parenthesized filter', async () => { + const fetchMock = vi.fn(async () => + Response.json({ results: [], totalSize: 0, _links: {} }) + ) + vi.stubGlobal('fetch', fetchMock) + + await executeConfluenceSearch( + { + ...CONNECTION, + query: 'release', + limit: 25, + cql: 'title ~ "sort order by x" ORDER BY lastmodified desc', + }, + { headers: new Headers(), requestId: 'request-1' } + ) + + const sentCql = new URL(String(fetchMock.mock.calls[0]?.[0])).searchParams.get('cql') + expect(sentCql).toBe( + 'text ~ "release" AND (title ~ "sort order by x") ORDER BY lastmodified desc' + ) + }) + it('fails closed when stored-file authorization denies access', async () => { mockAssertToolFileAccess.mockResolvedValueOnce(Response.json({ error: 'Forbidden' })) diff --git a/apps/sim/lib/internal/confluence/operations.ts b/apps/sim/lib/internal/confluence/operations.ts index 14f75ba33d7..22fe3f02c6f 100644 --- a/apps/sim/lib/internal/confluence/operations.ts +++ b/apps/sim/lib/internal/confluence/operations.ts @@ -116,12 +116,20 @@ function mappedPage(value: unknown): JsonObject { spaceId: page.spaceId ?? null, parentId: page.parentId ?? null, authorId: page.authorId ?? null, + ownerId: page.ownerId ?? null, createdAt: page.createdAt ?? null, version: page.version ?? null, webUrl: nested(page, '_links', 'webui') ?? null, } } +function mappedLabels(value: unknown): JsonObject[] { + return toArray(toRecord(value).results).map((item) => { + const label = toRecord(item) + return { id: label.id, name: label.name, prefix: label.prefix || 'global' } + }) +} + const NUMERIC_SPACE_ID_PATTERN = /^[1-9][0-9]{0,19}$/ const SPACE_STATUSES = ['current', 'archived'] as const @@ -193,7 +201,7 @@ export async function executeConfluenceRetrievePage( ) { const client = await createConfluenceClient(input, context.signal) const data = await client.json( - client.apiV2(`/pages/${input.pageId}?body-format=storage`), + client.apiV2(`/pages/${input.pageId}?body-format=storage&include-labels=true`), {}, context.signal ) @@ -213,6 +221,10 @@ export async function executeConfluenceRetrievePage( createdAt: data.createdAt ?? null, version: data.version ?? null, _links: data._links ?? null, + ownerId: data.ownerId ?? null, + lastOwnerId: data.lastOwnerId ?? null, + parentType: data.parentType ?? null, + labels: mappedLabels(data.labels), } } @@ -323,7 +335,9 @@ export async function executeConfluenceListAttachments( mediaType: attachment.mediaType || '', downloadUrl: attachment.downloadLink || nested(attachment, '_links', 'download') || '', status: attachment.status ?? null, - webuiUrl: nested(attachment, '_links', 'webui') ?? null, + webuiUrl: nested(attachment, '_links', 'webui') ?? attachment.webuiLink ?? null, + createdAt: attachment.createdAt ?? null, + fileId: attachment.fileId ?? null, pageId: attachment.pageId ?? null, blogPostId: attachment.blogPostId ?? null, comment: attachment.comment ?? null, @@ -488,16 +502,34 @@ export async function executeConfluenceCreateComment( context: ConfluenceOperationContext ) { assertId(input.pageId, 'pageId') - const client = await createConfluenceClient(input, context.signal) + if (!input.parentCommentId) { + const client = await createConfluenceClient(input, context.signal) + const data = await client.json( + client.apiV2('/footer-comments'), + jsonInit('POST', { + pageId: input.pageId, + body: { representation: 'storage', value: input.comment }, + }), + context.signal + ) + return { ...data, pageId: input.pageId } + } + assertId(input.parentCommentId, 'parentCommentId') + const { client, endpoint, response } = await detectCommentEndpoint( + { ...input, commentId: input.parentCommentId }, + context + ) + if (!response.ok) await throwConfluenceResponseError(response, context.signal) + await readConfluenceResponseText(response, context.signal, 'Confluence comment lookup response') const data = await client.json( - client.apiV2('/footer-comments'), + client.apiV2(`/${endpoint}`), jsonInit('POST', { - pageId: input.pageId, + parentCommentId: input.parentCommentId, body: { representation: 'storage', value: input.comment }, }), context.signal ) - return { ...data, pageId: input.pageId } + return { ...data, pageId: data.pageId ?? input.pageId } } export async function executeConfluenceListComments( @@ -511,31 +543,40 @@ export async function executeConfluenceListComments( 'body-format': input.bodyFormat, }) if (input.cursor) query.set('cursor', input.cursor) + const commentType = input.commentType === 'inline' ? 'inline' : 'footer' const data = await client.json( - client.apiV2(`/pages/${input.pageId}/footer-comments?${query}`), + client.apiV2(`/pages/${input.pageId}/${commentType}-comments?${query}`), {}, context.signal ) return { comments: toArray(data.results).map((value) => { const comment = toRecord(value) + const body = toRecord(comment.body) return { id: comment.id, body: { value: - nested(comment, 'body', 'storage', 'value') || - nested(comment, 'body', 'view', 'value') || + nested(body, input.bodyFormat, 'value') || + nested(body, 'storage', 'value') || + nested(body, 'atlas_doc_format', 'value') || + nested(body, 'view', 'value') || '', representation: input.bodyFormat, }, - createdAt: comment.createdAt || '', - authorId: comment.authorId || '', + createdAt: comment.createdAt || nested(comment, 'version', 'createdAt') || '', + authorId: comment.authorId || nested(comment, 'version', 'authorId') || '', status: comment.status ?? null, title: comment.title ?? null, pageId: comment.pageId ?? null, blogPostId: comment.blogPostId ?? null, parentCommentId: comment.parentCommentId ?? null, version: comment.version ?? null, + commentType, + resolutionStatus: comment.resolutionStatus ?? null, + inlineOriginalSelection: nested(comment, 'properties', 'inlineOriginalSelection') ?? null, + inlineMarkerRef: nested(comment, 'properties', 'inlineMarkerRef') ?? null, + webUrl: nested(comment, '_links', 'webui') ?? null, } }), nextCursor: nextCursor(data), @@ -864,6 +905,35 @@ export async function executeConfluenceGetPagesByLabel( } } +const CQL_ORDER_BY = /\s*\border\s+by\s/iy + +/** + * Splits a trailing `order by` clause off a CQL fragment so the condition can be + * parenthesized while the ordering stays at the end, ignoring quoted values. + */ +function splitCqlOrderBy(cql: string): { condition: string; orderBy: string } { + let quote: string | null = null + let orderByStart = -1 + for (let index = 0; index < cql.length; index++) { + const char = cql[index] + if (char === '"' || char === "'") { + let backslashes = 0 + for (let cursor = index - 1; cursor >= 0 && cql[cursor] === '\\'; cursor--) backslashes++ + if (backslashes % 2 === 0) { + if (quote === null) quote = char + else if (quote === char) quote = null + } + continue + } + if (quote !== null) continue + if (index > 0 && !/\s/.test(cql[index - 1])) continue + CQL_ORDER_BY.lastIndex = index + if (CQL_ORDER_BY.test(cql)) orderByStart = index + } + if (orderByStart === -1) return { condition: cql, orderBy: '' } + return { condition: cql.slice(0, orderByStart), orderBy: ` ${cql.slice(orderByStart).trim()}` } +} + function escapeCql(value: string): string { return value.replace(/\\/g, '\\\\').replace(/"/g, '\\"') } @@ -872,39 +942,55 @@ export async function executeConfluenceSearch( input: ConfluenceSearchBody, context: ConfluenceOperationContext ) { + assertCursor(input.cursor) const client = await createConfluenceClient(input, context.signal) + let cql = `text ~ "${escapeCql(input.query)}"` + const extraCql = input.cql?.trim() + if (extraCql) { + const { condition, orderBy } = splitCqlOrderBy(extraCql) + cql += condition.trim() ? ` AND (${condition.trim()})${orderBy}` : orderBy + } const query = new URLSearchParams({ - cql: `text ~ "${escapeCql(input.query)}"`, + cql, limit: input.limit.toString(), + expand: 'content.space', }) + if (input.cursor) query.set('cursor', input.cursor) const data = await client.json(client.rest(`/search?${query}`), {}, context.signal) - return { - results: toArray(data.results).map((value) => { - const result = toRecord(value) - const content = toRecord(result.content) - const globalContainer = toRecord(result.resultGlobalContainer) - const contentSpace = toRecord(content.space) - const space = Object.keys(globalContainer).length ? globalContainer : contentSpace - return { - id: content.id || result.id, - title: content.title || result.title, - type: content.type || result.type, - url: result.url || nested(result, '_links', 'webui') || '', - excerpt: result.excerpt || '', - status: content.status ?? null, - spaceKey: globalContainer.key ?? contentSpace.key ?? null, - space: Object.keys(space).length + const results = toArray(data.results).map((value) => { + const result = toRecord(value) + const content = toRecord(result.content) + const globalContainer = toRecord(result.resultGlobalContainer) + const contentSpace = toRecord(content.space) + const resultSpace = toRecord(result.space) + const space = Object.keys(contentSpace).length ? contentSpace : resultSpace + const spaceId = space.id ?? null + const spaceName = space.name ?? globalContainer.title ?? null + return { + id: content.id || result.id, + title: content.title || result.title, + type: content.type || result.type, + url: result.url || nested(result, '_links', 'webui') || '', + excerpt: result.excerpt || '', + status: content.status ?? null, + spaceKey: space.key ?? null, + space: + space.key || spaceName ? { - id: space.id ?? null, + id: spaceId === null ? null : String(spaceId), key: space.key ?? null, - name: space.name ?? space.title ?? null, + name: spaceName, } : null, - lastModified: - result.lastModified ?? nested(content, 'history', 'lastUpdated', 'when') ?? null, - entityType: result.entityType ?? null, - } - }), + lastModified: + result.lastModified ?? nested(content, 'history', 'lastUpdated', 'when') ?? null, + entityType: result.entityType ?? null, + } + }) + return { + results, + totalSize: data.totalSize ?? results.length, + nextCursor: nextCursor(data), } } @@ -917,7 +1003,9 @@ export async function executeConfluenceSearchInSpace( let cql = `space = "${escapeCql(spaceKey)}"` if (input.query) cql += ` AND text ~ "${escapeCql(input.query)}"` if (input.contentType) cql += ` AND type = "${escapeCql(input.contentType)}"` + assertCursor(input.cursor) const query = new URLSearchParams({ cql, limit: cappedLimit(input.limit) }) + if (input.cursor) query.set('cursor', input.cursor) const data = await client.json(client.rest(`/search?${query}`), {}, context.signal) const results = toArray(data.results).map((value) => { const result = toRecord(value) @@ -932,7 +1020,12 @@ export async function executeConfluenceSearchInSpace( lastModified: result.lastModified ?? null, } }) - return { results, spaceKey, totalSize: data.totalSize ?? results.length } + return { + results, + spaceKey, + totalSize: data.totalSize ?? results.length, + nextCursor: nextCursor(data), + } } export async function executeConfluenceListBlogPostsInSpace( @@ -1109,9 +1202,10 @@ export async function executeConfluenceGetBlogPost( ) { if (!('blogPostId' in input)) throw new ConfluenceOperationError('Blog post ID is required', 400) const client = await createConfluenceClient(input, context.signal) - const query = input.bodyFormat ? `?body-format=${encodeURIComponent(input.bodyFormat)}` : '' + const query = new URLSearchParams({ 'include-labels': 'true' }) + if (input.bodyFormat) query.set('body-format', input.bodyFormat) const data = await client.json( - client.apiV2(`/blogposts/${input.blogPostId}${query}`), + client.apiV2(`/blogposts/${input.blogPostId}?${query}`), {}, context.signal ) @@ -1125,6 +1219,7 @@ export async function executeConfluenceGetBlogPost( version: data.version ?? null, body: data.body ?? null, webUrl: nested(data, '_links', 'webui') ?? null, + labels: mappedLabels(data.labels), } } @@ -1185,7 +1280,11 @@ export async function executeConfluenceGetSpace( ) { const client = await createConfluenceClient(input, context.signal) const spaceId = await resolveConfluenceSpaceId(client, input.spaceId, context.signal) - return client.json(client.apiV2(`/spaces/${spaceId}`), {}, context.signal) + return client.json( + client.apiV2(`/spaces/${spaceId}?description-format=plain`), + {}, + context.signal + ) } export async function executeConfluenceCreateSpace( @@ -1262,7 +1361,10 @@ export async function executeConfluenceListSpaces( context: ConfluenceOperationContext ) { const client = await createConfluenceClient(input, context.signal) - const query = new URLSearchParams({ limit: cappedLimit(input.limit) }) + const query = new URLSearchParams({ + limit: cappedLimit(input.limit), + 'description-format': 'plain', + }) if (input.cursor) query.set('cursor', input.cursor) const data = await client.json(client.apiV2(`/spaces?${query}`), {}, context.signal) return { @@ -1277,7 +1379,9 @@ export async function executeConfluenceListSpaces( authorId: space.authorId ?? null, createdAt: space.createdAt ?? null, homepageId: space.homepageId ?? null, - description: space.description ?? null, + description: nested(space, 'description', 'plain') ?? null, + spaceOwnerId: space.spaceOwnerId ?? null, + webUrl: nested(space, '_links', 'webui') ?? null, } }), nextCursor: nextCursor(data), diff --git a/apps/sim/lib/internal/jira/input.ts b/apps/sim/lib/internal/jira/input.ts index 2ce970de9e8..a38725d4b0d 100644 --- a/apps/sim/lib/internal/jira/input.ts +++ b/apps/sim/lib/internal/jira/input.ts @@ -26,6 +26,7 @@ export const jiraWriteInputSchema = z.object({ customFieldValue: z.string().optional(), components: z.array(z.string()).optional(), fixVersions: z.array(z.string()).optional(), + customFields: z.record(z.string(), z.unknown()).optional(), }) export const jiraUpdateInputSchema = z.object({ @@ -45,6 +46,8 @@ export const jiraUpdateInputSchema = z.object({ customFieldValue: z.string().optional(), notifyUsers: z.boolean().optional(), cloudId: z.string().optional(), + parent: jiraParentReferenceSchema.optional(), + customFields: z.record(z.string(), z.unknown()).optional(), }) export const jiraAddAttachmentInputSchema = z.object({ diff --git a/apps/sim/lib/internal/jira/operations.test.ts b/apps/sim/lib/internal/jira/operations.test.ts index 0dbaf326401..0a331ccbfc6 100644 --- a/apps/sim/lib/internal/jira/operations.test.ts +++ b/apps/sim/lib/internal/jira/operations.test.ts @@ -104,6 +104,35 @@ describe('Jira operations', () => { expect(result.output).not.toHaveProperty('assigneeId') }) + it('keeps the explicit assignee ahead of a customFields assignee on create', async () => { + mocks.request + .mockResolvedValueOnce({ + ok: true, + status: 201, + statusText: 'Created', + text: '{"id":"100","key":"PROJ-1","self":"jira-self","fields":{"summary":"Created"}}', + }) + .mockResolvedValueOnce({ ok: true, status: 204, statusText: 'No Content', text: '' }) + + await executeJiraWrite( + { + accessToken: 'token', + domain: 'example.atlassian.net', + projectId: 'PROJ', + summary: 'Created', + assignee: 'account-explicit', + customFields: { assignee: { accountId: 'account-other' }, customfield_10020: 5 }, + }, + context + ) + + const createBody = JSON.parse(String((mocks.request.mock.calls[0]?.[1] as RequestInit).body)) + expect(createBody.fields).not.toHaveProperty('assignee') + expect(createBody.fields.customfield_10020).toBe(5) + const assignBody = JSON.parse(String((mocks.request.mock.calls[1]?.[1] as RequestInit).body)) + expect(assignBody).toEqual({ accountId: 'account-explicit' }) + }) + it('rejects unsafe attachment issue keys before file or provider work', async () => { await expect( executeJiraAddAttachment( diff --git a/apps/sim/lib/internal/jira/operations.ts b/apps/sim/lib/internal/jira/operations.ts index a6025b3f61f..65e4f0adcee 100644 --- a/apps/sim/lib/internal/jira/operations.ts +++ b/apps/sim/lib/internal/jira/operations.ts @@ -100,6 +100,27 @@ function putOptionalIssueFields( } } +function toParentReference(parent: NonNullable): unknown { + if (typeof parent !== 'string') return parent + return /^\d+$/.test(parent) ? { id: parent } : { key: parent } +} + +/** + * Merges `customFields` under the explicit fields. `reserved` names fields an explicit + * param sets outside this body (the create flow assigns after creation), which + * `customFields` must not override either. + */ +function putAdditionalFields( + fields: JsonObject, + customFields: JsonObject | undefined, + reserved: string[] = [] +): void { + if (!customFields) return + for (const [fieldId, value] of Object.entries(customFields)) { + if (!(fieldId in fields) && !reserved.includes(fieldId)) fields[fieldId] = value + } +} + async function assignCreatedIssue( client: JiraClient, issueKey: string, @@ -149,15 +170,9 @@ export async function executeJiraWrite(input: JiraWriteInput, context: JiraOpera summary: input.summary, } putOptionalIssueFields(fields, input, false) - if (input.parent) { - fields.parent = - typeof input.parent === 'string' - ? /^\d+$/.test(input.parent) - ? { id: input.parent } - : { key: input.parent } - : input.parent - } + if (input.parent) fields.parent = toParentReference(input.parent) if (input.reporter) fields.reporter = { accountId: input.reporter } + putAdditionalFields(fields, input.customFields, input.assignee ? ['assignee'] : []) const response = await client.request( client.issuePath(), @@ -212,6 +227,8 @@ export async function executeJiraUpdate(input: JiraUpdateInput, context: JiraOpe const fields: JsonObject = {} if (input.summary) fields.summary = input.summary putOptionalIssueFields(fields, input, true) + if (input.parent) fields.parent = toParentReference(input.parent) + putAdditionalFields(fields, input.customFields) const notifyParam = input.notifyUsers === false ? '?notifyUsers=false' diff --git a/apps/sim/lib/internal/jsm/assets.ts b/apps/sim/lib/internal/jsm/assets.ts index 124cd90a560..c767f8f68c1 100644 --- a/apps/sim/lib/internal/jsm/assets.ts +++ b/apps/sim/lib/internal/jsm/assets.ts @@ -1,4 +1,4 @@ -import { toArray } from '@sim/utils/object' +import { toArray, toRecord } from '@sim/utils/object' import type { ContractBody } from '@/lib/api/contracts' import type { jsmCreateObjectContract, @@ -12,6 +12,7 @@ import type { jsmUpdateObjectContract, } from '@/lib/api/contracts/tools/jsm' import { createJsmAssetsClient } from '@/lib/internal/jsm/client' +import { JsmOperationError } from '@/lib/internal/jsm/errors' import { mapAssetObject } from '@/tools/jsm/utils' type ListObjectSchemasInput = ContractBody @@ -74,22 +75,40 @@ export async function executeJsmGetObjectSchema(input: GetObjectSchemaInput, sig return { success: true, output: { ts: new Date().toISOString(), schema: schema ?? null } } } +/** Accepts an object-types listing as a bare array or a `values` wrapper. */ +function toObjectTypeList(value: unknown): unknown[] { + return Array.isArray(value) ? value : toArray(toRecord(value).values) +} + +/** + * Lists a schema's object types. An empty schema listing is retried against the + * documented `/flat` listing, which returns every type in the schema, with + * `excludeAbstract` applied client-side because `/flat` does not accept it. + */ export async function executeJsmListObjectTypes(input: ListObjectTypesInput, signal?: AbortSignal) { const client = await createJsmAssetsClient(input, signal) const query = new URLSearchParams() if (input.excludeAbstract !== undefined) { query.append('excludeAbstract', String(input.excludeAbstract)) } - const value = await client.value( - client.assets( - `/objectschema/${encodeURIComponent(input.schemaId)}/objecttypes${query.size ? `?${query}` : ''}` - ), - {}, - signal, - true + const schemaPath = `/objectschema/${encodeURIComponent(input.schemaId)}/objecttypes` + let objectTypes = toObjectTypeList( + await client.value( + client.assets(`${schemaPath}${query.size ? `?${query}` : ''}`), + {}, + signal, + true + ) ) - const data = Array.isArray(value) ? {} : (value as Record) - const objectTypes = Array.isArray(value) ? value : toArray(data.values) + if (objectTypes.length === 0) { + const flat = toObjectTypeList( + await client.value(client.assets(`${schemaPath}/flat`), {}, signal, true) + ) + objectTypes = + String(input.excludeAbstract) === 'true' + ? flat.filter((objectType) => toRecord(objectType).abstractObjectType !== true) + : flat + } return { success: true, output: { ts: new Date().toISOString(), objectTypes, total: objectTypes.length }, @@ -122,23 +141,76 @@ export async function executeJsmGetObjectTypeAttributes( } } +const ASSETS_NUMERIC_ID = /^\d+$/ + +const AQL_ORDER_BY = /\s+order\s+by\s/iy + +/** + * Splits a trailing `order by` clause off an AQL query, ignoring matches inside + * double-quoted values (including escaped `\\"`), since AQL requires the ordering to + * stay at the end. + */ +function splitAqlOrderBy(qlQuery: string): { condition: string; orderBy: string } { + let inQuotes = false + let orderByStart = -1 + for (let index = 0; index < qlQuery.length; index++) { + if (qlQuery[index] === '"') { + let backslashes = 0 + for (let cursor = index - 1; cursor >= 0 && qlQuery[cursor] === '\\'; cursor--) backslashes++ + if (backslashes % 2 === 0) inQuotes = !inQuotes + continue + } + if (inQuotes) continue + AQL_ORDER_BY.lastIndex = index + if (AQL_ORDER_BY.test(qlQuery)) orderByStart = index + } + if (orderByStart === -1) return { condition: qlQuery, orderBy: '' } + return { condition: qlQuery.slice(0, orderByStart), orderBy: qlQuery.slice(orderByStart) } +} + +function scopeId(keyword: string, id: string | undefined): string | null { + const trimmed = id?.trim() + if (!trimmed) return null + if (!ASSETS_NUMERIC_ID.test(trimmed)) { + throw new JsmOperationError(`${keyword} must be a numeric ID`, 400) + } + return `${keyword} = ${trimmed}` +} + +/** ANDs the optional object type and schema scopes into the query's condition. */ +function scopeAqlQuery(input: SearchObjectsAqlInput): string { + const scopes = [ + scopeId('objectTypeId', input.objectTypeId), + scopeId('objectSchemaId', input.objectSchemaId), + ].filter((scope): scope is string => scope !== null) + if (scopes.length === 0) return input.qlQuery + const { condition, orderBy } = splitAqlOrderBy(input.qlQuery) + return `(${condition.trim()}) AND ${scopes.join(' AND ')}${orderBy}` +} + export async function executeJsmSearchObjectsAql( input: SearchObjectsAqlInput, signal?: AbortSignal ) { - const client = await createJsmAssetsClient(input, signal) + const page = Math.max(1, Math.trunc(toNumber(input.page, 1))) + const resultsPerPage = Math.max(1, Math.trunc(toNumber(input.resultsPerPage, 25))) const includeAttributes = input.includeAttributes === undefined ? true : String(input.includeAttributes) === 'true' - const body: Record = { - qlQuery: input.qlQuery, - page: toNumber(input.page, 1), - resultsPerPage: toNumber(input.resultsPerPage, 25), - includeAttributes, - } - if (input.objectTypeId) body.objectTypeId = input.objectTypeId - if (input.objectSchemaId) body.objectSchemaId = input.objectSchemaId - const data = await client.json(client.assets('/object/aql'), jsonBody('POST', body), signal, true) - const entries = toArray(data.objectEntries) + const qlQuery = scopeAqlQuery(input) + const client = await createJsmAssetsClient(input, signal) + const query = new URLSearchParams({ + startAt: String((page - 1) * resultsPerPage), + maxResults: String(resultsPerPage), + includeAttributes: String(includeAttributes), + }) + const data = await client.json( + client.assets(`/object/aql?${query}`), + jsonBody('POST', { qlQuery }), + signal, + true + ) + const entries = toArray(data.values) + const isLast = data.isLast === undefined ? undefined : String(data.isLast) === 'true' return { success: true, output: { @@ -146,9 +218,12 @@ export async function executeJsmSearchObjectsAql( objects: entries.map((entry) => mapAssetObject(entry as Parameters[0]) ), - total: data.totalFilterCount ?? entries.length, - pageNumber: data.pageNumber ?? 1, - pageSize: data.pageSize ?? entries.length, + total: data.total ?? entries.length, + pageNumber: page, + pageSize: entries.length, + startAt: data.startAt ?? (page - 1) * resultsPerPage, + maxResults: data.maxResults ?? resultsPerPage, + isLast: isLast ?? entries.length < resultsPerPage, }, } } diff --git a/apps/sim/lib/internal/jsm/operations.test.ts b/apps/sim/lib/internal/jsm/operations.test.ts index 11d219d331b..163bcf9d9a0 100644 --- a/apps/sim/lib/internal/jsm/operations.test.ts +++ b/apps/sim/lib/internal/jsm/operations.test.ts @@ -35,8 +35,8 @@ vi.mock('@/lib/internal/jsm/client', () => ({ vi.mock('@/tools/jsm/utils', () => ({ mapAssetObject: mocks.mapAssetObject })) -import { executeJsmSearchObjectsAql } from '@/lib/internal/jsm/assets' -import { executeJsmCreateRequest } from '@/lib/internal/jsm/service-desk' +import { executeJsmListObjectTypes, executeJsmSearchObjectsAql } from '@/lib/internal/jsm/assets' +import { executeJsmCreateRequest, executeJsmGetRequests } from '@/lib/internal/jsm/service-desk' const BASE = { domain: 'example.atlassian.net', @@ -64,11 +64,35 @@ describe('JSM operations', () => { }) }) - it('normalizes Assets AQL pagination and forwards the execution signal', async () => { + it('accepts the organization ownership filter with its organization ID', async () => { + mocks.client.json.mockResolvedValueOnce({ values: [], size: 0, isLastPage: true }) + await executeJsmGetRequests({ + ...BASE, + requestOwnership: 'ORGANIZATION', + organizationId: '3', + }) + expect(mocks.client.json.mock.calls.at(-1)?.[0]).toBe( + 'service:/request?requestOwnership=ORGANIZATION&organizationId=3' + ) + }) + + it('sends AQL paging as startAt/maxResults query params and reads the values page', async () => { const controller = new AbortController() - mocks.client.json.mockResolvedValueOnce({ objectEntries: [{ id: 'object-1' }] }) - await executeJsmSearchObjectsAql( - { ...BASE, qlQuery: 'objectType = Host', page: '2', resultsPerPage: '10' }, + mocks.client.json.mockResolvedValueOnce({ + startAt: 10, + maxResults: 10, + total: 11, + isLast: 'true', + values: [{ id: 'object-1' }], + }) + const result = await executeJsmSearchObjectsAql( + { + ...BASE, + qlQuery: 'objectType = Host', + page: '2', + resultsPerPage: '10', + objectSchemaId: '6', + }, controller.signal ) expect(mocks.createJsmAssetsClient).toHaveBeenCalledWith( @@ -76,18 +100,93 @@ describe('JSM operations', () => { controller.signal ) expect(mocks.client.json).toHaveBeenCalledWith( - 'assets:/object/aql', + 'assets:/object/aql?startAt=10&maxResults=10&includeAttributes=true', { method: 'POST', - body: JSON.stringify({ - qlQuery: 'objectType = Host', - page: 2, - resultsPerPage: 10, - includeAttributes: true, - }), + body: JSON.stringify({ qlQuery: '(objectType = Host) AND objectSchemaId = 6' }), }, controller.signal, true ) + expect(result.output).toMatchObject({ + objects: [{ id: 'object-1' }], + total: 11, + pageNumber: 2, + isLast: true, + }) + }) + + it('rejects a non-numeric AQL scope ID instead of splicing it into the query', async () => { + await expect( + executeJsmSearchObjectsAql({ + ...BASE, + qlQuery: 'objectType = Host', + objectTypeId: '1 OR objectType != Host', + }) + ).rejects.toThrow('objectTypeId must be a numeric ID') + }) + + it('falls back to the flat object-types listing when the schema listing comes back empty', async () => { + mocks.client.value.mockReset() + mocks.client.value.mockResolvedValueOnce([]).mockResolvedValueOnce([ + { id: '1', name: 'Host', abstractObjectType: false }, + { id: '2', name: 'Base', abstractObjectType: true }, + ]) + const result = await executeJsmListObjectTypes({ + ...BASE, + schemaId: '6', + excludeAbstract: true, + }) + expect(mocks.client.value.mock.calls.map((call) => call[0])).toEqual([ + 'assets:/objectschema/6/objecttypes?excludeAbstract=true', + 'assets:/objectschema/6/objecttypes/flat', + ]) + expect(result.output).toMatchObject({ objectTypes: [{ id: '1', name: 'Host' }], total: 1 }) + }) + + it('keeps a non-empty schema listing without a second request', async () => { + mocks.client.value.mockReset() + mocks.client.value.mockResolvedValueOnce([{ id: '1', name: 'Host' }]) + const result = await executeJsmListObjectTypes({ ...BASE, schemaId: '6' }) + expect(mocks.client.value).toHaveBeenCalledTimes(1) + expect(result.output).toMatchObject({ objectTypes: [{ id: '1', name: 'Host' }], total: 1 }) + }) + + it('keeps a trailing AQL order by clause after the scope filter', async () => { + mocks.client.json.mockResolvedValueOnce({ values: [], total: 0, isLast: 'true' }) + await executeJsmSearchObjectsAql({ + ...BASE, + qlQuery: 'Name = "sort order by date" ORDER BY "Created Date" desc', + objectSchemaId: '6', + }) + expect(mocks.client.json.mock.calls.at(-1)?.[1]).toEqual({ + method: 'POST', + body: JSON.stringify({ + qlQuery: + '(Name = "sort order by date") AND objectSchemaId = 6 ORDER BY "Created Date" desc', + }), + }) + }) + + it.each([ + [{ approvalStatus: 'MY_PENDING_APPROVAL', requestOwnership: 'OWNED_REQUESTS' }, 'APPROVER'], + [{ organizationId: '3', requestOwnership: 'APPROVER' }, 'ORGANIZATION'], + ])( + 'rejects %o, which Atlassian only accepts with requestOwnership %s', + async (filters, owner) => { + await expect(executeJsmGetRequests({ ...BASE, ...filters })).rejects.toThrow(owner) + } + ) + + it('does not split an order by inside an escaped quote', async () => { + mocks.client.json.mockResolvedValueOnce({ values: [], total: 0, isLast: 'true' }) + await executeJsmSearchObjectsAql({ + ...BASE, + qlQuery: 'Name = "say \\" order by \\" x" order by Name', + objectTypeId: '7', + }) + expect(JSON.parse(String(mocks.client.json.mock.calls.at(-1)?.[1]?.body))).toEqual({ + qlQuery: '(Name = "say \\" order by \\" x") AND objectTypeId = 7 order by Name', + }) }) }) diff --git a/apps/sim/lib/internal/jsm/service-desk.ts b/apps/sim/lib/internal/jsm/service-desk.ts index 97857d93110..90cbf74a91b 100644 --- a/apps/sim/lib/internal/jsm/service-desk.ts +++ b/apps/sim/lib/internal/jsm/service-desk.ts @@ -167,8 +167,11 @@ const REQUEST_OWNERSHIP = [ 'PARTICIPATED_REQUESTS', 'APPROVER', 'ALL_REQUESTS', + 'ORGANIZATION', + 'ALL_ORGANIZATIONS', ] as const const REQUEST_STATUS = ['OPEN_REQUESTS', 'CLOSED_REQUESTS', 'ALL_REQUESTS'] as const +const APPROVAL_STATUS = ['MY_PENDING_APPROVAL', 'MY_HISTORY_APPROVAL'] as const function requireAction( action: string, @@ -193,11 +196,24 @@ export async function executeJsmGetRequests(input: JsmRequestsBody, signal?: Abo const result = validateEnum(input.requestStatus, REQUEST_STATUS, 'requestStatus') if (!result.isValid) throw new JsmOperationError(result.error || 'Invalid requestStatus', 400) } + if (input.approvalStatus) { + const result = validateEnum(input.approvalStatus, APPROVAL_STATUS, 'approvalStatus') + if (!result.isValid) throw new JsmOperationError(result.error || 'Invalid approvalStatus', 400) + } + if (input.approvalStatus && input.requestOwnership !== 'APPROVER') { + throw new JsmOperationError('approvalStatus requires requestOwnership APPROVER', 400) + } + if (input.organizationId) validateId(input.organizationId, 'organizationId') + if (input.organizationId && input.requestOwnership !== 'ORGANIZATION') { + throw new JsmOperationError('organizationId requires requestOwnership ORGANIZATION', 400) + } const client = await createJsmClient(input, signal) const query = new URLSearchParams() append(query, 'serviceDeskId', input.serviceDeskId) append(query, 'requestOwnership', input.requestOwnership) append(query, 'requestStatus', input.requestStatus) + append(query, 'approvalStatus', input.approvalStatus) + append(query, 'organizationId', input.organizationId) append(query, 'requestTypeId', input.requestTypeId) append(query, 'searchTerm', input.searchTerm) append(query, 'expand', input.expand) @@ -223,6 +239,27 @@ function currentStatus(data: Record) { : null } +function webUrl(data: Record): string | null { + const web = toRecord(data._links).web + return typeof web === 'string' ? web : null +} + +function requestFieldValues(data: Record) { + return toArray(data.requestFieldValues).map((entry) => { + const field = toRecord(entry) + return { + fieldId: field.fieldId ?? null, + label: field.label ?? null, + value: field.value ?? null, + ...(field.renderedValue !== undefined ? { renderedValue: field.renderedValue } : {}), + } + }) +} + +function expandedValues(value: unknown): unknown[] | null { + return value === undefined ? null : toArray(toRecord(value).values) +} + function reporter(data: Record, includeActive: boolean) { if (!data.reporter) return null const value = toRecord(data.reporter) @@ -285,8 +322,10 @@ export async function executeJsmCreateRequest(input: JsmRequestBody, signal?: Ab createdDate: data.createdDate ?? null, currentStatus: currentStatus(data), reporter: reporter(data, false), + requestFieldValues: requestFieldValues(data), success: true, url: `https://${input.domain}/browse/${String(data.issueKey)}`, + webUrl: webUrl(data), }, } } @@ -316,15 +355,11 @@ export async function executeJsmGetRequest(input: JsmRequestBody, signal?: Abort createdDate: data.createdDate ?? null, currentStatus: currentStatus(data), reporter: reporter(data, true), - requestFieldValues: toArray(data.requestFieldValues).map((entry) => { - const field = toRecord(entry) - return { - fieldId: field.fieldId ?? null, - label: field.label ?? null, - value: field.value ?? null, - } - }), + requestFieldValues: requestFieldValues(data), url: `https://${input.domain}/browse/${String(data.issueKey)}`, + webUrl: webUrl(data), + participants: expandedValues(data.participants), + slas: expandedValues(data.sla), request: data, }, } diff --git a/apps/sim/lib/webhooks/providers/bitbucket.ts b/apps/sim/lib/webhooks/providers/bitbucket.ts index e0fa832499c..ae9f8077155 100644 --- a/apps/sim/lib/webhooks/providers/bitbucket.ts +++ b/apps/sim/lib/webhooks/providers/bitbucket.ts @@ -260,16 +260,19 @@ async function deleteProvenBitbucketCandidate( } ) } catch (error) { - logger.warn(`Failed to delete proven Bitbucket candidate ${externalId}`, { + logger.warn('Failed to delete proven Bitbucket candidate', { requestId, + externalId, error: getErrorMessage(error), }) return false } if (!response.ok && response.status !== 404) { - logger.warn(`Failed to delete proven Bitbucket candidate ${externalId} (${response.status})`, { + logger.warn('Failed to delete proven Bitbucket candidate', { requestId, + externalId, + status: response.status, }) return false } @@ -454,10 +457,11 @@ export const bitbucketHandler: WebhookProviderHandler = { const { isBitbucketEventMatch } = await import('@/triggers/bitbucket/utils') if (!triggerId || !isBitbucketEventMatch(triggerId, eventKey)) { - logger.debug( - `Bitbucket event '${eventKey}' does not match trigger '${triggerId || 'unknown'}', skipping`, - { requestId } - ) + logger.debug('Bitbucket event does not match trigger, skipping', { + requestId, + eventKey, + triggerId: triggerId || 'unknown', + }) return false } return true @@ -520,8 +524,9 @@ export const bitbucketHandler: WebhookProviderHandler = { existingCandidate.events.length === 1 && existingCandidate.events[0] === eventKey if (candidateMatchesCheckpoint && checkpointedSecret) { - logger.info(`Reusing checkpointed Bitbucket candidate ${existingCandidate.externalId}`, { + logger.info('Reusing checkpointed Bitbucket candidate', { requestId: ctx.requestId, + externalId: existingCandidate.externalId, }) return { providerConfigUpdates: { @@ -577,8 +582,9 @@ export const bitbucketHandler: WebhookProviderHandler = { if (!response.ok) { const detail = await readBitbucketErrorDetail(response) - logger.error(`Failed to create Bitbucket webhook (${response.status})`, { + logger.error('Failed to create Bitbucket webhook', { requestId: ctx.requestId, + status: response.status, detail, workspaceSlug, repoSlug, @@ -614,8 +620,11 @@ export const bitbucketHandler: WebhookProviderHandler = { throw new Error('Bitbucket webhook was created but no hook UUID was returned.') } - logger.info(`Created Bitbucket webhook ${externalId} for ${workspaceSlug}/${repoSlug}`, { + logger.info('Created Bitbucket webhook', { requestId: ctx.requestId, + externalId, + workspaceSlug, + repoSlug, }) return { providerConfigUpdates: { externalId, webhookSecret, eventTypes: [eventKey] }, @@ -655,7 +664,7 @@ export const bitbucketHandler: WebhookProviderHandler = { throw createBitbucketApiError(response.status, 'delete', detail) } - logger.info(`Deleted Bitbucket webhook ${externalId}`, { requestId: ctx.requestId }) + logger.info('Deleted Bitbucket webhook', { requestId: ctx.requestId, externalId }) } catch (error) { logger.warn('Error deleting Bitbucket webhook (non-fatal)', error, { requestId: ctx.requestId, diff --git a/apps/sim/tools/bitbucket/list_commits.ts b/apps/sim/tools/bitbucket/list_commits.ts index a1536e2c2fb..6e0d59383d1 100644 --- a/apps/sim/tools/bitbucket/list_commits.ts +++ b/apps/sim/tools/bitbucket/list_commits.ts @@ -18,6 +18,7 @@ import { normalizeBitbucketCommit, normalizeBitbucketPage, } from '@/tools/bitbucket/utils' +import { optionalBitbucketString, optionalBitbucketStringArray } from '@/tools/bitbucket/validation' import type { ToolConfig } from '@/tools/types' export const bitbucketListCommitsTool: ToolConfig< @@ -29,13 +30,50 @@ export const bitbucketListCommitsTool: ToolConfig< description: 'List repository commits in reverse chronological order', version: '1.0.0', oauth: { required: true, provider: 'bitbucket', requiredScopes: ['repository'] }, - params: { ...BITBUCKET_REPOSITORY_PARAMS, ...BITBUCKET_PAGINATION_PARAMS }, + params: { + ...BITBUCKET_REPOSITORY_PARAMS, + include: { + type: 'array', + required: false, + visibility: 'user-or-llm', + description: + 'Branches, tags, or commit hashes whose history to include; omit to list commits on every ref', + items: { type: 'string' }, + }, + exclude: { + type: 'array', + required: false, + visibility: 'user-or-llm', + description: 'Branches, tags, or commit hashes whose reachable commits to leave out', + items: { type: 'string' }, + }, + path: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: 'Only list commits that changed this file or directory', + }, + ...BITBUCKET_PAGINATION_PARAMS, + }, request: { - url: (params) => - bitbucketApiUrl(`${bitbucketRepositoryPath(params.workspaceSlug, params.repoSlug)}/commits`, { - nextUrl: params.nextUrl, - pageLen: params.pageLen, - }), + url: (params) => { + const include = optionalBitbucketStringArray(params.include, 'include', 'include ref') + const exclude = optionalBitbucketStringArray(params.exclude, 'exclude', 'exclude ref') + const path = optionalBitbucketString(params.path, 'path') + const url = bitbucketApiUrl( + `${bitbucketRepositoryPath(params.workspaceSlug, params.repoSlug)}/commits`, + { + nextUrl: params.nextUrl, + pageLen: params.pageLen, + query: { path }, + } + ) + if (params.nextUrl !== undefined) return url + const withRefs = new URL(url) + for (const ref of include ?? []) withRefs.searchParams.append('include', ref) + for (const ref of exclude ?? []) withRefs.searchParams.append('exclude', ref) + return withRefs.toString() + }, method: 'GET', headers: (params) => bitbucketHeaders(params.accessToken), retry: BITBUCKET_READ_RETRY, diff --git a/apps/sim/tools/bitbucket/types.ts b/apps/sim/tools/bitbucket/types.ts index 583029a7304..7e90c30a1ea 100644 --- a/apps/sim/tools/bitbucket/types.ts +++ b/apps/sim/tools/bitbucket/types.ts @@ -52,7 +52,11 @@ export interface BitbucketDeleteBranchParams extends BitbucketRepositoryParams { export interface BitbucketListCommitsParams extends BitbucketRepositoryParams, - BitbucketPaginationParams {} + BitbucketPaginationParams { + include?: string[] + exclude?: string[] + path?: string +} export interface BitbucketGetCommitParams extends BitbucketRepositoryParams { commit: string @@ -288,6 +292,8 @@ export interface BitbucketPullRequestEndpoint { commitHash: string | null repositoryUuid: string | null repositoryFullName: string | null + mergeStrategies: string[] | null + defaultMergeStrategy: string | null } export interface BitbucketParticipant { @@ -615,6 +621,17 @@ export const BITBUCKET_PR_ENDPOINT_OUTPUT_PROPERTIES: Record = { diff --git a/apps/sim/tools/bitbucket/utils.ts b/apps/sim/tools/bitbucket/utils.ts index c2f02c4273c..a7bc52d3459 100644 --- a/apps/sim/tools/bitbucket/utils.ts +++ b/apps/sim/tools/bitbucket/utils.ts @@ -684,11 +684,17 @@ export function normalizeBitbucketFileMetadata(value: unknown): BitbucketFileMet function normalizePullRequestEndpoint(value: unknown): BitbucketPullRequestEndpoint | null { const data = toRecordOrNull(value) if (!data) return null + const branch = readRecord(data, 'branch') + const mergeStrategies = branch?.merge_strategies return { - branchName: readString(readRecord(data, 'branch'), 'name'), + branchName: readString(branch, 'name'), commitHash: readString(readRecord(data, 'commit'), 'hash'), repositoryUuid: readString(readRecord(data, 'repository'), 'uuid'), repositoryFullName: readString(readRecord(data, 'repository'), 'full_name'), + mergeStrategies: Array.isArray(mergeStrategies) + ? mergeStrategies.filter((strategy): strategy is string => typeof strategy === 'string') + : null, + defaultMergeStrategy: readString(branch, 'default_merge_strategy'), } } diff --git a/apps/sim/tools/confluence/create_comment.ts b/apps/sim/tools/confluence/create_comment.ts index b803fa35885..5bf2c6fae6e 100644 --- a/apps/sim/tools/confluence/create_comment.ts +++ b/apps/sim/tools/confluence/create_comment.ts @@ -1,3 +1,4 @@ +import { VERSION_OUTPUT_PROPERTIES } from '@/tools/confluence/types' import type { InternalToolConfig } from '@/tools/types' export interface ConfluenceCreateCommentParams { @@ -5,6 +6,7 @@ export interface ConfluenceCreateCommentParams { domain: string pageId: string comment: string + parentCommentId?: string cloudId?: string } @@ -14,6 +16,10 @@ export interface ConfluenceCreateCommentResponse { ts: string commentId: string pageId: string + parentCommentId: string | null + status: string | null + version: Record | null + webUrl: string | null } } @@ -56,6 +62,13 @@ export const confluenceCreateCommentTool: InternalToolConfig< visibility: 'user-or-llm', description: 'Comment text in Confluence storage format', }, + parentCommentId: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: + 'ID of a footer or inline comment to reply to. When set, the comment is posted as a reply in that thread.', + }, cloudId: { type: 'string', required: false, @@ -73,6 +86,7 @@ export const confluenceCreateCommentTool: InternalToolConfig< cloudId: params.cloudId, pageId: params.pageId, comment: params.comment, + parentCommentId: params.parentCommentId?.trim() || undefined, } }, }, @@ -85,6 +99,10 @@ export const confluenceCreateCommentTool: InternalToolConfig< ts: new Date().toISOString(), commentId: data.id, pageId: data.pageId || '', + parentCommentId: data.parentCommentId ?? null, + status: data.status ?? null, + version: data.version ?? null, + webUrl: data._links?.webui ?? null, }, } }, @@ -93,5 +111,22 @@ export const confluenceCreateCommentTool: InternalToolConfig< ts: { type: 'string', description: 'Timestamp of creation' }, commentId: { type: 'string', description: 'Created comment ID' }, pageId: { type: 'string', description: 'Page ID' }, + parentCommentId: { + type: 'string', + description: 'ID of the parent comment when the comment is a reply', + optional: true, + }, + status: { type: 'string', description: 'Comment status (e.g., current)', optional: true }, + version: { + type: 'object', + description: 'Comment version information', + properties: VERSION_OUTPUT_PROPERTIES, + optional: true, + }, + webUrl: { + type: 'string', + description: 'URL to view the comment in Confluence', + optional: true, + }, }, } diff --git a/apps/sim/tools/confluence/get_blogpost.ts b/apps/sim/tools/confluence/get_blogpost.ts index b9b89c8e0aa..e9bd90984a0 100644 --- a/apps/sim/tools/confluence/get_blogpost.ts +++ b/apps/sim/tools/confluence/get_blogpost.ts @@ -1,5 +1,6 @@ import { CONTENT_BODY_OUTPUT_PROPERTIES, + CONTENT_LABELS_OUTPUT, TIMESTAMP_OUTPUT, VERSION_OUTPUT_PROPERTIES, } from '@/tools/confluence/types' @@ -32,6 +33,7 @@ export interface ConfluenceGetBlogPostResponse { storage?: { value: string } } | null webUrl: string | null + labels: Array<{ id: string; name: string; prefix: string }> } } @@ -72,7 +74,8 @@ export const confluenceGetBlogPostTool: InternalToolConfig< type: 'string', required: false, visibility: 'user-or-llm', - description: 'Format for blog post body: storage, atlas_doc_format, or view', + description: + 'Format for blog post body: storage, atlas_doc_format, view, or export_view (default: storage)', }, cloudId: { type: 'string', @@ -108,6 +111,7 @@ export const confluenceGetBlogPostTool: InternalToolConfig< version: data.version ?? null, body: data.body ?? null, webUrl: data.webUrl ?? null, + labels: data.labels ?? [], }, } }, @@ -133,5 +137,6 @@ export const confluenceGetBlogPostTool: InternalToolConfig< optional: true, }, webUrl: { type: 'string', description: 'URL to view the blog post', optional: true }, + labels: CONTENT_LABELS_OUTPUT, }, } diff --git a/apps/sim/tools/confluence/get_space.ts b/apps/sim/tools/confluence/get_space.ts index 99f21248f7c..651c29e52ee 100644 --- a/apps/sim/tools/confluence/get_space.ts +++ b/apps/sim/tools/confluence/get_space.ts @@ -25,6 +25,7 @@ export interface ConfluenceGetSpaceResponse { value: string representation: string } | null + spaceOwnerId: string | null } } @@ -99,7 +100,8 @@ export const confluenceGetSpaceTool: InternalToolConfig< authorId: data.authorId ?? null, createdAt: data.createdAt ?? null, homepageId: data.homepageId ?? null, - description: data.description ?? null, + description: data.description?.plain ?? null, + spaceOwnerId: data.spaceOwnerId ?? null, }, } }, @@ -125,5 +127,10 @@ export const confluenceGetSpaceTool: InternalToolConfig< properties: SPACE_DESCRIPTION_OUTPUT_PROPERTIES, optional: true, }, + spaceOwnerId: { + type: 'string', + description: 'Account ID of the space owner', + optional: true, + }, }, } diff --git a/apps/sim/tools/confluence/list_blogposts_in_space.ts b/apps/sim/tools/confluence/list_blogposts_in_space.ts index af7125d87e9..4b6d1fc73e0 100644 --- a/apps/sim/tools/confluence/list_blogposts_in_space.ts +++ b/apps/sim/tools/confluence/list_blogposts_in_space.ts @@ -90,7 +90,8 @@ export const confluenceListBlogPostsInSpaceTool: InternalToolConfig< type: 'string', required: false, visibility: 'user-or-llm', - description: 'Format for blog post body: storage, atlas_doc_format, or view', + description: + 'Format for blog post body: storage or atlas_doc_format. If not specified, body is not included.', }, cursor: { type: 'string', diff --git a/apps/sim/tools/confluence/list_comments.ts b/apps/sim/tools/confluence/list_comments.ts index af6a7c4f274..ef818be4127 100644 --- a/apps/sim/tools/confluence/list_comments.ts +++ b/apps/sim/tools/confluence/list_comments.ts @@ -1,4 +1,4 @@ -import { COMMENTS_OUTPUT, TIMESTAMP_OUTPUT } from '@/tools/confluence/types' +import { COMMENT_ITEM_PROPERTIES, TIMESTAMP_OUTPUT } from '@/tools/confluence/types' import type { InternalToolConfig } from '@/tools/types' export interface ConfluenceListCommentsParams { @@ -8,6 +8,7 @@ export interface ConfluenceListCommentsParams { limit?: number bodyFormat?: string cursor?: string + commentType?: 'footer' | 'inline' cloudId?: string } @@ -69,8 +70,7 @@ export const confluenceListCommentsTool: InternalToolConfig< type: 'string', required: false, visibility: 'user-or-llm', - description: - 'Format for the comment body: storage, atlas_doc_format, view, or export_view (default: storage)', + description: 'Format for the comment body: storage or atlas_doc_format (default: storage)', }, cursor: { type: 'string', @@ -78,6 +78,13 @@ export const confluenceListCommentsTool: InternalToolConfig< visibility: 'user-or-llm', description: 'Pagination cursor from previous response', }, + commentType: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: + 'Which comments to list: footer (comments at the bottom of the page) or inline (comments attached to highlighted text). Default: footer', + }, cloudId: { type: 'string', required: false, @@ -101,6 +108,9 @@ export const confluenceListCommentsTool: InternalToolConfig< if (params.cursor) { query.set('cursor', params.cursor) } + if (params.commentType) { + query.set('commentType', params.commentType) + } if (params.cloudId) { query.set('cloudId', params.cloudId) } @@ -122,7 +132,41 @@ export const confluenceListCommentsTool: InternalToolConfig< outputs: { ts: TIMESTAMP_OUTPUT, - comments: COMMENTS_OUTPUT, + comments: { + type: 'array', + description: 'Array of Confluence comments', + items: { + type: 'object', + properties: { + ...COMMENT_ITEM_PROPERTIES, + commentType: { + type: 'string', + description: 'Comment type that was listed (footer or inline)', + optional: true, + }, + resolutionStatus: { + type: 'string', + description: 'Inline comment resolution status (open, reopened, resolved, dangling)', + optional: true, + }, + inlineOriginalSelection: { + type: 'string', + description: 'Page text the inline comment is attached to', + optional: true, + }, + inlineMarkerRef: { + type: 'string', + description: 'Marker reference of the highlighted text for an inline comment', + optional: true, + }, + webUrl: { + type: 'string', + description: 'URL to view the comment in Confluence', + optional: true, + }, + }, + }, + }, nextCursor: { type: 'string', description: 'Cursor for fetching the next page of results', diff --git a/apps/sim/tools/confluence/list_pages_in_space.ts b/apps/sim/tools/confluence/list_pages_in_space.ts index a69f4130276..d480cc1dd1e 100644 --- a/apps/sim/tools/confluence/list_pages_in_space.ts +++ b/apps/sim/tools/confluence/list_pages_in_space.ts @@ -93,7 +93,7 @@ export const confluenceListPagesInSpaceTool: InternalToolConfig< required: false, visibility: 'user-or-llm', description: - 'Format for page body content: storage, atlas_doc_format, or view. If not specified, body is not included.', + 'Format for page body content: storage or atlas_doc_format. If not specified, body is not included.', }, cursor: { type: 'string', diff --git a/apps/sim/tools/confluence/retrieve.ts b/apps/sim/tools/confluence/retrieve.ts index 356448f4101..b0f510a1cd0 100644 --- a/apps/sim/tools/confluence/retrieve.ts +++ b/apps/sim/tools/confluence/retrieve.ts @@ -1,6 +1,7 @@ import type { ConfluenceRetrieveParams, ConfluenceRetrieveResponse } from '@/tools/confluence/types' import { BODY_FORMAT_PROPERTIES, + CONTENT_LABELS_OUTPUT, TIMESTAMP_OUTPUT, VERSION_OUTPUT_PROPERTIES, } from '@/tools/confluence/types' @@ -78,6 +79,22 @@ export const confluenceRetrieveTool: InternalToolConfig< spaceId: { type: 'string', description: 'ID of the space containing the page', optional: true }, parentId: { type: 'string', description: 'ID of the parent page', optional: true }, authorId: { type: 'string', description: 'Account ID of the page author', optional: true }, + ownerId: { + type: 'string', + description: 'Account ID of the current page owner', + optional: true, + }, + lastOwnerId: { + type: 'string', + description: 'Account ID of the previous page owner', + optional: true, + }, + parentType: { + type: 'string', + description: 'Type of the parent content (e.g., page, whiteboard, database, embed, folder)', + optional: true, + }, + labels: CONTENT_LABELS_OUTPUT, createdAt: { type: 'string', description: 'ISO 8601 timestamp when the page was created', diff --git a/apps/sim/tools/confluence/search.ts b/apps/sim/tools/confluence/search.ts index 3349ae07aa6..2589cd5d849 100644 --- a/apps/sim/tools/confluence/search.ts +++ b/apps/sim/tools/confluence/search.ts @@ -6,6 +6,8 @@ export interface ConfluenceSearchParams { domain: string query: string limit?: number + cql?: string + cursor?: string cloudId?: string } @@ -20,6 +22,8 @@ export interface ConfluenceSearchResponse { url: string excerpt: string }> + totalSize: number | null + nextCursor: string | null } } @@ -62,6 +66,19 @@ export const confluenceSearchTool: InternalToolConfig< visibility: 'user-or-llm', description: 'Maximum number of results to return (default: 25)', }, + cql: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: + 'Extra CQL clauses ANDed with the text search, e.g. type = page AND space = "ENG" AND lastModified > now("-7d")', + }, + cursor: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: 'Pagination cursor from a previous response (nextCursor)', + }, cloudId: { type: 'string', required: false, @@ -79,6 +96,8 @@ export const confluenceSearchTool: InternalToolConfig< cloudId: params.cloudId, query: params.query, limit: params.limit ? Number(params.limit) : 25, + cql: params.cql?.trim() || undefined, + cursor: params.cursor?.trim() || undefined, } }, }, @@ -90,6 +109,8 @@ export const confluenceSearchTool: InternalToolConfig< output: { ts: new Date().toISOString(), results: data.results || [], + totalSize: data.totalSize ?? null, + nextCursor: data.nextCursor ?? null, }, } }, @@ -104,5 +125,15 @@ export const confluenceSearchTool: InternalToolConfig< properties: SEARCH_RESULT_ITEM_PROPERTIES, }, }, + totalSize: { + type: 'number', + description: 'Total number of matching results', + optional: true, + }, + nextCursor: { + type: 'string', + description: 'Cursor for fetching the next page of results', + optional: true, + }, }, } diff --git a/apps/sim/tools/confluence/search_in_space.ts b/apps/sim/tools/confluence/search_in_space.ts index 06b3487b430..1a1646f1229 100644 --- a/apps/sim/tools/confluence/search_in_space.ts +++ b/apps/sim/tools/confluence/search_in_space.ts @@ -8,6 +8,7 @@ export interface ConfluenceSearchInSpaceParams { query?: string contentType?: string limit?: number + cursor?: string cloudId?: string } @@ -26,6 +27,7 @@ export interface ConfluenceSearchInSpaceResponse { excerpt: string lastModified: string | null }> + nextCursor: string | null } } @@ -81,6 +83,12 @@ export const confluenceSearchInSpaceTool: InternalToolConfig< visibility: 'user-or-llm', description: 'Maximum number of results to return (default: 25, max: 250)', }, + cursor: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: 'Pagination cursor from a previous response (nextCursor)', + }, cloudId: { type: 'string', required: false, @@ -98,6 +106,7 @@ export const confluenceSearchInSpaceTool: InternalToolConfig< query: params.query, contentType: params.contentType, limit: params.limit ? Number(params.limit) : 25, + cursor: params.cursor?.trim() || undefined, cloudId: params.cloudId, }), }, @@ -111,6 +120,7 @@ export const confluenceSearchInSpaceTool: InternalToolConfig< spaceKey: data.spaceKey ?? '', totalSize: data.totalSize ?? 0, results: data.results ?? [], + nextCursor: data.nextCursor ?? null, }, } }, @@ -133,5 +143,10 @@ export const confluenceSearchInSpaceTool: InternalToolConfig< properties: SEARCH_RESULT_ITEM_PROPERTIES, }, }, + nextCursor: { + type: 'string', + description: 'Cursor for fetching the next page of results', + optional: true, + }, }, } diff --git a/apps/sim/tools/confluence/types.ts b/apps/sim/tools/confluence/types.ts index 2e9e092a1d0..7871dde1fd5 100644 --- a/apps/sim/tools/confluence/types.ts +++ b/apps/sim/tools/confluence/types.ts @@ -78,6 +78,11 @@ export const PAGE_ITEM_PROPERTIES = { optional: true, }, authorId: { type: 'string', description: 'Account ID of the page author' }, + ownerId: { + type: 'string', + description: 'Account ID of the current page owner', + optional: true, + }, createdAt: { type: 'string', description: 'ISO 8601 timestamp when the page was created' }, version: { type: 'object', @@ -126,10 +131,16 @@ export const SPACE_ITEM_PROPERTIES = { homepageId: { type: 'string', description: 'ID of the space homepage', optional: true }, description: { type: 'object', - description: 'Space description', + description: 'Space description (plain text)', properties: SPACE_DESCRIPTION_OUTPUT_PROPERTIES, optional: true, }, + spaceOwnerId: { + type: 'string', + description: 'Account ID of the space owner', + optional: true, + }, + webUrl: { type: 'string', description: 'URL to view the space in Confluence', optional: true }, } as const satisfies Record /** @@ -234,18 +245,6 @@ export const COMMENT_OUTPUT: OutputProperty = { properties: COMMENT_ITEM_PROPERTIES, } -/** - * Comments array output definition for list endpoints. - */ -export const COMMENTS_OUTPUT: OutputProperty = { - type: 'array', - description: 'Array of Confluence comments', - items: { - type: 'object', - properties: COMMENT_ITEM_PROPERTIES, - }, -} - /** * Attachment item properties from Confluence API v2. * Based on GET /wiki/api/v2/attachments response structure. @@ -273,6 +272,16 @@ export const ATTACHMENT_ITEM_PROPERTIES = { optional: true, }, comment: { type: 'string', description: 'Comment/description of the attachment', optional: true }, + createdAt: { + type: 'string', + description: 'ISO 8601 timestamp when the attachment was created', + optional: true, + }, + fileId: { + type: 'string', + description: 'Media file ID of the attachment', + optional: true, + }, version: { type: 'object', description: 'Attachment version information', @@ -312,6 +321,19 @@ export const LABEL_ITEM_PROPERTIES = { prefix: { type: 'string', description: 'Label prefix/type (e.g., global, my, team)' }, } as const satisfies Record +/** + * Labels returned inline on a page or blog post (first 50, via include-labels). + */ +export const CONTENT_LABELS_OUTPUT: OutputProperty = { + type: 'array', + description: 'Labels on the content (first 50)', + items: { + type: 'object', + properties: LABEL_ITEM_PROPERTIES, + }, + optional: true, +} + /** * Complete label object output definition. */ @@ -427,6 +449,10 @@ export interface ConfluenceRetrieveResponse extends ToolResponse { pageId: string content: string title: string + ownerId?: string | null + lastOwnerId?: string | null + parentType?: string | null + labels?: Array<{ id: string; name: string; prefix: string }> } } diff --git a/apps/sim/tools/confluence/utils.ts b/apps/sim/tools/confluence/utils.ts index b18263cbcc4..4753708eaab 100644 --- a/apps/sim/tools/confluence/utils.ts +++ b/apps/sim/tools/confluence/utils.ts @@ -91,6 +91,10 @@ export function transformPageData(data: any) { url: data._links?.webui ?? null, body: data.body ?? null, version: data.version ?? null, + ownerId: data.ownerId ?? null, + lastOwnerId: data.lastOwnerId ?? null, + parentType: data.parentType ?? null, + labels: data.labels ?? [], }, } } diff --git a/apps/sim/tools/generated/tool-metadata.ts b/apps/sim/tools/generated/tool-metadata.ts index fabbf8bc11b..bb921d14ec6 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: , , , ,