diff --git a/apps/docs/components/ui/icon-mapping.ts b/apps/docs/components/ui/icon-mapping.ts index 032f0756383..53fa325a28d 100644 --- a/apps/docs/components/ui/icon-mapping.ts +++ b/apps/docs/components/ui/icon-mapping.ts @@ -482,6 +482,7 @@ export const blockTypeToIconMap: Record = { onedrive: MicrosoftOneDriveIcon, onepassword: OnePasswordIcon, openai: OpenAIIcon, + oracle_epm_enterprise_data_management: NetSuiteIcon, outlook: OutlookIcon, pagerduty: PagerDutyIcon, parallel_ai: ParallelIcon, diff --git a/apps/docs/content/docs/integrations/meta.json b/apps/docs/content/docs/integrations/meta.json index 69d1dac6bfc..5ea43866c78 100644 --- a/apps/docs/content/docs/integrations/meta.json +++ b/apps/docs/content/docs/integrations/meta.json @@ -188,6 +188,7 @@ "onedrive", "onepassword", "openai", + "oracle_epm_enterprise_data_management", "outlook", "pagerduty", "parallel_ai", diff --git a/apps/docs/content/docs/integrations/oracle_epm_enterprise_data_management.mdx b/apps/docs/content/docs/integrations/oracle_epm_enterprise_data_management.mdx new file mode 100644 index 00000000000..e2dbd16f229 --- /dev/null +++ b/apps/docs/content/docs/integrations/oracle_epm_enterprise_data_management.mdx @@ -0,0 +1,1842 @@ +--- +title: Oracle EPM Enterprise Data Management +description: Manage dimensions, viewpoints, nodes, governed requests, validation, and data transfers +--- + +import { BlockInfoCard } from "@/components/ui/block-info-card" + + + +## Usage Instructions + +Use a reusable Oracle EPM service account to discover enterprise master data, browse bounded hierarchies, prepare and transition governed requests, inspect subscription-generated request lineage, run validation, and import or export files. Node changes flow through request attachments. Subscription and validation-definition administration are not included. Upload-to-import request workflows are supported; generated attachment jobs return opaque results because Oracle does not document the generated attachment ID needed to chain an import automatically. Oracle job COMPLETED is not a guarantee of business success: inspect job results and validation reports. + + + +## Actions + +### Oracle EDM List Applications + +List applications visible to the EDM credential, with bounded documented metadata. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `oauthCredential` | string | Yes | Reusable Oracle EPM service-account credential | +| `applicationId` | string | No | Application UUID | +| `permission` | string | No | One application permission: owner, datamanager, participant, or participant_with_write. Allowed values: owner, datamanager, participant, participant_with_write. | +| `maxResults` | number | No | Maximum projected items \(1-500; default 200\). This is a local result cap, not provider pagination. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `applications` | json | Bounded application collection | +| ↳ `items` | array | Bounded application collection | +| ↳ `id` | string | Resource UUID | +| ↳ `name` | string | Resource name | +| ↳ `description` | string | Resource description | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `objectStatus` | string | Resource object status | +| ↳ `timeCreated` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `timeModified` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `permittedActions` | array | Actions permitted for the credential | +| ↳ `primaryView` | json | Resource reference \(id, name, description, links\) | +| ↳ `id` | string | Resource UUID | +| ↳ `name` | string | Resource name | +| ↳ `description` | string | Resource description | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `supportedDirection` | string | Supported import/export direction | +| ↳ `dimensions` | array | Documented application dimensions | +| ↳ `id` | string | Resource UUID | +| ↳ `name` | string | Resource name | +| ↳ `description` | string | Resource description | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `objectStatus` | string | Resource object status | +| ↳ `timeCreated` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `timeModified` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `permittedActions` | array | Actions permitted for the credential | +| ↳ `dimensionType` | string | Dimension type | +| ↳ `connected` | boolean | Whether the dimension is connected | +| ↳ `externalName` | string | External dimension name | +| ↳ `isBound` | boolean | Whether the dimension is bound | +| ↳ `supportsMapping` | boolean | Whether mappings are supported | +| ↳ `supportsMappingExport` | boolean | Whether mapping export is supported | +| ↳ `supportsExtracts` | boolean | Whether extracts are supported | +| ↳ `supportedDirection` | string | Supported import/export direction | +| ↳ `bindings` | array | Dimension bindings and their view/viewpoint references | +| ↳ `id` | string | Resource UUID | +| ↳ `name` | string | Resource name | +| ↳ `description` | string | Resource description | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `bindingType` | string | Dimension binding type | +| ↳ `viewpoint` | json | Resource reference \(id, name, description, links\) | +| ↳ `id` | string | Resource UUID | +| ↳ `name` | string | Resource name | +| ↳ `description` | string | Resource description | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `view` | json | Resource reference \(id, name, description, links\) | +| ↳ `id` | string | Resource UUID | +| ↳ `name` | string | Resource name | +| ↳ `description` | string | Resource description | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `count` | number | Number of returned items | +| ↳ `truncated` | boolean | More items exist or the provider indicated additional results | + +### Oracle EDM List Dimensions + +List dimensions and bindings from a selected application's documented metadata. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `oauthCredential` | string | Yes | Reusable Oracle EPM service-account credential | +| `applicationId` | string | Yes | Application UUID | +| `maxResults` | number | No | Maximum projected items \(1-500; default 200\). This is a local result cap, not provider pagination. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `applicationId` | string | Selected application UUID | +| `dimensions` | json | Bounded dimension collection | +| ↳ `items` | array | Bounded dimension collection | +| ↳ `id` | string | Resource UUID | +| ↳ `name` | string | Resource name | +| ↳ `description` | string | Resource description | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `objectStatus` | string | Resource object status | +| ↳ `timeCreated` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `timeModified` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `permittedActions` | array | Actions permitted for the credential | +| ↳ `dimensionType` | string | Dimension type | +| ↳ `connected` | boolean | Whether the dimension is connected | +| ↳ `externalName` | string | External dimension name | +| ↳ `isBound` | boolean | Whether the dimension is bound | +| ↳ `supportsMapping` | boolean | Whether mappings are supported | +| ↳ `supportsMappingExport` | boolean | Whether mapping export is supported | +| ↳ `supportsExtracts` | boolean | Whether extracts are supported | +| ↳ `supportedDirection` | string | Supported import/export direction | +| ↳ `bindings` | array | Dimension bindings and their view/viewpoint references | +| ↳ `id` | string | Resource UUID | +| ↳ `name` | string | Resource name | +| ↳ `description` | string | Resource description | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `bindingType` | string | Dimension binding type | +| ↳ `viewpoint` | json | Resource reference \(id, name, description, links\) | +| ↳ `id` | string | Resource UUID | +| ↳ `name` | string | Resource name | +| ↳ `description` | string | Resource description | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `view` | json | Resource reference \(id, name, description, links\) | +| ↳ `id` | string | Resource UUID | +| ↳ `name` | string | Resource name | +| ↳ `description` | string | Resource description | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `count` | number | Number of returned items | +| ↳ `truncated` | boolean | More items exist or the provider indicated additional results | + +### Oracle EDM List Views + +List EDM views, optionally filtered by one dimension or object status. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `oauthCredential` | string | Yes | Reusable Oracle EPM service-account credential | +| `dimensionId` | string | No | Dimension UUID | +| `objectStatus` | string | No | One view status filter. Allowed values: DRAFT, ACTIVE, ARCHIVED. | +| `maxResults` | number | No | Maximum projected items \(1-500; default 200\). This is a local result cap, not provider pagination. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `views` | json | Bounded view collection | +| ↳ `items` | array | Bounded view collection | +| ↳ `id` | string | Resource UUID | +| ↳ `name` | string | Resource name | +| ↳ `description` | string | Resource description | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `objectStatus` | string | Resource object status | +| ↳ `timeCreated` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `timeModified` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `permittedActions` | array | Actions permitted for the credential | +| ↳ `master` | boolean | Whether this is a master view | +| ↳ `count` | number | Number of returned items | +| ↳ `truncated` | boolean | More items exist or the provider indicated additional results | + +### Oracle EDM List Viewpoints + +List viewpoints in a view, optionally filtered by application or dimension. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `oauthCredential` | string | Yes | Reusable Oracle EPM service-account credential | +| `viewId` | string | Yes | View UUID | +| `dimensionId` | string | No | Dimension UUID | +| `applicationId` | string | No | Application UUID | +| `maxResults` | number | No | Maximum projected items \(1-500; default 200\). This is a local result cap, not provider pagination. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `viewpoints` | json | Bounded viewpoint collection | +| ↳ `items` | array | Bounded viewpoint collection | +| ↳ `id` | string | Resource UUID | +| ↳ `name` | string | Resource name | +| ↳ `description` | string | Resource description | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `objectStatus` | string | Resource object status | +| ↳ `timeCreated` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `timeModified` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `permittedActions` | array | Actions permitted for the credential | +| ↳ `label` | string | Viewpoint label | +| ↳ `hasHierarchy` | boolean | Whether the viewpoint has a hierarchy | +| ↳ `scope` | string | Viewpoint scope | +| ↳ `bindingType` | string | Viewpoint binding type | +| ↳ `viewId` | string | Containing view UUID | +| ↳ `viewName` | string | Containing view name | +| ↳ `applicationLink` | json | Resource reference \(id, name, description, links\) | +| ↳ `id` | string | Resource UUID | +| ↳ `name` | string | Resource name | +| ↳ `description` | string | Resource description | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `dimensionLink` | json | Resource reference \(id, name, description, links\) | +| ↳ `id` | string | Resource UUID | +| ↳ `name` | string | Resource name | +| ↳ `description` | string | Resource description | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `nodeSetLink` | json | Resource reference \(id, name, description, links\) | +| ↳ `id` | string | Resource UUID | +| ↳ `name` | string | Resource name | +| ↳ `description` | string | Resource description | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `hierarchySetLink` | json | Resource reference \(id, name, description, links\) | +| ↳ `id` | string | Resource UUID | +| ↳ `name` | string | Resource name | +| ↳ `description` | string | Resource description | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `nodeTypeAssignments` | array | Node-type assignments, not administration objects | +| ↳ `nodeTypeLink` | json | Resource reference \(id, name, description, links\) | +| ↳ `id` | string | Resource UUID | +| ↳ `name` | string | Resource name | +| ↳ `description` | string | Resource description | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `relatedViewpoints` | array | Related viewpoints | +| ↳ `id` | string | Resource UUID | +| ↳ `name` | string | Resource name | +| ↳ `description` | string | Resource description | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `count` | number | Number of returned items | +| ↳ `truncated` | boolean | More items exist or the provider indicated additional results | + +### Oracle EDM List Node Types + +List node-type references assigned to a viewpoint; this is not an administration API. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `oauthCredential` | string | Yes | Reusable Oracle EPM service-account credential | +| `viewId` | string | Yes | View UUID | +| `viewpointId` | string | Yes | Viewpoint UUID | +| `maxResults` | number | No | Maximum projected items \(1-500; default 200\). This is a local result cap, not provider pagination. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `nodeTypes` | json | Bounded viewpoint-assigned node-type references | +| ↳ `items` | array | Bounded viewpoint-assigned node-type references | +| ↳ `id` | string | Resource UUID | +| ↳ `name` | string | Resource name | +| ↳ `description` | string | Resource description | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `viewpointId` | string | Viewpoint containing this assignment | +| ↳ `relatedViewpoints` | array | Related viewpoint references | +| ↳ `id` | string | Resource UUID | +| ↳ `name` | string | Resource name | +| ↳ `description` | string | Resource description | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `count` | number | Number of returned items | +| ↳ `truncated` | boolean | More items exist or the provider indicated additional results | + +### Oracle EDM Get Node Type + +Get a node-type reference and related viewpoints from a viewpoint assignment. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `oauthCredential` | string | Yes | Reusable Oracle EPM service-account credential | +| `viewId` | string | Yes | View UUID | +| `viewpointId` | string | Yes | Viewpoint UUID | +| `nodeTypeId` | string | Yes | Node-type UUID assigned to the selected viewpoint | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `nodeType` | json | Selected node-type assignment reference | +| ↳ `id` | string | Resource UUID | +| ↳ `name` | string | Resource name | +| ↳ `description` | string | Resource description | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `viewpointId` | string | Viewpoint containing this assignment | +| ↳ `relatedViewpoints` | array | Related viewpoint references | +| ↳ `id` | string | Resource UUID | +| ↳ `name` | string | Resource name | +| ↳ `description` | string | Resource description | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | + +### Oracle EDM List Nodes + +List one bounded flat page of all, top, child, or request-context nodes. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `oauthCredential` | string | Yes | Reusable Oracle EPM service-account credential | +| `viewId` | string | Yes | View UUID | +| `viewpointId` | string | Yes | Viewpoint UUID | +| `scope` | string | No | Node listing scope \(default top\); children requires parentNodeId, request requires requestId. Allowed values: top, all, children, request. | +| `parentNodeId` | string | No | Parent node UUID for children scope only | +| `requestId` | string | No | Request UUID; for node listing it requires request scope | +| `expand` | string | No | One documented node expansion. Allowed values: propertyValues::none, propertyValues::all, propertyValues::columnVisible, propertyValues::locationVisible, requestItem.validations, bestLocationRtl. | +| `limit` | number | No | Node page size \(1-100; default 50\) | +| `offset` | number | No | Node page offset \(0-1000000; default 0\) | +| `fromId` | string | No | Nodes after this node UUID; append * to include it, or use first. Cannot combine with toId. | +| `toId` | string | No | Nodes before this node UUID; append * to include it, or use last. Cannot combine with fromId. | +| `orderBy` | string | No | Hierarchy-set node order. Allowed values: hsConfig:asc, hsConfig:desc. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `nodes` | array | Bounded flat node page | +| ↳ `id` | string | Node UUID | +| ↳ `name` | string | Node name | +| ↳ `description` | string | Node description | +| ↳ `nodeType` | json | Resource reference \(id, name, description, links\) | +| ↳ `id` | string | Resource UUID | +| ↳ `name` | string | Resource name | +| ↳ `description` | string | Resource description | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `hasChildren` | boolean | Whether the node has children | +| ↳ `location` | string | Provider-returned node location | +| ↳ `path` | array | Provider-returned path references | +| ↳ `id` | string | Resource UUID | +| ↳ `name` | string | Resource name | +| ↳ `description` | string | Resource description | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `relationshipId` | string | Relationship UUID | +| ↳ `parentNodeId` | string | Parent node UUID | +| ↳ `parentName` | string | Parent node name | +| ↳ `parentNodeTypeId` | string | Parent node-type UUID | +| ↳ `childCount` | number | Number of children | +| ↳ `locationCount` | number | Number of node locations | +| ↳ `previousLocation` | string | Previous location | +| ↳ `nextLocation` | string | Next location | +| ↳ `propertyCount` | number | Number of properties | +| ↳ `propertyValues` | array | Documented node and relationship property values | +| ↳ `value` | string | Property value | +| ↳ `displayValue` | string | Display value | +| ↳ `propertyName` | string | Property name | +| ↳ `propertyId` | string | Property UUID | +| ↳ `origin` | string | Value origin | +| ↳ `propertyLevel` | string | Node or relationship level | +| ↳ `labels` | array | Property labels | +| ↳ `readOnly` | boolean | Whether the property is read-only | +| ↳ `validated` | boolean | Whether the property was validated | +| ↳ `requestItem` | json | Request item and its validation findings | +| ↳ `id` | string | Request item UUID | +| ↳ `name` | string | Item name | +| ↳ `description` | string | Item description | +| ↳ `actionCount` | number | Number of actions | +| ↳ `nodeTypeName` | string | Node-type name | +| ↳ `nodeTypeId` | string | Node-type UUID | +| ↳ `applicationName` | string | Application name | +| ↳ `actionSummary` | string | Action summary | +| ↳ `validations` | array | Validation findings | +| ↳ `message` | string | Validation message | +| ↳ `code` | string | Validation code | +| ↳ `type` | string | Validation type | +| ↳ `severity` | string | Validation severity | +| ↳ `userCanResolve` | boolean | Whether the current user can resolve this issue | +| ↳ `timeCreated` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| `count` | number | Number of returned nodes | +| `offset` | number | Requested node offset | +| `hasMore` | boolean | Whether additional nodes may exist | +| `nextOffset` | number | Next node offset, if additional nodes may exist | +| `truncated` | boolean | Whether traversal or page output was bounded | + +### Oracle EDM Get Node + +Get an EDM node and its documented properties and request validation information. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `oauthCredential` | string | Yes | Reusable Oracle EPM service-account credential | +| `viewId` | string | Yes | View UUID | +| `viewpointId` | string | Yes | Viewpoint UUID | +| `nodeId` | string | Yes | Node UUID | +| `requestId` | string | No | Request UUID; for node listing it requires request scope | +| `expand` | string | No | One documented node expansion. Allowed values: propertyValues::none, propertyValues::all, propertyValues::columnVisible, propertyValues::locationVisible, requestItem.validations, bestLocationRtl. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `node` | json | Node properties and documented request information | +| ↳ `id` | string | Node UUID | +| ↳ `name` | string | Node name | +| ↳ `description` | string | Node description | +| ↳ `nodeType` | json | Resource reference \(id, name, description, links\) | +| ↳ `id` | string | Resource UUID | +| ↳ `name` | string | Resource name | +| ↳ `description` | string | Resource description | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `hasChildren` | boolean | Whether the node has children | +| ↳ `location` | string | Provider-returned node location | +| ↳ `path` | array | Provider-returned path references | +| ↳ `id` | string | Resource UUID | +| ↳ `name` | string | Resource name | +| ↳ `description` | string | Resource description | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `relationshipId` | string | Relationship UUID | +| ↳ `parentNodeId` | string | Parent node UUID | +| ↳ `parentName` | string | Parent node name | +| ↳ `parentNodeTypeId` | string | Parent node-type UUID | +| ↳ `childCount` | number | Number of children | +| ↳ `locationCount` | number | Number of node locations | +| ↳ `previousLocation` | string | Previous location | +| ↳ `nextLocation` | string | Next location | +| ↳ `propertyCount` | number | Number of properties | +| ↳ `propertyValues` | array | Documented node and relationship property values | +| ↳ `value` | string | Property value | +| ↳ `displayValue` | string | Display value | +| ↳ `propertyName` | string | Property name | +| ↳ `propertyId` | string | Property UUID | +| ↳ `origin` | string | Value origin | +| ↳ `propertyLevel` | string | Node or relationship level | +| ↳ `labels` | array | Property labels | +| ↳ `readOnly` | boolean | Whether the property is read-only | +| ↳ `validated` | boolean | Whether the property was validated | +| ↳ `requestItem` | json | Request item and its validation findings | +| ↳ `id` | string | Request item UUID | +| ↳ `name` | string | Item name | +| ↳ `description` | string | Item description | +| ↳ `actionCount` | number | Number of actions | +| ↳ `nodeTypeName` | string | Node-type name | +| ↳ `nodeTypeId` | string | Node-type UUID | +| ↳ `applicationName` | string | Application name | +| ↳ `actionSummary` | string | Action summary | +| ↳ `validations` | array | Validation findings | +| ↳ `message` | string | Validation message | +| ↳ `code` | string | Validation code | +| ↳ `type` | string | Validation type | +| ↳ `severity` | string | Validation severity | +| ↳ `userCanResolve` | boolean | Whether the current user can resolve this issue | +| ↳ `timeCreated` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | + +### Oracle EDM Get Node At Location + +Get a node at its comma-separated ancestor/node UUID location. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `oauthCredential` | string | Yes | Reusable Oracle EPM service-account credential | +| `viewId` | string | Yes | View UUID | +| `viewpointId` | string | Yes | Viewpoint UUID | +| `nodeId` | string | Yes | Node UUID | +| `location` | string | Yes | Comma-separated ancestor/node UUIDs, root first \(maximum 255 characters\) | +| `requestId` | string | No | Request UUID; for node listing it requires request scope | +| `expand` | string | No | One documented node expansion. Allowed values: propertyValues::none, propertyValues::all, propertyValues::columnVisible, propertyValues::locationVisible, requestItem.validations, bestLocationRtl. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `node` | json | Node properties and documented request information | +| ↳ `id` | string | Node UUID | +| ↳ `name` | string | Node name | +| ↳ `description` | string | Node description | +| ↳ `nodeType` | json | Resource reference \(id, name, description, links\) | +| ↳ `id` | string | Resource UUID | +| ↳ `name` | string | Resource name | +| ↳ `description` | string | Resource description | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `hasChildren` | boolean | Whether the node has children | +| ↳ `location` | string | Provider-returned node location | +| ↳ `path` | array | Provider-returned path references | +| ↳ `id` | string | Resource UUID | +| ↳ `name` | string | Resource name | +| ↳ `description` | string | Resource description | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `relationshipId` | string | Relationship UUID | +| ↳ `parentNodeId` | string | Parent node UUID | +| ↳ `parentName` | string | Parent node name | +| ↳ `parentNodeTypeId` | string | Parent node-type UUID | +| ↳ `childCount` | number | Number of children | +| ↳ `locationCount` | number | Number of node locations | +| ↳ `previousLocation` | string | Previous location | +| ↳ `nextLocation` | string | Next location | +| ↳ `propertyCount` | number | Number of properties | +| ↳ `propertyValues` | array | Documented node and relationship property values | +| ↳ `value` | string | Property value | +| ↳ `displayValue` | string | Display value | +| ↳ `propertyName` | string | Property name | +| ↳ `propertyId` | string | Property UUID | +| ↳ `origin` | string | Value origin | +| ↳ `propertyLevel` | string | Node or relationship level | +| ↳ `labels` | array | Property labels | +| ↳ `readOnly` | boolean | Whether the property is read-only | +| ↳ `validated` | boolean | Whether the property was validated | +| ↳ `requestItem` | json | Request item and its validation findings | +| ↳ `id` | string | Request item UUID | +| ↳ `name` | string | Item name | +| ↳ `description` | string | Item description | +| ↳ `actionCount` | number | Number of actions | +| ↳ `nodeTypeName` | string | Node-type name | +| ↳ `nodeTypeId` | string | Node-type UUID | +| ↳ `applicationName` | string | Application name | +| ↳ `actionSummary` | string | Action summary | +| ↳ `validations` | array | Validation findings | +| ↳ `message` | string | Validation message | +| ↳ `code` | string | Validation code | +| ↳ `type` | string | Validation type | +| ↳ `severity` | string | Validation severity | +| ↳ `userCanResolve` | boolean | Whether the current user can resolve this issue | +| ↳ `timeCreated` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | + +### Oracle EDM Browse Hierarchy + +Browse a bounded flat hierarchy preserving shared-node occurrences, with a 5 MiB node-output cap and remaining-frontier diagnostics. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `oauthCredential` | string | Yes | Reusable Oracle EPM service-account credential | +| `viewId` | string | Yes | View UUID | +| `viewpointId` | string | Yes | Viewpoint UUID | +| `maxDepth` | number | No | Maximum traversal depth \(0-3; default 2\); roots have depth zero | +| `maxNodes` | number | No | Maximum hierarchy occurrences \(1-500; default 200\) | +| `pageSize` | number | No | Hierarchy provider page size \(1-100; default 50\) | +| `maxRequests` | number | No | Maximum hierarchy provider requests \(1-100; default 50\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `nodes` | array | Flat traversal occurrences; traversalPath is the visited path, distinct from provider path/location | +| ↳ `id` | string | Node UUID | +| ↳ `name` | string | Node name | +| ↳ `description` | string | Node description | +| ↳ `nodeType` | json | Resource reference \(id, name, description, links\) | +| ↳ `id` | string | Resource UUID | +| ↳ `name` | string | Resource name | +| ↳ `description` | string | Resource description | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `hasChildren` | boolean | Whether the node has children | +| ↳ `location` | string | Provider-returned node location | +| ↳ `path` | array | Provider-returned path references | +| ↳ `id` | string | Resource UUID | +| ↳ `name` | string | Resource name | +| ↳ `description` | string | Resource description | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `relationshipId` | string | Relationship UUID | +| ↳ `parentNodeId` | string | Parent node UUID | +| ↳ `parentName` | string | Parent node name | +| ↳ `parentNodeTypeId` | string | Parent node-type UUID | +| ↳ `childCount` | number | Number of children | +| ↳ `locationCount` | number | Number of node locations | +| ↳ `previousLocation` | string | Previous location | +| ↳ `nextLocation` | string | Next location | +| ↳ `propertyCount` | number | Number of properties | +| ↳ `propertyValues` | array | Documented node and relationship property values | +| ↳ `value` | string | Property value | +| ↳ `displayValue` | string | Display value | +| ↳ `propertyName` | string | Property name | +| ↳ `propertyId` | string | Property UUID | +| ↳ `origin` | string | Value origin | +| ↳ `propertyLevel` | string | Node or relationship level | +| ↳ `labels` | array | Property labels | +| ↳ `readOnly` | boolean | Whether the property is read-only | +| ↳ `validated` | boolean | Whether the property was validated | +| ↳ `requestItem` | json | Request item and its validation findings | +| ↳ `id` | string | Request item UUID | +| ↳ `name` | string | Item name | +| ↳ `description` | string | Item description | +| ↳ `actionCount` | number | Number of actions | +| ↳ `nodeTypeName` | string | Node-type name | +| ↳ `nodeTypeId` | string | Node-type UUID | +| ↳ `applicationName` | string | Application name | +| ↳ `actionSummary` | string | Action summary | +| ↳ `validations` | array | Validation findings | +| ↳ `message` | string | Validation message | +| ↳ `code` | string | Validation code | +| ↳ `type` | string | Validation type | +| ↳ `severity` | string | Validation severity | +| ↳ `userCanResolve` | boolean | Whether the current user can resolve this issue | +| ↳ `timeCreated` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `depth` | number | Traversal depth, with roots at zero | +| ↳ `traversalPath` | array | Node UUIDs along this traversal occurrence | +| ↳ `traversalParentLocation` | string | Traversal parent UUID path; null for roots | +| `count` | number | Number of returned nodes | +| `providerRequests` | number | Provider requests consumed by this traversal | +| `truncated` | boolean | Whether traversal or page output was bounded | +| `truncationReasons` | array | Reached limits or detected repeated/cyclic traversal | +| `remainingFrontier` | array | Unvisited traversal frontier, including depth and page offset | +| ↳ `parentNodeId` | string | Parent node UUID; null for roots | +| ↳ `parentLocation` | string | Traversal parent location; null for roots | +| ↳ `path` | array | Traversal ancestor node UUIDs | +| ↳ `depth` | number | Depth of the next nodes | +| ↳ `offset` | number | Unvisited page offset | + +### Oracle EDM Create Request + +Create an interactive EDM request in a selected view. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `oauthCredential` | string | Yes | Reusable Oracle EPM service-account credential | +| `viewId` | string | Yes | View UUID | +| `title` | string | No | Request title | +| `description` | string | No | Request description | +| `notes` | string | No | Request notes | +| `priority` | string | No | Priority for a new request. Allowed values: NONE, LOW, MEDIUM, HIGH. | +| `timeLabelName` | string | No | Time label name; request queries support one value | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `request` | json | Request workflow, ownership, validation counts, and source relationships | +| ↳ `id` | string | Request UUID | +| ↳ `title` | string | Request title | +| ↳ `description` | string | Request description | +| ↳ `priority` | string | Request priority | +| ↳ `origin` | string | Request origin | +| ↳ `requestType` | string | Request type, including subscription-generated requests | +| ↳ `status` | string | Request status | +| ↳ `stage` | string | Workflow stage | +| ↳ `requestNumber` | number | Request number | +| ↳ `timeCreated` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `timeModified` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `timeSubmitted` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `blockedUntil` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `notes` | string | Request notes | +| ↳ `itemCount` | number | Number of items | +| ↳ `commentCount` | number | Number of comments | +| ↳ `validationErrorCount` | number | Validation error count | +| ↳ `attachmentCount` | number | Number of attachments | +| ↳ `actionCount` | number | Number of actions | +| ↳ `commentRequiredOnTransition` | boolean | Whether the next transition requires a comment | +| ↳ `validTransitionActions` | array | Currently valid workflow transitions | +| ↳ `viewId` | string | View UUID | +| ↳ `viewName` | string | View name | +| ↳ `createdByUser` | json | User identity, excluding authentication and preference fields | +| ↳ `id` | string | User UUID | +| ↳ `userName` | string | User name | +| ↳ `fullName` | string | Full name | +| ↳ `modifiedByUser` | json | User identity, excluding authentication and preference fields | +| ↳ `id` | string | User UUID | +| ↳ `userName` | string | User name | +| ↳ `fullName` | string | Full name | +| ↳ `submittedByUser` | json | User identity, excluding authentication and preference fields | +| ↳ `id` | string | User UUID | +| ↳ `userName` | string | User name | +| ↳ `fullName` | string | Full name | +| ↳ `assignedToUser` | json | User identity, excluding authentication and preference fields | +| ↳ `id` | string | User UUID | +| ↳ `userName` | string | User name | +| ↳ `fullName` | string | Full name | +| ↳ `owner` | json | User identity, excluding authentication and preference fields | +| ↳ `id` | string | User UUID | +| ↳ `userName` | string | User name | +| ↳ `fullName` | string | Full name | +| ↳ `sourceRequest` | json | Resource reference \(id, name, description, links\) | +| ↳ `id` | string | Resource UUID | +| ↳ `name` | string | Resource name | +| ↳ `description` | string | Resource description | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `subscriptions` | array | Associated subscription references | +| ↳ `id` | string | Resource UUID | +| ↳ `name` | string | Resource name | +| ↳ `description` | string | Resource description | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `autoSubmitted` | boolean | Whether the request was automatically submitted | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | + +### Oracle EDM Get Request + +Get request status, ownership, valid transitions, and subscription source relationships. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `oauthCredential` | string | Yes | Reusable Oracle EPM service-account credential | +| `requestId` | string | Yes | Request UUID; for node listing it requires request scope | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `request` | json | Request workflow, ownership, validation counts, and source relationships | +| ↳ `id` | string | Request UUID | +| ↳ `title` | string | Request title | +| ↳ `description` | string | Request description | +| ↳ `priority` | string | Request priority | +| ↳ `origin` | string | Request origin | +| ↳ `requestType` | string | Request type, including subscription-generated requests | +| ↳ `status` | string | Request status | +| ↳ `stage` | string | Workflow stage | +| ↳ `requestNumber` | number | Request number | +| ↳ `timeCreated` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `timeModified` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `timeSubmitted` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `blockedUntil` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `notes` | string | Request notes | +| ↳ `itemCount` | number | Number of items | +| ↳ `commentCount` | number | Number of comments | +| ↳ `validationErrorCount` | number | Validation error count | +| ↳ `attachmentCount` | number | Number of attachments | +| ↳ `actionCount` | number | Number of actions | +| ↳ `commentRequiredOnTransition` | boolean | Whether the next transition requires a comment | +| ↳ `validTransitionActions` | array | Currently valid workflow transitions | +| ↳ `viewId` | string | View UUID | +| ↳ `viewName` | string | View name | +| ↳ `createdByUser` | json | User identity, excluding authentication and preference fields | +| ↳ `id` | string | User UUID | +| ↳ `userName` | string | User name | +| ↳ `fullName` | string | Full name | +| ↳ `modifiedByUser` | json | User identity, excluding authentication and preference fields | +| ↳ `id` | string | User UUID | +| ↳ `userName` | string | User name | +| ↳ `fullName` | string | Full name | +| ↳ `submittedByUser` | json | User identity, excluding authentication and preference fields | +| ↳ `id` | string | User UUID | +| ↳ `userName` | string | User name | +| ↳ `fullName` | string | Full name | +| ↳ `assignedToUser` | json | User identity, excluding authentication and preference fields | +| ↳ `id` | string | User UUID | +| ↳ `userName` | string | User name | +| ↳ `fullName` | string | Full name | +| ↳ `owner` | json | User identity, excluding authentication and preference fields | +| ↳ `id` | string | User UUID | +| ↳ `userName` | string | User name | +| ↳ `fullName` | string | Full name | +| ↳ `sourceRequest` | json | Resource reference \(id, name, description, links\) | +| ↳ `id` | string | Resource UUID | +| ↳ `name` | string | Resource name | +| ↳ `description` | string | Resource description | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `subscriptions` | array | Associated subscription references | +| ↳ `id` | string | Resource UUID | +| ↳ `name` | string | Resource name | +| ↳ `description` | string | Resource description | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `autoSubmitted` | boolean | Whether the request was automatically submitted | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | + +### Oracle EDM Query Requests + +Query requests using one value per filter and a maximum 90-day time window. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `oauthCredential` | string | Yes | Reusable Oracle EPM service-account credential | +| `lastDays` | number | No | Previous days to query \(1-90; default 30 when no explicit dates are supplied\) | +| `fromDate` | number | No | Inclusive start in epoch seconds; provide with toDate, without lastDays, within 90 days | +| `toDate` | number | No | End in epoch seconds; provide with fromDate, without lastDays, within 90 days | +| `myActivity` | string | No | One activity filter. Allowed values: Assigned, Collaborated, Submitted, Invited, Contributed, Managed. | +| `owner` | string | No | One request owner name | +| `priority` | string | No | One request priority filter. Allowed values: None, Low, Medium, High. | +| `requestNumber` | number | No | Positive Oracle request number, not request UUID | +| `requestType` | string | No | One request-type filter. Allowed values: Interactive, Subscription, Import, Consolidation. | +| `stage` | string | No | One request-stage query filter, using Oracle query spelling. Allowed values: Submit, Approved, Commit, Closed. | +| `status` | string | No | One request-status query filter. Allowed values: Draft, In Flight, Recalled, Pushed Back, Completed, Rejected, Blocked, Consolidated. | +| `timeLabelName` | string | No | Time label name; request queries support one value | +| `viewName` | string | No | View name; request queries accept one value | +| `expandWorkflow` | boolean | No | Include documented workflow information in request queries | +| `maxResults` | number | No | Maximum projected items \(1-500; default 200\). This is a local result cap, not provider pagination. | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `requests` | json | Bounded requests matching the selected window and filters | +| ↳ `items` | array | Bounded requests matching the selected window and filters | +| ↳ `id` | string | Request UUID | +| ↳ `title` | string | Request title | +| ↳ `description` | string | Request description | +| ↳ `priority` | string | Request priority | +| ↳ `origin` | string | Request origin | +| ↳ `requestType` | string | Request type, including subscription-generated requests | +| ↳ `status` | string | Request status | +| ↳ `stage` | string | Workflow stage | +| ↳ `requestNumber` | number | Request number | +| ↳ `timeCreated` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `timeModified` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `timeSubmitted` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `blockedUntil` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `notes` | string | Request notes | +| ↳ `itemCount` | number | Number of items | +| ↳ `commentCount` | number | Number of comments | +| ↳ `validationErrorCount` | number | Validation error count | +| ↳ `attachmentCount` | number | Number of attachments | +| ↳ `actionCount` | number | Number of actions | +| ↳ `commentRequiredOnTransition` | boolean | Whether the next transition requires a comment | +| ↳ `validTransitionActions` | array | Currently valid workflow transitions | +| ↳ `viewId` | string | View UUID | +| ↳ `viewName` | string | View name | +| ↳ `createdByUser` | json | User identity, excluding authentication and preference fields | +| ↳ `id` | string | User UUID | +| ↳ `userName` | string | User name | +| ↳ `fullName` | string | Full name | +| ↳ `modifiedByUser` | json | User identity, excluding authentication and preference fields | +| ↳ `id` | string | User UUID | +| ↳ `userName` | string | User name | +| ↳ `fullName` | string | Full name | +| ↳ `submittedByUser` | json | User identity, excluding authentication and preference fields | +| ↳ `id` | string | User UUID | +| ↳ `userName` | string | User name | +| ↳ `fullName` | string | Full name | +| ↳ `assignedToUser` | json | User identity, excluding authentication and preference fields | +| ↳ `id` | string | User UUID | +| ↳ `userName` | string | User name | +| ↳ `fullName` | string | Full name | +| ↳ `owner` | json | User identity, excluding authentication and preference fields | +| ↳ `id` | string | User UUID | +| ↳ `userName` | string | User name | +| ↳ `fullName` | string | Full name | +| ↳ `sourceRequest` | json | Resource reference \(id, name, description, links\) | +| ↳ `id` | string | Resource UUID | +| ↳ `name` | string | Resource name | +| ↳ `description` | string | Resource description | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `subscriptions` | array | Associated subscription references | +| ↳ `id` | string | Resource UUID | +| ↳ `name` | string | Resource name | +| ↳ `description` | string | Resource description | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `autoSubmitted` | boolean | Whether the request was automatically submitted | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `count` | number | Number of returned items | +| ↳ `truncated` | boolean | More items exist or the provider indicated additional results | + +### Oracle EDM Get Request Lineage + +Inspect request lineage and subscription processing relationships. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `oauthCredential` | string | Yes | Reusable Oracle EPM service-account credential | +| `requestId` | string | Yes | Request UUID; for node listing it requires request scope | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `lineage` | json | Request lineage and subscription processing instances | +| ↳ `requestLineageNodes` | array | Related requests in the lineage | +| ↳ `id` | string | Resource UUID | +| ↳ `title` | string | Request title | +| ↳ `origin` | string | Request origin | +| ↳ `status` | string | Request status | +| ↳ `autoSubmitted` | boolean | Whether the request was automatically submitted | +| ↳ `sourceRequest` | json | Resource reference \(id, name, description, links\) | +| ↳ `id` | string | Resource UUID | +| ↳ `name` | string | Resource name | +| ↳ `description` | string | Resource description | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `timeCreated` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `viewpoints` | array | Related viewpoints | +| ↳ `id` | string | Resource UUID | +| ↳ `name` | string | Resource name | +| ↳ `description` | string | Resource description | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `incompleteSubscriptions` | array | Incomplete subscription instances | +| ↳ `id` | string | Resource UUID | +| ↳ `name` | string | Subscription name | +| ↳ `description` | string | Subscription description | +| ↳ `sourceViewpoint` | json | Resource reference \(id, name, description, links\) | +| ↳ `id` | string | Resource UUID | +| ↳ `name` | string | Resource name | +| ↳ `description` | string | Resource description | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `targetViewpoint` | json | Resource reference \(id, name, description, links\) | +| ↳ `id` | string | Resource UUID | +| ↳ `name` | string | Resource name | +| ↳ `description` | string | Resource description | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `sourceRequest` | string | Source request UUID | +| ↳ `targetRequest` | string | Target request UUID | +| ↳ `subscriptionStatus` | string | Subscription processing status | +| ↳ `message` | string | Processing message | +| ↳ `assigneeName` | string | Assignee name | +| ↳ `timeCreated` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `timeModified` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `subscriptionInstances` | array | Subscription processing instances | +| ↳ `id` | string | Resource UUID | +| ↳ `name` | string | Subscription name | +| ↳ `description` | string | Subscription description | +| ↳ `sourceViewpoint` | json | Resource reference \(id, name, description, links\) | +| ↳ `id` | string | Resource UUID | +| ↳ `name` | string | Resource name | +| ↳ `description` | string | Resource description | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `targetViewpoint` | json | Resource reference \(id, name, description, links\) | +| ↳ `id` | string | Resource UUID | +| ↳ `name` | string | Resource name | +| ↳ `description` | string | Resource description | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `sourceRequest` | string | Source request UUID | +| ↳ `targetRequest` | string | Target request UUID | +| ↳ `subscriptionStatus` | string | Subscription processing status | +| ↳ `message` | string | Processing message | +| ↳ `assigneeName` | string | Assignee name | +| ↳ `timeCreated` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `timeModified` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | + +### Oracle EDM Assign Request + +Assign an EDM request number to a user. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `oauthCredential` | string | Yes | Reusable Oracle EPM service-account credential | +| `requestNumber` | number | Yes | Positive Oracle request number, not request UUID | +| `userName` | string | Yes | Oracle user name to receive the request | +| `comment` | string | No | Workflow or assignment comment | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `request` | json | Request workflow, ownership, validation counts, and source relationships | +| ↳ `id` | string | Request UUID | +| ↳ `title` | string | Request title | +| ↳ `description` | string | Request description | +| ↳ `priority` | string | Request priority | +| ↳ `origin` | string | Request origin | +| ↳ `requestType` | string | Request type, including subscription-generated requests | +| ↳ `status` | string | Request status | +| ↳ `stage` | string | Workflow stage | +| ↳ `requestNumber` | number | Request number | +| ↳ `timeCreated` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `timeModified` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `timeSubmitted` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `blockedUntil` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `notes` | string | Request notes | +| ↳ `itemCount` | number | Number of items | +| ↳ `commentCount` | number | Number of comments | +| ↳ `validationErrorCount` | number | Validation error count | +| ↳ `attachmentCount` | number | Number of attachments | +| ↳ `actionCount` | number | Number of actions | +| ↳ `commentRequiredOnTransition` | boolean | Whether the next transition requires a comment | +| ↳ `validTransitionActions` | array | Currently valid workflow transitions | +| ↳ `viewId` | string | View UUID | +| ↳ `viewName` | string | View name | +| ↳ `createdByUser` | json | User identity, excluding authentication and preference fields | +| ↳ `id` | string | User UUID | +| ↳ `userName` | string | User name | +| ↳ `fullName` | string | Full name | +| ↳ `modifiedByUser` | json | User identity, excluding authentication and preference fields | +| ↳ `id` | string | User UUID | +| ↳ `userName` | string | User name | +| ↳ `fullName` | string | Full name | +| ↳ `submittedByUser` | json | User identity, excluding authentication and preference fields | +| ↳ `id` | string | User UUID | +| ↳ `userName` | string | User name | +| ↳ `fullName` | string | Full name | +| ↳ `assignedToUser` | json | User identity, excluding authentication and preference fields | +| ↳ `id` | string | User UUID | +| ↳ `userName` | string | User name | +| ↳ `fullName` | string | Full name | +| ↳ `owner` | json | User identity, excluding authentication and preference fields | +| ↳ `id` | string | User UUID | +| ↳ `userName` | string | User name | +| ↳ `fullName` | string | Full name | +| ↳ `sourceRequest` | json | Resource reference \(id, name, description, links\) | +| ↳ `id` | string | Resource UUID | +| ↳ `name` | string | Resource name | +| ↳ `description` | string | Resource description | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `subscriptions` | array | Associated subscription references | +| ↳ `id` | string | Resource UUID | +| ↳ `name` | string | Resource name | +| ↳ `description` | string | Resource description | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `autoSubmitted` | boolean | Whether the request was automatically submitted | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | + +### Oracle EDM Delete Request + +Delete an EDM request when permitted by Oracle. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `oauthCredential` | string | Yes | Reusable Oracle EPM service-account credential | +| `requestId` | string | Yes | Request UUID; for node listing it requires request scope | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `requestId` | string | Selected request UUID | +| `deleted` | boolean | Whether Oracle accepted the request deletion | + +### Oracle EDM Upload Request Attachment + +Upload one authorized Sim file as an EDM request attachment. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `oauthCredential` | string | Yes | Reusable Oracle EPM service-account credential | +| `requestId` | string | Yes | Request UUID; for node listing it requires request scope | +| `file` | file | Yes | One uploaded Sim UserFile; imports/loads may omit this to use an existing staged file | +| `fileName` | string | No | Single Oracle staging, attachment, or output file name; no directory path | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `requestId` | string | Selected request UUID | +| `fileName` | string | Oracle file name | +| `attachmentId` | string | Uploaded attachment UUID | +| `attachmentUri` | string | Validated request attachment URI | + +### Oracle EDM Generate Request Attachment + +Generate an Excel request attachment and poll its job; Oracle does not document the generated attachment ID for automatic import chaining. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `oauthCredential` | string | Yes | Reusable Oracle EPM service-account credential | +| `requestId` | string | Yes | Request UUID; for node listing it requires request scope | +| `fileName` | string | Yes | Single Oracle staging, attachment, or output file name; no directory path | +| `items` | array | Yes | Attachment rows: each has viewpoint and data cells with header and value | +| `overwrite` | boolean | No | Whether to overwrite an existing generated request attachment; false is preserved | +| `waitForCompletion` | boolean | No | Wait for the Oracle job \(default true\); false returns the job ID immediately | +| `maxWaitSeconds` | number | No | Maximum local wait \(1-240 seconds; default 120\); timeout does not cancel the remote job | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `jobId` | string | Job UUID for resumable status/result retrieval | +| `job` | json | Current Oracle job snapshot | +| ↳ `id` | string | Resource UUID | +| ↳ `description` | string | Job description | +| ↳ `origin` | string | Job origin | +| ↳ `status` | string | PENDING, RUNNING, ERROR, or COMPLETED | +| ↳ `error` | string | Oracle job error text | +| ↳ `created` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `lastModified` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `jobSize` | number | Total job work | +| ↳ `jobProgress` | number | Completed job work | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| `completed` | boolean | True when Oracle job status is COMPLETED; inspect result and reports for business success | +| `timedOut` | boolean | Local polling ended before completion; the remote job may still be running | +| `result` | json | Oracle job-result envelope; its nested result is opaque | +| ↳ `id` | string | Resource UUID | +| ↳ `description` | string | Job description | +| ↳ `origin` | string | Job origin | +| ↳ `status` | string | PENDING, RUNNING, ERROR, or COMPLETED | +| ↳ `created` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `lastModified` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `result` | json | Opaque Oracle JsonNode result; no operation-specific schema is documented | + +### Oracle EDM Import Request Attachment + +Import named sheets from a saved request attachment and poll its job. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `oauthCredential` | string | Yes | Reusable Oracle EPM service-account credential | +| `requestId` | string | Yes | Request UUID; for node listing it requires request scope | +| `attachmentId` | string | Yes | Saved request attachment UUID | +| `sheetNames` | array | Yes | Non-empty array of attachment sheet names to import | +| `waitForCompletion` | boolean | No | Wait for the Oracle job \(default true\); false returns the job ID immediately | +| `maxWaitSeconds` | number | No | Maximum local wait \(1-240 seconds; default 120\); timeout does not cancel the remote job | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `jobId` | string | Job UUID for resumable status/result retrieval | +| `job` | json | Current Oracle job snapshot | +| ↳ `id` | string | Resource UUID | +| ↳ `description` | string | Job description | +| ↳ `origin` | string | Job origin | +| ↳ `status` | string | PENDING, RUNNING, ERROR, or COMPLETED | +| ↳ `error` | string | Oracle job error text | +| ↳ `created` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `lastModified` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `jobSize` | number | Total job work | +| ↳ `jobProgress` | number | Completed job work | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| `completed` | boolean | True when Oracle job status is COMPLETED; inspect result and reports for business success | +| `timedOut` | boolean | Local polling ended before completion; the remote job may still be running | +| `result` | json | Oracle job-result envelope; its nested result is opaque | +| ↳ `id` | string | Resource UUID | +| ↳ `description` | string | Job description | +| ↳ `origin` | string | Job origin | +| ↳ `status` | string | PENDING, RUNNING, ERROR, or COMPLETED | +| ↳ `created` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `lastModified` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `result` | json | Opaque Oracle JsonNode result; no operation-specific schema is documented | + +### Oracle EDM Transition Request + +Perform a documented request workflow action and optionally wait for completion. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `oauthCredential` | string | Yes | Reusable Oracle EPM service-account credential | +| `requestId` | string | Yes | Request UUID; for node listing it requires request scope | +| `action` | string | Yes | Requested workflow action; inspect validTransitionActions before choosing. Allowed values: SUBMIT, APPROVE, PUSHBACK, REJECT, WITHDRAW, RECALL, COMMIT, CLOSE. | +| `comment` | string | No | Workflow or assignment comment | +| `transitionWithWarning` | boolean | No | Whether to allow the transition with validation warnings; false is preserved | +| `waitForCompletion` | boolean | No | Wait for the Oracle job \(default true\); false returns the job ID immediately | +| `maxWaitSeconds` | number | No | Maximum local wait \(1-240 seconds; default 120\); timeout does not cancel the remote job | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `jobId` | string | Job UUID for resumable status/result retrieval | +| `job` | json | Current Oracle job snapshot | +| ↳ `id` | string | Resource UUID | +| ↳ `description` | string | Job description | +| ↳ `origin` | string | Job origin | +| ↳ `status` | string | PENDING, RUNNING, ERROR, or COMPLETED | +| ↳ `error` | string | Oracle job error text | +| ↳ `created` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `lastModified` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `jobSize` | number | Total job work | +| ↳ `jobProgress` | number | Completed job work | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| `completed` | boolean | True when Oracle job status is COMPLETED; inspect result and reports for business success | +| `timedOut` | boolean | Local polling ended before completion; the remote job may still be running | +| `result` | json | Oracle job-result envelope; its nested result is opaque | +| ↳ `id` | string | Resource UUID | +| ↳ `description` | string | Job description | +| ↳ `origin` | string | Job origin | +| ↳ `status` | string | PENDING, RUNNING, ERROR, or COMPLETED | +| ↳ `created` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `lastModified` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `result` | json | Opaque Oracle JsonNode result; no operation-specific schema is documented | + +### Oracle EDM Get Job Status + +Get the current Oracle EDM job status without waiting. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `oauthCredential` | string | Yes | Reusable Oracle EPM service-account credential | +| `jobRunId` | string | Yes | Oracle job UUID | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `job` | json | Current Oracle job snapshot | +| ↳ `id` | string | Resource UUID | +| ↳ `description` | string | Job description | +| ↳ `origin` | string | Job origin | +| ↳ `status` | string | PENDING, RUNNING, ERROR, or COMPLETED | +| ↳ `error` | string | Oracle job error text | +| ↳ `created` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `lastModified` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `jobSize` | number | Total job work | +| ↳ `jobProgress` | number | Completed job work | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | + +### Oracle EDM Get Job Result + +Get a documented job-result envelope with an opaque result, or download its result file. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `oauthCredential` | string | Yes | Reusable Oracle EPM service-account credential | +| `jobRunId` | string | Yes | Oracle job UUID | +| `downloadFile` | boolean | No | Download a completed job file alongside its opaque result; supply the original staging file name when no file link is advertised \(default false\) | +| `fileName` | string | No | Single Oracle staging, attachment, or output file name; no directory path | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `job` | json | Current Oracle job snapshot | +| ↳ `id` | string | Resource UUID | +| ↳ `description` | string | Job description | +| ↳ `origin` | string | Job origin | +| ↳ `status` | string | PENDING, RUNNING, ERROR, or COMPLETED | +| ↳ `error` | string | Oracle job error text | +| ↳ `created` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `lastModified` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `jobSize` | number | Total job work | +| ↳ `jobProgress` | number | Completed job work | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| `result` | json | Oracle job-result envelope; its nested result is opaque | +| ↳ `id` | string | Resource UUID | +| ↳ `description` | string | Job description | +| ↳ `origin` | string | Job origin | +| ↳ `status` | string | PENDING, RUNNING, ERROR, or COMPLETED | +| ↳ `created` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `lastModified` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `result` | json | Opaque Oracle JsonNode result; no operation-specific schema is documented | +| `file` | file | Result stored as a canonical Sim UserFile | + +### Oracle EDM Validate Viewpoint + +Validate a viewpoint and retrieve its generated report after job completion. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `oauthCredential` | string | Yes | Reusable Oracle EPM service-account credential | +| `viewName` | string | Yes | View name; request queries accept one value | +| `viewpointName` | string | Yes | Viewpoint name | +| `fileName` | string | Yes | Single Oracle staging, attachment, or output file name; no directory path | +| `requestNumber` | number | No | Positive Oracle request number, not request UUID | +| `waitForCompletion` | boolean | No | Wait for the Oracle job \(default true\); false returns the job ID immediately | +| `maxWaitSeconds` | number | No | Maximum local wait \(1-240 seconds; default 120\); timeout does not cancel the remote job | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `jobId` | string | Job UUID for resumable status/result retrieval | +| `job` | json | Current Oracle job snapshot | +| ↳ `id` | string | Resource UUID | +| ↳ `description` | string | Job description | +| ↳ `origin` | string | Job origin | +| ↳ `status` | string | PENDING, RUNNING, ERROR, or COMPLETED | +| ↳ `error` | string | Oracle job error text | +| ↳ `created` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `lastModified` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `jobSize` | number | Total job work | +| ↳ `jobProgress` | number | Completed job work | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| `completed` | boolean | True when Oracle job status is COMPLETED; inspect result and reports for business success | +| `timedOut` | boolean | Local polling ended before completion; the remote job may still be running | +| `result` | json | Oracle job-result envelope; its nested result is opaque | +| ↳ `id` | string | Resource UUID | +| ↳ `description` | string | Job description | +| ↳ `origin` | string | Job origin | +| ↳ `status` | string | PENDING, RUNNING, ERROR, or COMPLETED | +| ↳ `created` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `lastModified` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `result` | json | Opaque Oracle JsonNode result; no operation-specific schema is documented | +| `file` | file | Result stored as a canonical Sim UserFile | +| `fileName` | string | Oracle file name | + +### Oracle EDM Get Mapping Keys + +Get mapping locations and source/target node-type references for a dimension binding. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `oauthCredential` | string | Yes | Reusable Oracle EPM service-account credential | +| `dimensionId` | string | Yes | Dimension UUID | +| `bindingId` | string | Yes | Dimension binding UUID | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `mapKeys` | array | Mapping locations and source/target node-type references | +| ↳ `location` | string | Mapping location | +| ↳ `sourceNodeType` | json | Resource reference \(id, name, description, links\) | +| ↳ `id` | string | Resource UUID | +| ↳ `name` | string | Resource name | +| ↳ `description` | string | Resource description | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `targetNodeType` | json | Resource reference \(id, name, description, links\) | +| ↳ `id` | string | Resource UUID | +| ↳ `name` | string | Resource name | +| ↳ `description` | string | Resource description | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `defaultLocation` | boolean | Whether this is the default mapping location | + +### Oracle EDM Export Mappings + +Export dimension mappings to a configured connection or a stored Sim file. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `oauthCredential` | string | Yes | Reusable Oracle EPM service-account credential | +| `applicationName` | string | Yes | Exact application name for Oracle's byName endpoint | +| `dimensionName` | string | Yes | Exact dimension name for Oracle's byName endpoint | +| `fileName` | string | Yes | Single Oracle staging, attachment, or output file name; no directory path | +| `mappingLocation` | string | Yes | Mapping location from Get Mapping Keys | +| `connection` | string | No | Configured Oracle connection; omit to use staging and, for exports, return a Sim file | +| `waitForCompletion` | boolean | No | Wait for the Oracle job \(default true\); false returns the job ID immediately | +| `maxWaitSeconds` | number | No | Maximum local wait \(1-240 seconds; default 120\); timeout does not cancel the remote job | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `jobId` | string | Job UUID for resumable status/result retrieval | +| `job` | json | Current Oracle job snapshot | +| ↳ `id` | string | Resource UUID | +| ↳ `description` | string | Job description | +| ↳ `origin` | string | Job origin | +| ↳ `status` | string | PENDING, RUNNING, ERROR, or COMPLETED | +| ↳ `error` | string | Oracle job error text | +| ↳ `created` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `lastModified` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `jobSize` | number | Total job work | +| ↳ `jobProgress` | number | Completed job work | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| `completed` | boolean | True when Oracle job status is COMPLETED; inspect result and reports for business success | +| `timedOut` | boolean | Local polling ended before completion; the remote job may still be running | +| `result` | json | Oracle job-result envelope; its nested result is opaque | +| ↳ `id` | string | Resource UUID | +| ↳ `description` | string | Job description | +| ↳ `origin` | string | Job origin | +| ↳ `status` | string | PENDING, RUNNING, ERROR, or COMPLETED | +| ↳ `created` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `lastModified` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `result` | json | Opaque Oracle JsonNode result; no operation-specific schema is documented | +| `file` | file | Result stored as a canonical Sim UserFile | +| `fileName` | string | Oracle file name | + +### Oracle EDM Import Dimension + +Import a dimension using an explicit import mode and staged or uploaded file. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `oauthCredential` | string | Yes | Reusable Oracle EPM service-account credential | +| `applicationName` | string | Yes | Exact application name for Oracle's byName endpoint | +| `dimensionName` | string | Yes | Exact dimension name for Oracle's byName endpoint | +| `fileName` | string | Yes | Single Oracle staging, attachment, or output file name; no directory path | +| `importOption` | string | Yes | Required import mode; no destructive provider default is applied. Allowed values: ResetDimension, ReplaceNodes, Merge. | +| `file` | file | No | One uploaded Sim UserFile; imports/loads may omit this to use an existing staged file | +| `connection` | string | No | Configured Oracle connection; omit to use staging and, for exports, return a Sim file | +| `waitForCompletion` | boolean | No | Wait for the Oracle job \(default true\); false returns the job ID immediately | +| `maxWaitSeconds` | number | No | Maximum local wait \(1-240 seconds; default 120\); timeout does not cancel the remote job | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `jobId` | string | Job UUID for resumable status/result retrieval | +| `job` | json | Current Oracle job snapshot | +| ↳ `id` | string | Resource UUID | +| ↳ `description` | string | Job description | +| ↳ `origin` | string | Job origin | +| ↳ `status` | string | PENDING, RUNNING, ERROR, or COMPLETED | +| ↳ `error` | string | Oracle job error text | +| ↳ `created` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `lastModified` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `jobSize` | number | Total job work | +| ↳ `jobProgress` | number | Completed job work | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| `completed` | boolean | True when Oracle job status is COMPLETED; inspect result and reports for business success | +| `timedOut` | boolean | Local polling ended before completion; the remote job may still be running | +| `result` | json | Oracle job-result envelope; its nested result is opaque | +| ↳ `id` | string | Resource UUID | +| ↳ `description` | string | Job description | +| ↳ `origin` | string | Job origin | +| ↳ `status` | string | PENDING, RUNNING, ERROR, or COMPLETED | +| ↳ `created` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `lastModified` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `result` | json | Opaque Oracle JsonNode result; no operation-specific schema is documented | + +### Oracle EDM Load Viewpoint + +Load a viewpoint from a staged or uploaded file using an explicit load mode. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `oauthCredential` | string | Yes | Reusable Oracle EPM service-account credential | +| `viewName` | string | Yes | View name; request queries accept one value | +| `viewpointName` | string | Yes | Viewpoint name | +| `fileName` | string | Yes | Single Oracle staging, attachment, or output file name; no directory path | +| `purpose` | string | Yes | Purpose or reason for loading the viewpoint | +| `loadOption` | string | Yes | Required load mode; no provider default is applied. Allowed values: ReplaceNodes, Merge. | +| `file` | file | No | One uploaded Sim UserFile; imports/loads may omit this to use an existing staged file | +| `waitForCompletion` | boolean | No | Wait for the Oracle job \(default true\); false returns the job ID immediately | +| `maxWaitSeconds` | number | No | Maximum local wait \(1-240 seconds; default 120\); timeout does not cancel the remote job | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `jobId` | string | Job UUID for resumable status/result retrieval | +| `job` | json | Current Oracle job snapshot | +| ↳ `id` | string | Resource UUID | +| ↳ `description` | string | Job description | +| ↳ `origin` | string | Job origin | +| ↳ `status` | string | PENDING, RUNNING, ERROR, or COMPLETED | +| ↳ `error` | string | Oracle job error text | +| ↳ `created` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `lastModified` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `jobSize` | number | Total job work | +| ↳ `jobProgress` | number | Completed job work | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| `completed` | boolean | True when Oracle job status is COMPLETED; inspect result and reports for business success | +| `timedOut` | boolean | Local polling ended before completion; the remote job may still be running | +| `result` | json | Oracle job-result envelope; its nested result is opaque | +| ↳ `id` | string | Resource UUID | +| ↳ `description` | string | Job description | +| ↳ `origin` | string | Job origin | +| ↳ `status` | string | PENDING, RUNNING, ERROR, or COMPLETED | +| ↳ `created` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `lastModified` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `result` | json | Opaque Oracle JsonNode result; no operation-specific schema is documented | + +### Oracle EDM Export Dimension + +Export a dimension to a configured connection or a stored Sim file. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `oauthCredential` | string | Yes | Reusable Oracle EPM service-account credential | +| `applicationName` | string | Yes | Exact application name for Oracle's byName endpoint | +| `dimensionName` | string | Yes | Exact dimension name for Oracle's byName endpoint | +| `fileName` | string | Yes | Single Oracle staging, attachment, or output file name; no directory path | +| `connection` | string | No | Configured Oracle connection; omit to use staging and, for exports, return a Sim file | +| `waitForCompletion` | boolean | No | Wait for the Oracle job \(default true\); false returns the job ID immediately | +| `maxWaitSeconds` | number | No | Maximum local wait \(1-240 seconds; default 120\); timeout does not cancel the remote job | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `jobId` | string | Job UUID for resumable status/result retrieval | +| `job` | json | Current Oracle job snapshot | +| ↳ `id` | string | Resource UUID | +| ↳ `description` | string | Job description | +| ↳ `origin` | string | Job origin | +| ↳ `status` | string | PENDING, RUNNING, ERROR, or COMPLETED | +| ↳ `error` | string | Oracle job error text | +| ↳ `created` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `lastModified` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `jobSize` | number | Total job work | +| ↳ `jobProgress` | number | Completed job work | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| `completed` | boolean | True when Oracle job status is COMPLETED; inspect result and reports for business success | +| `timedOut` | boolean | Local polling ended before completion; the remote job may still be running | +| `result` | json | Oracle job-result envelope; its nested result is opaque | +| ↳ `id` | string | Resource UUID | +| ↳ `description` | string | Job description | +| ↳ `origin` | string | Job origin | +| ↳ `status` | string | PENDING, RUNNING, ERROR, or COMPLETED | +| ↳ `created` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `lastModified` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `result` | json | Opaque Oracle JsonNode result; no operation-specific schema is documented | +| `file` | file | Result stored as a canonical Sim UserFile | +| `fileName` | string | Oracle file name | + +### Oracle EDM Incremental Export Dimension + +Export new or updated dimension nodes since a timestamp or a previous export. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `oauthCredential` | string | Yes | Reusable Oracle EPM service-account credential | +| `applicationName` | string | Yes | Exact application name for Oracle's byName endpoint | +| `dimensionName` | string | Yes | Exact dimension name for Oracle's byName endpoint | +| `fileName` | string | Yes | Single Oracle staging, attachment, or output file name; no directory path | +| `bindingNames` | array | Yes | Non-empty array of dimension binding names | +| `nodeChangeTypes` | array | Yes | Node changes to export: NEW, UPDATED, or both | +| `since` | number | No | Raw Oracle incremental timestamp; units are undocumented. Supply a tenant-confirmed value or use sinceLastExportOfType; no conversion is applied | +| `sinceLastExportOfType` | string | No | Use a previous export as the incremental boundary; mutually exclusive with since. Allowed values: FULL, INCREMENTAL. | +| `connectionName` | string | No | Configured Oracle connection name; omit to export to staging and return a Sim file | +| `waitForCompletion` | boolean | No | Wait for the Oracle job \(default true\); false returns the job ID immediately | +| `maxWaitSeconds` | number | No | Maximum local wait \(1-240 seconds; default 120\); timeout does not cancel the remote job | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `jobId` | string | Job UUID for resumable status/result retrieval | +| `job` | json | Current Oracle job snapshot | +| ↳ `id` | string | Resource UUID | +| ↳ `description` | string | Job description | +| ↳ `origin` | string | Job origin | +| ↳ `status` | string | PENDING, RUNNING, ERROR, or COMPLETED | +| ↳ `error` | string | Oracle job error text | +| ↳ `created` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `lastModified` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `jobSize` | number | Total job work | +| ↳ `jobProgress` | number | Completed job work | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| `completed` | boolean | True when Oracle job status is COMPLETED; inspect result and reports for business success | +| `timedOut` | boolean | Local polling ended before completion; the remote job may still be running | +| `result` | json | Oracle job-result envelope; its nested result is opaque | +| ↳ `id` | string | Resource UUID | +| ↳ `description` | string | Job description | +| ↳ `origin` | string | Job origin | +| ↳ `status` | string | PENDING, RUNNING, ERROR, or COMPLETED | +| ↳ `created` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `lastModified` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `result` | json | Opaque Oracle JsonNode result; no operation-specific schema is documented | +| `file` | file | Result stored as a canonical Sim UserFile | +| `fileName` | string | Oracle file name | + +### Oracle EDM Extract Dimension Viewpoint + +Run a configured dimension viewpoint extract and retrieve its output. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `oauthCredential` | string | Yes | Reusable Oracle EPM service-account credential | +| `applicationName` | string | Yes | Exact application name for Oracle's byName endpoint | +| `dimensionName` | string | Yes | Exact dimension name for Oracle's byName endpoint | +| `fileName` | string | Yes | Single Oracle staging, attachment, or output file name; no directory path | +| `extractName` | string | Yes | Name of the configured dimension viewpoint extract | +| `connection` | string | No | Configured Oracle connection; omit to use staging and, for exports, return a Sim file | +| `fromTime` | string | No | Oracle-supported start timestamp \(UTC, offset, or region format\) | +| `toTime` | string | No | Oracle-supported end timestamp \(UTC, offset, or region format\) | +| `requestNumber` | number | No | Positive Oracle request number, not request UUID | +| `waitForCompletion` | boolean | No | Wait for the Oracle job \(default true\); false returns the job ID immediately | +| `maxWaitSeconds` | number | No | Maximum local wait \(1-240 seconds; default 120\); timeout does not cancel the remote job | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `jobId` | string | Job UUID for resumable status/result retrieval | +| `job` | json | Current Oracle job snapshot | +| ↳ `id` | string | Resource UUID | +| ↳ `description` | string | Job description | +| ↳ `origin` | string | Job origin | +| ↳ `status` | string | PENDING, RUNNING, ERROR, or COMPLETED | +| ↳ `error` | string | Oracle job error text | +| ↳ `created` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `lastModified` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `jobSize` | number | Total job work | +| ↳ `jobProgress` | number | Completed job work | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| `completed` | boolean | True when Oracle job status is COMPLETED; inspect result and reports for business success | +| `timedOut` | boolean | Local polling ended before completion; the remote job may still be running | +| `result` | json | Oracle job-result envelope; its nested result is opaque | +| ↳ `id` | string | Resource UUID | +| ↳ `description` | string | Job description | +| ↳ `origin` | string | Job origin | +| ↳ `status` | string | PENDING, RUNNING, ERROR, or COMPLETED | +| ↳ `created` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `lastModified` | json | Oracle timestamp: epoch number or ISO timestamp string, depending on service response | +| ↳ `links` | array | Documented resource links; not arbitrary tool inputs | +| ↳ `rel` | string | Link relation | +| ↳ `href` | string | Link target | +| ↳ `method` | string | Advertised HTTP method | +| ↳ `result` | json | Opaque Oracle JsonNode result; no operation-specific schema is documented | +| `file` | file | Result stored as a canonical Sim UserFile | +| `fileName` | string | Oracle file name | + + diff --git a/apps/sim/blocks/blocks/oracle_epm_enterprise_data_management.ts b/apps/sim/blocks/blocks/oracle_epm_enterprise_data_management.ts new file mode 100644 index 00000000000..2c791391ed3 --- /dev/null +++ b/apps/sim/blocks/blocks/oracle_epm_enterprise_data_management.ts @@ -0,0 +1,2362 @@ +import { NetSuiteIcon } from '@/components/icons' +import type { BlockConfig, BlockMeta } from '@/blocks/types' +import { AuthMode, IntegrationType } from '@/blocks/types' +import { normalizeFileInput, parseOptionalNumberInput } from '@/blocks/utils' +import type { OracleEpmEdmResponse } from '@/tools/oracle_epm_enterprise_data_management/types' + +const OPERATION_FIELDS: Record = { + oracle_epm_edm_list_applications: ['applicationId', 'permission', 'maxResults'], + oracle_epm_edm_list_dimensions: ['applicationId', 'maxResults'], + oracle_epm_edm_list_views: ['dimensionId', 'objectStatus', 'maxResults'], + oracle_epm_edm_list_viewpoints: ['viewId', 'dimensionId', 'applicationId', 'maxResults'], + oracle_epm_edm_list_node_types: ['viewId', 'viewpointId', 'maxResults'], + oracle_epm_edm_get_node_type: ['viewId', 'viewpointId', 'nodeTypeId'], + oracle_epm_edm_list_nodes: [ + 'viewId', + 'viewpointId', + 'scope', + 'parentNodeId', + 'requestId', + 'expand', + 'limit', + 'offset', + 'fromId', + 'toId', + 'orderBy', + ], + oracle_epm_edm_get_node: ['viewId', 'viewpointId', 'nodeId', 'requestId', 'expand'], + oracle_epm_edm_get_node_at_location: [ + 'viewId', + 'viewpointId', + 'nodeId', + 'location', + 'requestId', + 'expand', + ], + oracle_epm_edm_browse_hierarchy: [ + 'viewId', + 'viewpointId', + 'maxDepth', + 'maxNodes', + 'pageSize', + 'maxRequests', + ], + oracle_epm_edm_create_request: [ + 'viewId', + 'title', + 'description', + 'notes', + 'priority', + 'timeLabelName', + ], + oracle_epm_edm_get_request: ['requestId'], + oracle_epm_edm_query_requests: [ + 'lastDays', + 'fromDate', + 'toDate', + 'myActivity', + 'owner', + 'queryPriority', + 'requestNumber', + 'requestType', + 'stage', + 'status', + 'timeLabelName', + 'viewName', + 'expandWorkflow', + 'maxResults', + ], + oracle_epm_edm_get_request_lineage: ['requestId'], + oracle_epm_edm_assign_request: ['requestNumber', 'userName', 'comment'], + oracle_epm_edm_delete_request: ['requestId'], + oracle_epm_edm_upload_request_attachment: ['requestId', 'file', 'fileName'], + oracle_epm_edm_generate_request_attachment: [ + 'requestId', + 'fileName', + 'items', + 'overwrite', + 'waitForCompletion', + 'maxWaitSeconds', + ], + oracle_epm_edm_import_request_attachment: [ + 'requestId', + 'attachmentId', + 'sheetNames', + 'waitForCompletion', + 'maxWaitSeconds', + ], + oracle_epm_edm_transition_request: [ + 'requestId', + 'action', + 'comment', + 'transitionWithWarning', + 'waitForCompletion', + 'maxWaitSeconds', + ], + oracle_epm_edm_get_job_status: ['jobRunId'], + oracle_epm_edm_get_job_result: ['jobRunId', 'downloadFile', 'fileName'], + oracle_epm_edm_validate_viewpoint: [ + 'viewName', + 'viewpointName', + 'fileName', + 'requestNumber', + 'waitForCompletion', + 'maxWaitSeconds', + ], + oracle_epm_edm_get_mapping_keys: ['dimensionId', 'bindingId'], + oracle_epm_edm_export_mappings: [ + 'applicationName', + 'dimensionName', + 'fileName', + 'mappingLocation', + 'connection', + 'waitForCompletion', + 'maxWaitSeconds', + ], + oracle_epm_edm_import_dimension: [ + 'applicationName', + 'dimensionName', + 'fileName', + 'importOption', + 'file', + 'connection', + 'waitForCompletion', + 'maxWaitSeconds', + ], + oracle_epm_edm_load_viewpoint: [ + 'viewName', + 'viewpointName', + 'fileName', + 'purpose', + 'loadOption', + 'file', + 'waitForCompletion', + 'maxWaitSeconds', + ], + oracle_epm_edm_export_dimension: [ + 'applicationName', + 'dimensionName', + 'fileName', + 'connection', + 'waitForCompletion', + 'maxWaitSeconds', + ], + oracle_epm_edm_incremental_export_dimension: [ + 'applicationName', + 'dimensionName', + 'fileName', + 'bindingNames', + 'nodeChangeTypes', + 'since', + 'sinceLastExportOfType', + 'connectionName', + 'waitForCompletion', + 'maxWaitSeconds', + ], + oracle_epm_edm_extract_dimension_viewpoint: [ + 'applicationName', + 'dimensionName', + 'fileName', + 'extractName', + 'connection', + 'fromTime', + 'toTime', + 'requestNumber', + 'waitForCompletion', + 'maxWaitSeconds', + ], +} +const FIELD_KINDS: Record = { + applicationId: 'string', + permission: 'string', + maxResults: 'number', + dimensionId: 'string', + objectStatus: 'string', + viewId: 'string', + viewpointId: 'string', + nodeTypeId: 'string', + scope: 'string', + parentNodeId: 'string', + requestId: 'string', + expand: 'string', + limit: 'number', + offset: 'number', + fromId: 'string', + toId: 'string', + orderBy: 'string', + nodeId: 'string', + location: 'string', + maxDepth: 'number', + maxNodes: 'number', + pageSize: 'number', + maxRequests: 'number', + title: 'string', + description: 'string', + notes: 'string', + priority: 'string', + queryPriority: 'string', + timeLabelName: 'string', + lastDays: 'number', + fromDate: 'number', + toDate: 'number', + myActivity: 'string', + owner: 'string', + requestNumber: 'number', + requestType: 'string', + stage: 'string', + status: 'string', + viewName: 'string', + expandWorkflow: 'boolean', + userName: 'string', + comment: 'string', + file: 'file', + fileName: 'string', + items: 'array', + overwrite: 'boolean', + waitForCompletion: 'boolean', + maxWaitSeconds: 'number', + attachmentId: 'string', + sheetNames: 'array', + action: 'string', + transitionWithWarning: 'boolean', + jobRunId: 'string', + downloadFile: 'boolean', + viewpointName: 'string', + bindingId: 'string', + applicationName: 'string', + dimensionName: 'string', + mappingLocation: 'string', + connection: 'string', + importOption: 'string', + purpose: 'string', + loadOption: 'string', + bindingNames: 'array', + nodeChangeTypes: 'array', + since: 'number', + sinceLastExportOfType: 'string', + connectionName: 'string', + extractName: 'string', + fromTime: 'string', + toTime: 'string', +} + +const REQUEST_ID_OPERATIONS = [ + 'oracle_epm_edm_get_node', + 'oracle_epm_edm_get_node_at_location', + 'oracle_epm_edm_get_request', + 'oracle_epm_edm_get_request_lineage', + 'oracle_epm_edm_delete_request', + 'oracle_epm_edm_upload_request_attachment', + 'oracle_epm_edm_generate_request_attachment', + 'oracle_epm_edm_import_request_attachment', + 'oracle_epm_edm_transition_request', +] +const REQUIRED_REQUEST_ID_OPERATIONS = [ + 'oracle_epm_edm_get_request', + 'oracle_epm_edm_get_request_lineage', + 'oracle_epm_edm_delete_request', + 'oracle_epm_edm_upload_request_attachment', + 'oracle_epm_edm_generate_request_attachment', + 'oracle_epm_edm_import_request_attachment', + 'oracle_epm_edm_transition_request', +] + +function requestIdCondition(values: Record | undefined, required: boolean) { + return { + field: 'operation', + value: [ + ...(required ? REQUIRED_REQUEST_ID_OPERATIONS : REQUEST_ID_OPERATIONS), + ...(values?.scope === 'request' ? ['oracle_epm_edm_list_nodes'] : []), + ], + } +} + +function optionalBoolean(value: unknown): boolean | undefined { + if (value === true || value === 'true') return true + if (value === false || value === 'false') return false + if (value === undefined || value === null || value === '') return undefined + throw new Error('Expected Yes or No for an EDM boolean input') +} + +/** Only the selected operation's fields reach the tool; stale editor values are excluded. */ +function operationParams(params: Record): Record { + const operation = typeof params.operation === 'string' ? params.operation : '' + const selectedFields = OPERATION_FIELDS[operation] + if (!selectedFields) throw new Error('Select a supported Oracle EDM operation') + const output: Record = { oauthCredential: params.oauthCredential } + for (const field of selectedFields) { + const value = params[field] + if (value === undefined || value === null || value === '') continue + const key = field === 'queryPriority' ? 'priority' : field + switch (FIELD_KINDS[field]) { + case 'number': + output[key] = parseOptionalNumberInput(value, field, { integer: true }) + break + case 'boolean': + output[key] = optionalBoolean(value) + break + case 'array': + if (typeof value === 'string') { + try { + output[key] = JSON.parse(value) + } catch { + throw new Error(`${field} must be valid JSON`) + } + } else output[key] = value + break + case 'file': + output[key] = normalizeFileInput(value, { single: true }) + break + default: + output[key] = value + } + } + // The application picker scopes the dimension picker; Oracle receives only one filter. + if (operation === 'oracle_epm_edm_list_viewpoints' && output.dimensionId) + output.applicationId = undefined + if (operation === 'oracle_epm_edm_list_nodes') { + if (output.scope !== 'children') output.parentNodeId = undefined + if (output.scope !== 'request') output.requestId = undefined + } + return output +} + +export const OracleEpmEnterpriseDataManagementBlock: BlockConfig = { + type: 'oracle_epm_enterprise_data_management', + name: 'Oracle EPM Enterprise Data Management', + description: + 'Manage dimensions, viewpoints, nodes, governed requests, validation, and data transfers', + longDescription: + 'Use a reusable Oracle EPM service account to discover enterprise master data, browse bounded hierarchies, prepare and transition governed requests, inspect subscription-generated request lineage, run validation, and import or export files. Node changes flow through request attachments. Subscription and validation-definition administration are not included. Upload-to-import request workflows are supported; generated attachment jobs return opaque results because Oracle does not document the generated attachment ID needed to chain an import automatically. Oracle job COMPLETED is not a guarantee of business success: inspect job results and validation reports.', + docsLink: 'https://docs.sim.ai/integrations/oracle_epm_enterprise_data_management', + authMode: AuthMode.ApiKey, + category: 'tools', + integrationType: IntegrationType.Analytics, + bgColor: '#FFFFFF', + icon: NetSuiteIcon, + canvasPresentation: { + defaultTitle: 'Oracle EDM', + sentences: { + byOperation: { + oracle_epm_edm_list_applications: ['List Applications'], + oracle_epm_edm_list_dimensions: [ + { + text: 'List dimensions in', + field: ['applicationSelector', 'applicationManual'], + core: true, + }, + ], + oracle_epm_edm_list_views: ['List Views'], + oracle_epm_edm_list_viewpoints: [ + { text: 'List viewpoints in', field: ['viewSelector', 'viewManual'], core: true }, + ], + oracle_epm_edm_list_node_types: [ + { + text: 'List node types in', + field: ['viewpointSelector', 'viewpointManual'], + core: true, + }, + ], + oracle_epm_edm_get_node_type: [ + { text: 'Get node type', field: ['nodeTypeSelector', 'nodeTypeManual'], core: true }, + ], + oracle_epm_edm_list_nodes: [ + { text: 'List nodes in', field: ['viewpointSelector', 'viewpointManual'], core: true }, + ], + oracle_epm_edm_get_node: [{ text: 'Get node', field: 'nodeId', core: true }], + oracle_epm_edm_get_node_at_location: [ + { text: 'Get node at location for', field: 'nodeId', core: true }, + ], + oracle_epm_edm_browse_hierarchy: [ + { + text: 'Browse hierarchy in', + field: ['viewpointSelector', 'viewpointManual'], + core: true, + }, + ], + oracle_epm_edm_create_request: [ + { text: 'Create request in', field: ['viewSelector', 'viewManual'], core: true }, + ], + oracle_epm_edm_get_request: [ + { text: 'Get request', field: ['requestSelector', 'requestManual'], core: true }, + ], + oracle_epm_edm_query_requests: ['Query Requests'], + oracle_epm_edm_get_request_lineage: [ + { text: 'Inspect lineage for', field: ['requestSelector', 'requestManual'], core: true }, + ], + oracle_epm_edm_assign_request: [ + { text: 'Assign request', field: 'requestNumber', core: true }, + ], + oracle_epm_edm_delete_request: [ + { text: 'Delete request', field: ['requestSelector', 'requestManual'], core: true }, + ], + oracle_epm_edm_upload_request_attachment: [ + { text: 'Upload attachment to', field: ['requestSelector', 'requestManual'], core: true }, + ], + oracle_epm_edm_generate_request_attachment: [ + { + text: 'Generate attachment for', + field: ['requestSelector', 'requestManual'], + core: true, + }, + ], + oracle_epm_edm_import_request_attachment: [ + { + text: 'Import attachment into', + field: ['requestSelector', 'requestManual'], + core: true, + }, + ], + oracle_epm_edm_transition_request: [ + { text: 'Transition request', field: ['requestSelector', 'requestManual'], core: true }, + ], + oracle_epm_edm_get_job_status: [{ text: 'Check job', field: 'jobRunId', core: true }], + oracle_epm_edm_get_job_result: [ + { text: 'Get result for job', field: 'jobRunId', core: true }, + ], + oracle_epm_edm_validate_viewpoint: [ + { text: 'Validate viewpoint', field: 'viewpointName', core: true }, + ], + oracle_epm_edm_get_mapping_keys: [ + { text: 'Get mapping keys for binding', field: 'bindingId', core: true }, + ], + oracle_epm_edm_export_mappings: [ + { text: 'Export mappings from', field: 'dimensionName', core: true }, + ], + oracle_epm_edm_import_dimension: [ + { text: 'Import dimension', field: 'dimensionName', core: true }, + ], + oracle_epm_edm_load_viewpoint: [ + { text: 'Load viewpoint', field: 'viewpointName', core: true }, + ], + oracle_epm_edm_export_dimension: [ + { text: 'Export dimension', field: 'dimensionName', core: true }, + ], + oracle_epm_edm_incremental_export_dimension: [ + { text: 'Incrementally export dimension', field: 'dimensionName', core: true }, + ], + oracle_epm_edm_extract_dimension_viewpoint: [ + { text: 'Run extract', field: 'extractName', core: true }, + ], + }, + }, + }, + subBlocks: [ + { + id: 'credential', + title: 'Oracle EPM Account', + type: 'oauth-input', + serviceId: 'oracle-epm-enterprise-data-management', + credentialKind: 'service-account', + canonicalParamId: 'oauthCredential', + mode: 'basic', + placeholder: 'Select Oracle EPM credential', + required: true, + }, + { + id: 'manualCredential', + title: 'Oracle EPM Account', + type: 'short-input', + canonicalParamId: 'oauthCredential', + mode: 'advanced', + placeholder: 'Enter credential ID', + required: true, + }, + { + id: 'operation', + title: 'Operation', + type: 'dropdown', + options: [ + { label: 'List Applications', id: 'oracle_epm_edm_list_applications' }, + { label: 'List Dimensions', id: 'oracle_epm_edm_list_dimensions' }, + { label: 'List Views', id: 'oracle_epm_edm_list_views' }, + { label: 'List Viewpoints', id: 'oracle_epm_edm_list_viewpoints' }, + { label: 'List Node Types', id: 'oracle_epm_edm_list_node_types' }, + { label: 'Get Node Type', id: 'oracle_epm_edm_get_node_type' }, + { label: 'List Nodes', id: 'oracle_epm_edm_list_nodes' }, + { label: 'Get Node', id: 'oracle_epm_edm_get_node' }, + { label: 'Get Node At Location', id: 'oracle_epm_edm_get_node_at_location' }, + { label: 'Browse Hierarchy', id: 'oracle_epm_edm_browse_hierarchy' }, + { label: 'Create Request', id: 'oracle_epm_edm_create_request' }, + { label: 'Get Request', id: 'oracle_epm_edm_get_request' }, + { label: 'Query Requests', id: 'oracle_epm_edm_query_requests' }, + { label: 'Get Request Lineage', id: 'oracle_epm_edm_get_request_lineage' }, + { label: 'Assign Request', id: 'oracle_epm_edm_assign_request' }, + { label: 'Delete Request', id: 'oracle_epm_edm_delete_request' }, + { label: 'Upload Request Attachment', id: 'oracle_epm_edm_upload_request_attachment' }, + { label: 'Generate Request Attachment', id: 'oracle_epm_edm_generate_request_attachment' }, + { label: 'Import Request Attachment', id: 'oracle_epm_edm_import_request_attachment' }, + { label: 'Transition Request', id: 'oracle_epm_edm_transition_request' }, + { label: 'Get Job Status', id: 'oracle_epm_edm_get_job_status' }, + { label: 'Get Job Result', id: 'oracle_epm_edm_get_job_result' }, + { label: 'Validate Viewpoint', id: 'oracle_epm_edm_validate_viewpoint' }, + { label: 'Get Mapping Keys', id: 'oracle_epm_edm_get_mapping_keys' }, + { label: 'Export Mappings', id: 'oracle_epm_edm_export_mappings' }, + { label: 'Import Dimension', id: 'oracle_epm_edm_import_dimension' }, + { label: 'Load Viewpoint', id: 'oracle_epm_edm_load_viewpoint' }, + { label: 'Export Dimension', id: 'oracle_epm_edm_export_dimension' }, + { + label: 'Incremental Export Dimension', + id: 'oracle_epm_edm_incremental_export_dimension', + }, + { label: 'Extract Dimension Viewpoint', id: 'oracle_epm_edm_extract_dimension_viewpoint' }, + ], + value: () => 'oracle_epm_edm_list_applications', + required: true, + }, + { + id: 'applicationSelector', + title: 'Application ID', + type: 'project-selector', + description: + 'Application UUID. Choices are locally filtered within at most 500 returned results.', + condition: { + field: 'operation', + value: [ + 'oracle_epm_edm_list_applications', + 'oracle_epm_edm_list_dimensions', + 'oracle_epm_edm_list_viewpoints', + 'oracle_epm_edm_list_views', + 'oracle_epm_edm_get_mapping_keys', + ], + }, + required: { field: 'operation', value: ['oracle_epm_edm_list_dimensions'] }, + canonicalParamId: 'applicationId', + serviceId: 'oracle-epm-enterprise-data-management', + selectorKey: 'oracleEpmEdm.applications', + dependsOn: ['credential'], + mode: 'basic', + placeholder: 'Select application', + }, + { + id: 'applicationManual', + title: 'Application ID', + type: 'short-input', + description: 'Application UUID', + condition: { + field: 'operation', + value: [ + 'oracle_epm_edm_list_applications', + 'oracle_epm_edm_list_dimensions', + 'oracle_epm_edm_list_viewpoints', + 'oracle_epm_edm_list_views', + 'oracle_epm_edm_get_mapping_keys', + ], + }, + required: { field: 'operation', value: ['oracle_epm_edm_list_dimensions'] }, + canonicalParamId: 'applicationId', + mode: 'advanced', + placeholder: 'Enter Application UUID', + }, + { + id: 'permission', + title: 'Permission', + type: 'dropdown', + description: + 'One application permission: owner, datamanager, participant, or participant_with_write', + condition: { field: 'operation', value: ['oracle_epm_edm_list_applications'] }, + options: [ + { label: 'owner', id: 'owner' }, + { label: 'datamanager', id: 'datamanager' }, + { label: 'participant', id: 'participant' }, + { label: 'participant_with_write', id: 'participant_with_write' }, + ], + mode: 'advanced', + }, + { + id: 'maxResults', + title: 'Max Results', + type: 'short-input', + description: + 'Maximum projected items (1-500; default 200). This is a local result cap, not provider pagination.', + condition: { + field: 'operation', + value: [ + 'oracle_epm_edm_list_applications', + 'oracle_epm_edm_list_dimensions', + 'oracle_epm_edm_list_views', + 'oracle_epm_edm_list_viewpoints', + 'oracle_epm_edm_list_node_types', + 'oracle_epm_edm_query_requests', + ], + }, + placeholder: + 'Maximum projected items (1-500; default 200). This is a local result cap, not provider pagination.', + mode: 'advanced', + }, + { + id: 'dimensionSelector', + title: 'Dimension ID', + type: 'project-selector', + description: + 'Dimension UUID. Choices are locally filtered within at most 500 returned results.', + condition: { + field: 'operation', + value: [ + 'oracle_epm_edm_list_views', + 'oracle_epm_edm_list_viewpoints', + 'oracle_epm_edm_get_mapping_keys', + ], + }, + required: { field: 'operation', value: ['oracle_epm_edm_get_mapping_keys'] }, + canonicalParamId: 'dimensionId', + serviceId: 'oracle-epm-enterprise-data-management', + selectorKey: 'oracleEpmEdm.dimensions', + dependsOn: ['credential', 'applicationId'], + mode: 'basic', + placeholder: 'Select dimension', + }, + { + id: 'dimensionManual', + title: 'Dimension ID', + type: 'short-input', + description: 'Dimension UUID', + condition: { + field: 'operation', + value: [ + 'oracle_epm_edm_list_views', + 'oracle_epm_edm_list_viewpoints', + 'oracle_epm_edm_get_mapping_keys', + ], + }, + required: { field: 'operation', value: ['oracle_epm_edm_get_mapping_keys'] }, + canonicalParamId: 'dimensionId', + mode: 'advanced', + placeholder: 'Enter Dimension UUID', + }, + { + id: 'objectStatus', + title: 'Object Status', + type: 'dropdown', + description: 'One view status filter', + condition: { field: 'operation', value: ['oracle_epm_edm_list_views'] }, + options: [ + { label: 'DRAFT', id: 'DRAFT' }, + { label: 'ACTIVE', id: 'ACTIVE' }, + { label: 'ARCHIVED', id: 'ARCHIVED' }, + ], + mode: 'advanced', + }, + { + id: 'viewSelector', + title: 'View ID', + type: 'project-selector', + description: 'View UUID. Choices are locally filtered within at most 500 returned results.', + condition: { + field: 'operation', + value: [ + 'oracle_epm_edm_list_viewpoints', + 'oracle_epm_edm_list_node_types', + 'oracle_epm_edm_get_node_type', + 'oracle_epm_edm_list_nodes', + 'oracle_epm_edm_get_node', + 'oracle_epm_edm_get_node_at_location', + 'oracle_epm_edm_browse_hierarchy', + 'oracle_epm_edm_create_request', + ], + }, + required: { + field: 'operation', + value: [ + 'oracle_epm_edm_list_viewpoints', + 'oracle_epm_edm_list_node_types', + 'oracle_epm_edm_get_node_type', + 'oracle_epm_edm_list_nodes', + 'oracle_epm_edm_get_node', + 'oracle_epm_edm_get_node_at_location', + 'oracle_epm_edm_browse_hierarchy', + 'oracle_epm_edm_create_request', + ], + }, + canonicalParamId: 'viewId', + serviceId: 'oracle-epm-enterprise-data-management', + selectorKey: 'oracleEpmEdm.views', + dependsOn: ['credential'], + mode: 'basic', + placeholder: 'Select view', + }, + { + id: 'viewManual', + title: 'View ID', + type: 'short-input', + description: 'View UUID', + condition: { + field: 'operation', + value: [ + 'oracle_epm_edm_list_viewpoints', + 'oracle_epm_edm_list_node_types', + 'oracle_epm_edm_get_node_type', + 'oracle_epm_edm_list_nodes', + 'oracle_epm_edm_get_node', + 'oracle_epm_edm_get_node_at_location', + 'oracle_epm_edm_browse_hierarchy', + 'oracle_epm_edm_create_request', + ], + }, + required: { + field: 'operation', + value: [ + 'oracle_epm_edm_list_viewpoints', + 'oracle_epm_edm_list_node_types', + 'oracle_epm_edm_get_node_type', + 'oracle_epm_edm_list_nodes', + 'oracle_epm_edm_get_node', + 'oracle_epm_edm_get_node_at_location', + 'oracle_epm_edm_browse_hierarchy', + 'oracle_epm_edm_create_request', + ], + }, + canonicalParamId: 'viewId', + mode: 'advanced', + placeholder: 'Enter View UUID', + }, + { + id: 'viewpointSelector', + title: 'Viewpoint ID', + type: 'project-selector', + description: + 'Viewpoint UUID. Choices are locally filtered within at most 500 returned results.', + condition: { + field: 'operation', + value: [ + 'oracle_epm_edm_list_node_types', + 'oracle_epm_edm_get_node_type', + 'oracle_epm_edm_list_nodes', + 'oracle_epm_edm_get_node', + 'oracle_epm_edm_get_node_at_location', + 'oracle_epm_edm_browse_hierarchy', + ], + }, + required: { + field: 'operation', + value: [ + 'oracle_epm_edm_list_node_types', + 'oracle_epm_edm_get_node_type', + 'oracle_epm_edm_list_nodes', + 'oracle_epm_edm_get_node', + 'oracle_epm_edm_get_node_at_location', + 'oracle_epm_edm_browse_hierarchy', + ], + }, + canonicalParamId: 'viewpointId', + serviceId: 'oracle-epm-enterprise-data-management', + selectorKey: 'oracleEpmEdm.viewpoints', + dependsOn: ['credential', 'viewId'], + mode: 'basic', + placeholder: 'Select viewpoint', + }, + { + id: 'viewpointManual', + title: 'Viewpoint ID', + type: 'short-input', + description: 'Viewpoint UUID', + condition: { + field: 'operation', + value: [ + 'oracle_epm_edm_list_node_types', + 'oracle_epm_edm_get_node_type', + 'oracle_epm_edm_list_nodes', + 'oracle_epm_edm_get_node', + 'oracle_epm_edm_get_node_at_location', + 'oracle_epm_edm_browse_hierarchy', + ], + }, + required: { + field: 'operation', + value: [ + 'oracle_epm_edm_list_node_types', + 'oracle_epm_edm_get_node_type', + 'oracle_epm_edm_list_nodes', + 'oracle_epm_edm_get_node', + 'oracle_epm_edm_get_node_at_location', + 'oracle_epm_edm_browse_hierarchy', + ], + }, + canonicalParamId: 'viewpointId', + mode: 'advanced', + placeholder: 'Enter Viewpoint UUID', + }, + { + id: 'nodeTypeSelector', + title: 'Node Type ID', + type: 'project-selector', + description: + 'Node-type UUID assigned to the selected viewpoint. Choices are locally filtered within at most 500 returned results.', + condition: { field: 'operation', value: ['oracle_epm_edm_get_node_type'] }, + required: { field: 'operation', value: ['oracle_epm_edm_get_node_type'] }, + canonicalParamId: 'nodeTypeId', + serviceId: 'oracle-epm-enterprise-data-management', + selectorKey: 'oracleEpmEdm.nodeTypes', + dependsOn: ['credential', 'viewId', 'viewpointId'], + mode: 'basic', + placeholder: 'Select node type', + }, + { + id: 'nodeTypeManual', + title: 'Node Type ID', + type: 'short-input', + description: 'Node-type UUID assigned to the selected viewpoint', + condition: { field: 'operation', value: ['oracle_epm_edm_get_node_type'] }, + required: { field: 'operation', value: ['oracle_epm_edm_get_node_type'] }, + canonicalParamId: 'nodeTypeId', + mode: 'advanced', + placeholder: 'Enter Node-type UUID assigned to the selected viewpoint', + }, + { + id: 'scope', + title: 'Scope', + type: 'dropdown', + description: + 'Node listing scope (default top); children requires parentNodeId, request requires requestId', + condition: { field: 'operation', value: ['oracle_epm_edm_list_nodes'] }, + options: [ + { label: 'top', id: 'top' }, + { label: 'all', id: 'all' }, + { label: 'children', id: 'children' }, + { label: 'request', id: 'request' }, + ], + value: () => 'top', + }, + { + id: 'parentNodeId', + title: 'Parent Node ID', + type: 'short-input', + description: 'Parent node UUID for children scope only', + condition: { + field: 'operation', + value: 'oracle_epm_edm_list_nodes', + and: { field: 'scope', value: 'children' }, + }, + placeholder: 'Parent node UUID for children scope only', + required: true, + }, + { + id: 'requestSelector', + title: 'Request ID', + type: 'project-selector', + description: + 'Request UUID; for node listing it requires request scope. Choices are locally filtered within at most 500 returned results.', + condition: (values) => requestIdCondition(values, false), + required: (values) => requestIdCondition(values, true), + canonicalParamId: 'requestId', + serviceId: 'oracle-epm-enterprise-data-management', + selectorKey: 'oracleEpmEdm.requests', + dependsOn: ['credential'], + mode: 'basic', + placeholder: 'Select request', + }, + { + id: 'requestManual', + title: 'Request ID', + type: 'short-input', + description: 'Request UUID; for node listing it requires request scope', + condition: (values) => requestIdCondition(values, false), + required: (values) => requestIdCondition(values, true), + canonicalParamId: 'requestId', + mode: 'advanced', + placeholder: 'Enter Request UUID; for node listing it requires request scope', + }, + { + id: 'expand', + title: 'Expand', + type: 'dropdown', + description: 'One documented node expansion', + condition: { + field: 'operation', + value: [ + 'oracle_epm_edm_list_nodes', + 'oracle_epm_edm_get_node', + 'oracle_epm_edm_get_node_at_location', + ], + }, + options: [ + { label: 'propertyValues::none', id: 'propertyValues::none' }, + { label: 'propertyValues::all', id: 'propertyValues::all' }, + { label: 'propertyValues::columnVisible', id: 'propertyValues::columnVisible' }, + { label: 'propertyValues::locationVisible', id: 'propertyValues::locationVisible' }, + { label: 'requestItem.validations', id: 'requestItem.validations' }, + { label: 'bestLocationRtl', id: 'bestLocationRtl' }, + ], + mode: 'advanced', + }, + { + id: 'limit', + title: 'Limit', + type: 'short-input', + description: 'Node page size (1-100; default 50)', + condition: { field: 'operation', value: ['oracle_epm_edm_list_nodes'] }, + placeholder: 'Node page size (1-100; default 50)', + mode: 'advanced', + }, + { + id: 'offset', + title: 'Offset', + type: 'short-input', + description: 'Node page offset (0-1000000; default 0)', + condition: { field: 'operation', value: ['oracle_epm_edm_list_nodes'] }, + placeholder: 'Node page offset (0-1000000; default 0)', + mode: 'advanced', + }, + { + id: 'fromId', + title: 'From ID', + type: 'short-input', + description: + 'Nodes after this node UUID; append * to include it, or use first. Cannot combine with toId.', + condition: { field: 'operation', value: ['oracle_epm_edm_list_nodes'] }, + placeholder: + 'Nodes after this node UUID; append * to include it, or use first. Cannot combine with toId.', + mode: 'advanced', + }, + { + id: 'toId', + title: 'To ID', + type: 'short-input', + description: + 'Nodes before this node UUID; append * to include it, or use last. Cannot combine with fromId.', + condition: { field: 'operation', value: ['oracle_epm_edm_list_nodes'] }, + placeholder: + 'Nodes before this node UUID; append * to include it, or use last. Cannot combine with fromId.', + mode: 'advanced', + }, + { + id: 'orderBy', + title: 'Order By', + type: 'dropdown', + description: 'Hierarchy-set node order', + condition: { field: 'operation', value: ['oracle_epm_edm_list_nodes'] }, + options: [ + { label: 'hsConfig:asc', id: 'hsConfig:asc' }, + { label: 'hsConfig:desc', id: 'hsConfig:desc' }, + ], + mode: 'advanced', + }, + { + id: 'nodeId', + title: 'Node ID', + type: 'short-input', + description: 'Node UUID', + condition: { + field: 'operation', + value: ['oracle_epm_edm_get_node', 'oracle_epm_edm_get_node_at_location'], + }, + required: { + field: 'operation', + value: ['oracle_epm_edm_get_node', 'oracle_epm_edm_get_node_at_location'], + }, + placeholder: 'Node UUID', + }, + { + id: 'location', + title: 'Location', + type: 'short-input', + description: 'Comma-separated ancestor/node UUIDs, root first (maximum 255 characters)', + condition: { field: 'operation', value: ['oracle_epm_edm_get_node_at_location'] }, + required: { field: 'operation', value: ['oracle_epm_edm_get_node_at_location'] }, + placeholder: 'Comma-separated ancestor/node UUIDs, root first (maximum 255 characters)', + wandConfig: { + enabled: true, + prompt: + 'Format only the supplied ancestor and node UUIDs in root-first order, separated by commas. Do not invent missing IDs. Return ONLY the comma-separated UUID list.', + placeholder: 'Paste node UUIDs in root-first order...', + }, + }, + { + id: 'maxDepth', + title: 'Max Depth', + type: 'short-input', + description: 'Maximum traversal depth (0-3; default 2); roots have depth zero', + condition: { field: 'operation', value: ['oracle_epm_edm_browse_hierarchy'] }, + placeholder: 'Maximum traversal depth (0-3; default 2); roots have depth zero', + mode: 'advanced', + }, + { + id: 'maxNodes', + title: 'Max Nodes', + type: 'short-input', + description: 'Maximum hierarchy occurrences (1-500; default 200)', + condition: { field: 'operation', value: ['oracle_epm_edm_browse_hierarchy'] }, + placeholder: 'Maximum hierarchy occurrences (1-500; default 200)', + mode: 'advanced', + }, + { + id: 'pageSize', + title: 'Page Size', + type: 'short-input', + description: 'Hierarchy provider page size (1-100; default 50)', + condition: { field: 'operation', value: ['oracle_epm_edm_browse_hierarchy'] }, + placeholder: 'Hierarchy provider page size (1-100; default 50)', + mode: 'advanced', + }, + { + id: 'maxRequests', + title: 'Max Requests', + type: 'short-input', + description: 'Maximum hierarchy provider requests (1-100; default 50)', + condition: { field: 'operation', value: ['oracle_epm_edm_browse_hierarchy'] }, + placeholder: 'Maximum hierarchy provider requests (1-100; default 50)', + mode: 'advanced', + }, + { + id: 'title', + title: 'Title', + type: 'short-input', + description: 'Request title', + condition: { field: 'operation', value: ['oracle_epm_edm_create_request'] }, + placeholder: 'Request title', + }, + { + id: 'description', + title: 'Description', + type: 'long-input', + description: 'Request description', + condition: { field: 'operation', value: ['oracle_epm_edm_create_request'] }, + placeholder: 'Request description', + mode: 'advanced', + }, + { + id: 'notes', + title: 'Notes', + type: 'long-input', + description: 'Request notes', + condition: { field: 'operation', value: ['oracle_epm_edm_create_request'] }, + placeholder: 'Request notes', + mode: 'advanced', + }, + { + id: 'priority', + title: 'Priority', + type: 'dropdown', + description: 'Priority for a new request', + condition: { field: 'operation', value: ['oracle_epm_edm_create_request'] }, + options: [ + { label: 'NONE', id: 'NONE' }, + { label: 'LOW', id: 'LOW' }, + { label: 'MEDIUM', id: 'MEDIUM' }, + { label: 'HIGH', id: 'HIGH' }, + ], + mode: 'advanced', + }, + { + id: 'queryPriority', + title: 'Query Priority', + type: 'dropdown', + description: 'One request priority filter', + condition: { field: 'operation', value: ['oracle_epm_edm_query_requests'] }, + options: [ + { label: 'None', id: 'None' }, + { label: 'Low', id: 'Low' }, + { label: 'Medium', id: 'Medium' }, + { label: 'High', id: 'High' }, + ], + mode: 'advanced', + }, + { + id: 'timeLabelName', + title: 'Time Label Name', + type: 'short-input', + description: 'Time label name; request queries support one value', + condition: { + field: 'operation', + value: ['oracle_epm_edm_create_request', 'oracle_epm_edm_query_requests'], + }, + placeholder: 'Time label name; request queries support one value', + mode: 'advanced', + }, + { + id: 'lastDays', + title: 'Last Days', + type: 'short-input', + description: 'Previous days to query (1-90; default 30 when no explicit dates are supplied)', + condition: { field: 'operation', value: ['oracle_epm_edm_query_requests'] }, + placeholder: 'Previous days to query (1-90; default 30 when no explicit dates are supplied)', + }, + { + id: 'fromDate', + title: 'From Date', + type: 'short-input', + description: + 'Inclusive start in epoch seconds; provide with toDate, without lastDays, within 90 days', + condition: { field: 'operation', value: ['oracle_epm_edm_query_requests'] }, + placeholder: + 'Inclusive start in epoch seconds; provide with toDate, without lastDays, within 90 days', + mode: 'advanced', + wandConfig: { + enabled: true, + generationType: 'timestamp', + prompt: + 'Convert the requested date/time to Unix epoch seconds, not milliseconds. Return ONLY the integer epoch seconds.', + placeholder: 'Describe the date and time...', + }, + }, + { + id: 'toDate', + title: 'To Date', + type: 'short-input', + description: 'End in epoch seconds; provide with fromDate, without lastDays, within 90 days', + condition: { field: 'operation', value: ['oracle_epm_edm_query_requests'] }, + placeholder: 'End in epoch seconds; provide with fromDate, without lastDays, within 90 days', + mode: 'advanced', + wandConfig: { + enabled: true, + generationType: 'timestamp', + prompt: + 'Convert the requested date/time to Unix epoch seconds, not milliseconds. Return ONLY the integer epoch seconds.', + placeholder: 'Describe the date and time...', + }, + }, + { + id: 'myActivity', + title: 'My Activity', + type: 'dropdown', + description: 'One activity filter', + condition: { field: 'operation', value: ['oracle_epm_edm_query_requests'] }, + options: [ + { label: 'Assigned', id: 'Assigned' }, + { label: 'Collaborated', id: 'Collaborated' }, + { label: 'Submitted', id: 'Submitted' }, + { label: 'Invited', id: 'Invited' }, + { label: 'Contributed', id: 'Contributed' }, + { label: 'Managed', id: 'Managed' }, + ], + mode: 'advanced', + }, + { + id: 'owner', + title: 'Owner', + type: 'short-input', + description: 'One request owner name', + condition: { field: 'operation', value: ['oracle_epm_edm_query_requests'] }, + placeholder: 'One request owner name', + mode: 'advanced', + }, + { + id: 'requestNumber', + title: 'Request Number', + type: 'short-input', + description: 'Positive Oracle request number, not request UUID', + condition: { + field: 'operation', + value: [ + 'oracle_epm_edm_query_requests', + 'oracle_epm_edm_assign_request', + 'oracle_epm_edm_validate_viewpoint', + 'oracle_epm_edm_extract_dimension_viewpoint', + ], + }, + required: { field: 'operation', value: ['oracle_epm_edm_assign_request'] }, + placeholder: 'Positive Oracle request number, not request UUID', + }, + { + id: 'requestType', + title: 'Request Type', + type: 'dropdown', + description: 'One request-type filter', + condition: { field: 'operation', value: ['oracle_epm_edm_query_requests'] }, + options: [ + { label: 'Interactive', id: 'Interactive' }, + { label: 'Subscription', id: 'Subscription' }, + { label: 'Import', id: 'Import' }, + { label: 'Consolidation', id: 'Consolidation' }, + ], + mode: 'advanced', + }, + { + id: 'stage', + title: 'Stage', + type: 'dropdown', + description: 'One request-stage query filter, using Oracle query spelling', + condition: { field: 'operation', value: ['oracle_epm_edm_query_requests'] }, + options: [ + { label: 'Submit', id: 'Submit' }, + { label: 'Approved', id: 'Approved' }, + { label: 'Commit', id: 'Commit' }, + { label: 'Closed', id: 'Closed' }, + ], + mode: 'advanced', + }, + { + id: 'status', + title: 'Status', + type: 'dropdown', + description: 'One request-status query filter', + condition: { field: 'operation', value: ['oracle_epm_edm_query_requests'] }, + options: [ + { label: 'Draft', id: 'Draft' }, + { label: 'In Flight', id: 'In Flight' }, + { label: 'Recalled', id: 'Recalled' }, + { label: 'Pushed Back', id: 'Pushed Back' }, + { label: 'Completed', id: 'Completed' }, + { label: 'Rejected', id: 'Rejected' }, + { label: 'Blocked', id: 'Blocked' }, + { label: 'Consolidated', id: 'Consolidated' }, + ], + mode: 'advanced', + }, + { + id: 'viewName', + title: 'View Name', + type: 'short-input', + description: 'View name; request queries accept one value', + condition: { + field: 'operation', + value: [ + 'oracle_epm_edm_query_requests', + 'oracle_epm_edm_validate_viewpoint', + 'oracle_epm_edm_load_viewpoint', + ], + }, + required: { + field: 'operation', + value: ['oracle_epm_edm_validate_viewpoint', 'oracle_epm_edm_load_viewpoint'], + }, + placeholder: 'View name; request queries accept one value', + }, + { + id: 'expandWorkflow', + title: 'Expand Workflow', + type: 'switch', + description: 'Include documented workflow information in request queries', + condition: { field: 'operation', value: ['oracle_epm_edm_query_requests'] }, + mode: 'advanced', + }, + { + id: 'userName', + title: 'User Name', + type: 'short-input', + description: 'Oracle user name to receive the request', + condition: { field: 'operation', value: ['oracle_epm_edm_assign_request'] }, + required: { field: 'operation', value: ['oracle_epm_edm_assign_request'] }, + placeholder: 'Oracle user name to receive the request', + }, + { + id: 'comment', + title: 'Comment', + type: 'long-input', + description: 'Workflow or assignment comment', + condition: { + field: 'operation', + value: ['oracle_epm_edm_assign_request', 'oracle_epm_edm_transition_request'], + }, + placeholder: 'Workflow or assignment comment', + mode: 'advanced', + }, + { + id: 'fileUpload', + title: 'File', + type: 'file-upload', + description: + 'One uploaded Sim UserFile; imports/loads may omit this to use an existing staged file', + condition: { + field: 'operation', + value: [ + 'oracle_epm_edm_upload_request_attachment', + 'oracle_epm_edm_import_dimension', + 'oracle_epm_edm_load_viewpoint', + ], + }, + required: { field: 'operation', value: ['oracle_epm_edm_upload_request_attachment'] }, + canonicalParamId: 'file', + mode: 'basic', + multiple: false, + canvasNoun: 'a file', + placeholder: 'Upload one file (up to 95 MiB)', + }, + { + id: 'fileReference', + title: 'File', + type: 'short-input', + description: + 'One uploaded Sim UserFile; imports/loads may omit this to use an existing staged file', + condition: { + field: 'operation', + value: [ + 'oracle_epm_edm_upload_request_attachment', + 'oracle_epm_edm_import_dimension', + 'oracle_epm_edm_load_viewpoint', + ], + }, + required: { field: 'operation', value: ['oracle_epm_edm_upload_request_attachment'] }, + canonicalParamId: 'file', + mode: 'advanced', + canvasNoun: 'a file', + placeholder: 'Reference a file from a previous block', + }, + { + id: 'fileName', + title: 'File Name', + type: 'short-input', + description: 'Single Oracle staging, attachment, or output file name; no directory path', + condition: { + field: 'operation', + value: [ + 'oracle_epm_edm_upload_request_attachment', + 'oracle_epm_edm_generate_request_attachment', + 'oracle_epm_edm_get_job_result', + 'oracle_epm_edm_validate_viewpoint', + 'oracle_epm_edm_export_mappings', + 'oracle_epm_edm_import_dimension', + 'oracle_epm_edm_load_viewpoint', + 'oracle_epm_edm_export_dimension', + 'oracle_epm_edm_incremental_export_dimension', + 'oracle_epm_edm_extract_dimension_viewpoint', + ], + }, + required: { + field: 'operation', + value: [ + 'oracle_epm_edm_generate_request_attachment', + 'oracle_epm_edm_validate_viewpoint', + 'oracle_epm_edm_export_mappings', + 'oracle_epm_edm_import_dimension', + 'oracle_epm_edm_load_viewpoint', + 'oracle_epm_edm_export_dimension', + 'oracle_epm_edm_incremental_export_dimension', + 'oracle_epm_edm_extract_dimension_viewpoint', + ], + }, + placeholder: 'Single Oracle staging, attachment, or output file name; no directory path', + }, + { + id: 'items', + title: 'Items', + type: 'code', + description: 'Attachment rows: each has viewpoint and data cells with header and value', + condition: { field: 'operation', value: ['oracle_epm_edm_generate_request_attachment'] }, + required: { field: 'operation', value: ['oracle_epm_edm_generate_request_attachment'] }, + language: 'json', + placeholder: '[{"viewpoint":"Accounts","data":[{"header":"Name","value":"Account1"}]}]', + wandConfig: { + enabled: true, + generationType: 'json-array', + prompt: + 'Format the user-supplied EDM items as a JSON array like [{"viewpoint":"Accounts","data":[{"header":"Name","value":"Account1"}]}]. Use only supplied names/values; do not invent data. Return ONLY the JSON array.', + placeholder: 'Describe or paste the values...', + }, + }, + { + id: 'overwrite', + title: 'Overwrite', + type: 'dropdown', + description: + 'Whether to overwrite an existing generated request attachment; false is preserved', + condition: { field: 'operation', value: ['oracle_epm_edm_generate_request_attachment'] }, + options: [ + { label: 'Yes', id: 'true' }, + { label: 'No', id: 'false' }, + ], + mode: 'advanced', + }, + { + id: 'waitForCompletion', + title: 'Wait For Completion', + type: 'switch', + description: 'Wait for the Oracle job (default true); false returns the job ID immediately', + condition: { + field: 'operation', + value: [ + 'oracle_epm_edm_generate_request_attachment', + 'oracle_epm_edm_import_request_attachment', + 'oracle_epm_edm_transition_request', + 'oracle_epm_edm_validate_viewpoint', + 'oracle_epm_edm_export_mappings', + 'oracle_epm_edm_import_dimension', + 'oracle_epm_edm_load_viewpoint', + 'oracle_epm_edm_export_dimension', + 'oracle_epm_edm_incremental_export_dimension', + 'oracle_epm_edm_extract_dimension_viewpoint', + ], + }, + defaultValue: true, + }, + { + id: 'maxWaitSeconds', + title: 'Max Wait Seconds', + type: 'short-input', + description: + 'Maximum local wait (1-240 seconds; default 120); timeout does not cancel the remote job', + condition: { + field: 'operation', + value: [ + 'oracle_epm_edm_generate_request_attachment', + 'oracle_epm_edm_import_request_attachment', + 'oracle_epm_edm_transition_request', + 'oracle_epm_edm_validate_viewpoint', + 'oracle_epm_edm_export_mappings', + 'oracle_epm_edm_import_dimension', + 'oracle_epm_edm_load_viewpoint', + 'oracle_epm_edm_export_dimension', + 'oracle_epm_edm_incremental_export_dimension', + 'oracle_epm_edm_extract_dimension_viewpoint', + ], + }, + placeholder: + 'Maximum local wait (1-240 seconds; default 120); timeout does not cancel the remote job', + mode: 'advanced', + }, + { + id: 'attachmentId', + title: 'Attachment ID', + type: 'short-input', + description: 'Saved request attachment UUID', + condition: { field: 'operation', value: ['oracle_epm_edm_import_request_attachment'] }, + required: { field: 'operation', value: ['oracle_epm_edm_import_request_attachment'] }, + placeholder: 'Saved request attachment UUID', + }, + { + id: 'sheetNames', + title: 'Sheet Names', + type: 'code', + description: 'Non-empty array of attachment sheet names to import', + condition: { field: 'operation', value: ['oracle_epm_edm_import_request_attachment'] }, + required: { field: 'operation', value: ['oracle_epm_edm_import_request_attachment'] }, + language: 'json', + placeholder: '["Name"]', + wandConfig: { + enabled: true, + generationType: 'json-array', + prompt: + 'Format the user-supplied EDM sheetNames as a JSON array like ["Accounts"]. Use only supplied names/values; do not invent data. Return ONLY the JSON array.', + placeholder: 'Describe or paste the values...', + }, + }, + { + id: 'action', + title: 'Action', + type: 'dropdown', + description: 'Requested workflow action; inspect validTransitionActions before choosing', + condition: { field: 'operation', value: ['oracle_epm_edm_transition_request'] }, + required: { field: 'operation', value: ['oracle_epm_edm_transition_request'] }, + options: [ + { label: 'SUBMIT', id: 'SUBMIT' }, + { label: 'APPROVE', id: 'APPROVE' }, + { label: 'PUSHBACK', id: 'PUSHBACK' }, + { label: 'REJECT', id: 'REJECT' }, + { label: 'WITHDRAW', id: 'WITHDRAW' }, + { label: 'RECALL', id: 'RECALL' }, + { label: 'COMMIT', id: 'COMMIT' }, + { label: 'CLOSE', id: 'CLOSE' }, + ], + }, + { + id: 'transitionWithWarning', + title: 'Transition With Warning', + type: 'dropdown', + description: 'Whether to allow the transition with validation warnings; false is preserved', + condition: { field: 'operation', value: ['oracle_epm_edm_transition_request'] }, + options: [ + { label: 'Yes', id: 'true' }, + { label: 'No', id: 'false' }, + ], + mode: 'advanced', + }, + { + id: 'jobRunId', + title: 'Job Run ID', + type: 'short-input', + description: 'Oracle job UUID', + condition: { + field: 'operation', + value: ['oracle_epm_edm_get_job_status', 'oracle_epm_edm_get_job_result'], + }, + required: { + field: 'operation', + value: ['oracle_epm_edm_get_job_status', 'oracle_epm_edm_get_job_result'], + }, + placeholder: 'Oracle job UUID', + }, + { + id: 'downloadFile', + title: 'Download File', + type: 'switch', + description: + 'Download a completed job file alongside its opaque result; supply the original staging file name when no file link is advertised (default false)', + condition: { field: 'operation', value: ['oracle_epm_edm_get_job_result'] }, + mode: 'advanced', + }, + { + id: 'viewpointName', + title: 'Viewpoint Name', + type: 'short-input', + description: 'Viewpoint name', + condition: { + field: 'operation', + value: ['oracle_epm_edm_validate_viewpoint', 'oracle_epm_edm_load_viewpoint'], + }, + required: { + field: 'operation', + value: ['oracle_epm_edm_validate_viewpoint', 'oracle_epm_edm_load_viewpoint'], + }, + placeholder: 'Viewpoint name', + }, + { + id: 'bindingId', + title: 'Binding ID', + type: 'short-input', + description: 'Dimension binding UUID', + condition: { field: 'operation', value: ['oracle_epm_edm_get_mapping_keys'] }, + required: { field: 'operation', value: ['oracle_epm_edm_get_mapping_keys'] }, + placeholder: 'Dimension binding UUID', + }, + { + id: 'applicationName', + title: 'Application Name', + type: 'short-input', + description: "Exact application name for Oracle's byName endpoint", + condition: { + field: 'operation', + value: [ + 'oracle_epm_edm_export_mappings', + 'oracle_epm_edm_import_dimension', + 'oracle_epm_edm_export_dimension', + 'oracle_epm_edm_incremental_export_dimension', + 'oracle_epm_edm_extract_dimension_viewpoint', + ], + }, + required: { + field: 'operation', + value: [ + 'oracle_epm_edm_export_mappings', + 'oracle_epm_edm_import_dimension', + 'oracle_epm_edm_export_dimension', + 'oracle_epm_edm_incremental_export_dimension', + 'oracle_epm_edm_extract_dimension_viewpoint', + ], + }, + placeholder: "Exact application name for Oracle's byName endpoint", + }, + { + id: 'dimensionName', + title: 'Dimension Name', + type: 'short-input', + description: "Exact dimension name for Oracle's byName endpoint", + condition: { + field: 'operation', + value: [ + 'oracle_epm_edm_export_mappings', + 'oracle_epm_edm_import_dimension', + 'oracle_epm_edm_export_dimension', + 'oracle_epm_edm_incremental_export_dimension', + 'oracle_epm_edm_extract_dimension_viewpoint', + ], + }, + required: { + field: 'operation', + value: [ + 'oracle_epm_edm_export_mappings', + 'oracle_epm_edm_import_dimension', + 'oracle_epm_edm_export_dimension', + 'oracle_epm_edm_incremental_export_dimension', + 'oracle_epm_edm_extract_dimension_viewpoint', + ], + }, + placeholder: "Exact dimension name for Oracle's byName endpoint", + }, + { + id: 'mappingLocation', + title: 'Mapping Location', + type: 'short-input', + description: 'Mapping location from Get Mapping Keys', + condition: { field: 'operation', value: ['oracle_epm_edm_export_mappings'] }, + required: { field: 'operation', value: ['oracle_epm_edm_export_mappings'] }, + placeholder: 'Mapping location from Get Mapping Keys', + }, + { + id: 'connection', + title: 'Connection', + type: 'short-input', + description: + 'Configured Oracle connection; omit to use staging and, for exports, return a Sim file', + condition: { + field: 'operation', + value: [ + 'oracle_epm_edm_export_mappings', + 'oracle_epm_edm_import_dimension', + 'oracle_epm_edm_export_dimension', + 'oracle_epm_edm_extract_dimension_viewpoint', + ], + }, + placeholder: + 'Configured Oracle connection; omit to use staging and, for exports, return a Sim file', + mode: 'advanced', + }, + { + id: 'importOption', + title: 'Import Option', + type: 'dropdown', + description: 'Required import mode; no destructive provider default is applied', + condition: { field: 'operation', value: ['oracle_epm_edm_import_dimension'] }, + required: { field: 'operation', value: ['oracle_epm_edm_import_dimension'] }, + options: [ + { label: 'ResetDimension', id: 'ResetDimension' }, + { label: 'ReplaceNodes', id: 'ReplaceNodes' }, + { label: 'Merge', id: 'Merge' }, + ], + }, + { + id: 'purpose', + title: 'Purpose', + type: 'short-input', + description: 'Purpose or reason for loading the viewpoint', + condition: { field: 'operation', value: ['oracle_epm_edm_load_viewpoint'] }, + required: { field: 'operation', value: ['oracle_epm_edm_load_viewpoint'] }, + placeholder: 'Purpose or reason for loading the viewpoint', + }, + { + id: 'loadOption', + title: 'Load Option', + type: 'dropdown', + description: 'Required load mode; no provider default is applied', + condition: { field: 'operation', value: ['oracle_epm_edm_load_viewpoint'] }, + required: { field: 'operation', value: ['oracle_epm_edm_load_viewpoint'] }, + options: [ + { label: 'ReplaceNodes', id: 'ReplaceNodes' }, + { label: 'Merge', id: 'Merge' }, + ], + }, + { + id: 'bindingNames', + title: 'Binding Names', + type: 'code', + description: 'Non-empty array of dimension binding names', + condition: { field: 'operation', value: ['oracle_epm_edm_incremental_export_dimension'] }, + required: { field: 'operation', value: ['oracle_epm_edm_incremental_export_dimension'] }, + language: 'json', + placeholder: '["Name"]', + wandConfig: { + enabled: true, + generationType: 'json-array', + prompt: + 'Format the user-supplied EDM bindingNames as a JSON array like ["Corporate Account"]. Use only supplied names/values; do not invent data. Return ONLY the JSON array.', + placeholder: 'Describe or paste the values...', + }, + }, + { + id: 'nodeChangeTypes', + title: 'Node Change Types', + type: 'code', + description: 'Node changes to export: NEW, UPDATED, or both', + condition: { field: 'operation', value: ['oracle_epm_edm_incremental_export_dimension'] }, + required: { field: 'operation', value: ['oracle_epm_edm_incremental_export_dimension'] }, + language: 'json', + placeholder: '["NEW","UPDATED"]', + wandConfig: { + enabled: true, + generationType: 'json-array', + prompt: + 'Format the user-supplied EDM nodeChangeTypes as a JSON array like ["NEW","UPDATED"]. Use only supplied names/values; do not invent data. Return ONLY the JSON array.', + placeholder: 'Describe or paste the values...', + }, + }, + { + id: 'since', + title: 'Since', + type: 'short-input', + description: + 'Raw Oracle incremental timestamp; units are undocumented. Supply a tenant-confirmed value or use sinceLastExportOfType; no conversion is applied', + condition: { field: 'operation', value: ['oracle_epm_edm_incremental_export_dimension'] }, + placeholder: + 'Raw Oracle incremental timestamp; units are undocumented. Supply a tenant-confirmed value or use sinceLastExportOfType; no conversion is applied', + mode: 'advanced', + }, + { + id: 'sinceLastExportOfType', + title: 'Since Last Export Of Type', + type: 'dropdown', + description: + 'Use a previous export as the incremental boundary; mutually exclusive with since', + condition: { field: 'operation', value: ['oracle_epm_edm_incremental_export_dimension'] }, + options: [ + { label: 'FULL', id: 'FULL' }, + { label: 'INCREMENTAL', id: 'INCREMENTAL' }, + ], + }, + { + id: 'connectionName', + title: 'Connection Name', + type: 'short-input', + description: + 'Configured Oracle connection name; omit to export to staging and return a Sim file', + condition: { field: 'operation', value: ['oracle_epm_edm_incremental_export_dimension'] }, + placeholder: + 'Configured Oracle connection name; omit to export to staging and return a Sim file', + mode: 'advanced', + }, + { + id: 'extractName', + title: 'Extract Name', + type: 'short-input', + description: 'Name of the configured dimension viewpoint extract', + condition: { field: 'operation', value: ['oracle_epm_edm_extract_dimension_viewpoint'] }, + required: { field: 'operation', value: ['oracle_epm_edm_extract_dimension_viewpoint'] }, + placeholder: 'Name of the configured dimension viewpoint extract', + }, + { + id: 'fromTime', + title: 'From Time', + type: 'short-input', + description: 'Oracle-supported start timestamp (UTC, offset, or region format)', + condition: { field: 'operation', value: ['oracle_epm_edm_extract_dimension_viewpoint'] }, + placeholder: 'Oracle-supported start timestamp (UTC, offset, or region format)', + mode: 'advanced', + wandConfig: { + enabled: true, + generationType: 'timestamp', + prompt: + 'Generate a UTC timestamp in YYYY-MM-DDTHH:MM:SS format. Return ONLY the timestamp string.', + placeholder: 'Describe the date and time...', + }, + }, + { + id: 'toTime', + title: 'To Time', + type: 'short-input', + description: 'Oracle-supported end timestamp (UTC, offset, or region format)', + condition: { field: 'operation', value: ['oracle_epm_edm_extract_dimension_viewpoint'] }, + placeholder: 'Oracle-supported end timestamp (UTC, offset, or region format)', + mode: 'advanced', + wandConfig: { + enabled: true, + generationType: 'timestamp', + prompt: + 'Generate a UTC timestamp in YYYY-MM-DDTHH:MM:SS format. Return ONLY the timestamp string.', + placeholder: 'Describe the date and time...', + }, + }, + ], + tools: { + access: [ + 'oracle_epm_edm_list_applications', + 'oracle_epm_edm_list_dimensions', + 'oracle_epm_edm_list_views', + 'oracle_epm_edm_list_viewpoints', + 'oracle_epm_edm_list_node_types', + 'oracle_epm_edm_get_node_type', + 'oracle_epm_edm_list_nodes', + 'oracle_epm_edm_get_node', + 'oracle_epm_edm_get_node_at_location', + 'oracle_epm_edm_browse_hierarchy', + 'oracle_epm_edm_create_request', + 'oracle_epm_edm_get_request', + 'oracle_epm_edm_query_requests', + 'oracle_epm_edm_get_request_lineage', + 'oracle_epm_edm_assign_request', + 'oracle_epm_edm_delete_request', + 'oracle_epm_edm_upload_request_attachment', + 'oracle_epm_edm_generate_request_attachment', + 'oracle_epm_edm_import_request_attachment', + 'oracle_epm_edm_transition_request', + 'oracle_epm_edm_get_job_status', + 'oracle_epm_edm_get_job_result', + 'oracle_epm_edm_validate_viewpoint', + 'oracle_epm_edm_get_mapping_keys', + 'oracle_epm_edm_export_mappings', + 'oracle_epm_edm_import_dimension', + 'oracle_epm_edm_load_viewpoint', + 'oracle_epm_edm_export_dimension', + 'oracle_epm_edm_incremental_export_dimension', + 'oracle_epm_edm_extract_dimension_viewpoint', + ], + config: { tool: (params) => params.operation, params: operationParams }, + }, + inputs: { + operation: { type: 'string', description: 'EDM operation to perform' }, + oauthCredential: { type: 'string', description: 'Oracle EPM service-account credential' }, + applicationId: { type: 'string', description: 'Application UUID' }, + permission: { + type: 'string', + description: + 'One application permission: owner, datamanager, participant, or participant_with_write', + }, + maxResults: { + type: 'number', + description: + 'Maximum projected items (1-500; default 200). This is a local result cap, not provider pagination.', + }, + dimensionId: { type: 'string', description: 'Dimension UUID' }, + objectStatus: { type: 'string', description: 'One view status filter' }, + viewId: { type: 'string', description: 'View UUID' }, + viewpointId: { type: 'string', description: 'Viewpoint UUID' }, + nodeTypeId: { + type: 'string', + description: 'Node-type UUID assigned to the selected viewpoint', + }, + scope: { + type: 'string', + description: + 'Node listing scope (default top); children requires parentNodeId, request requires requestId', + }, + parentNodeId: { type: 'string', description: 'Parent node UUID for children scope only' }, + requestId: { + type: 'string', + description: 'Request UUID; for node listing it requires request scope', + }, + expand: { type: 'string', description: 'One documented node expansion' }, + limit: { type: 'number', description: 'Node page size (1-100; default 50)' }, + offset: { type: 'number', description: 'Node page offset (0-1000000; default 0)' }, + fromId: { + type: 'string', + description: + 'Nodes after this node UUID; append * to include it, or use first. Cannot combine with toId.', + }, + toId: { + type: 'string', + description: + 'Nodes before this node UUID; append * to include it, or use last. Cannot combine with fromId.', + }, + orderBy: { type: 'string', description: 'Hierarchy-set node order' }, + nodeId: { type: 'string', description: 'Node UUID' }, + location: { + type: 'string', + description: 'Comma-separated ancestor/node UUIDs, root first (maximum 255 characters)', + }, + maxDepth: { + type: 'number', + description: 'Maximum traversal depth (0-3; default 2); roots have depth zero', + }, + maxNodes: { type: 'number', description: 'Maximum hierarchy occurrences (1-500; default 200)' }, + pageSize: { type: 'number', description: 'Hierarchy provider page size (1-100; default 50)' }, + maxRequests: { + type: 'number', + description: 'Maximum hierarchy provider requests (1-100; default 50)', + }, + title: { type: 'string', description: 'Request title' }, + description: { type: 'string', description: 'Request description' }, + notes: { type: 'string', description: 'Request notes' }, + priority: { type: 'string', description: 'Priority for a new request' }, + queryPriority: { type: 'string', description: 'One request priority filter' }, + timeLabelName: { + type: 'string', + description: 'Time label name; request queries support one value', + }, + lastDays: { + type: 'number', + description: 'Previous days to query (1-90; default 30 when no explicit dates are supplied)', + }, + fromDate: { + type: 'number', + description: + 'Inclusive start in epoch seconds; provide with toDate, without lastDays, within 90 days', + }, + toDate: { + type: 'number', + description: 'End in epoch seconds; provide with fromDate, without lastDays, within 90 days', + }, + myActivity: { type: 'string', description: 'One activity filter' }, + owner: { type: 'string', description: 'One request owner name' }, + requestNumber: { + type: 'number', + description: 'Positive Oracle request number, not request UUID', + }, + requestType: { type: 'string', description: 'One request-type filter' }, + stage: { + type: 'string', + description: 'One request-stage query filter, using Oracle query spelling', + }, + status: { type: 'string', description: 'One request-status query filter' }, + viewName: { type: 'string', description: 'View name; request queries accept one value' }, + expandWorkflow: { + type: 'boolean', + description: 'Include documented workflow information in request queries', + }, + userName: { type: 'string', description: 'Oracle user name to receive the request' }, + comment: { type: 'string', description: 'Workflow or assignment comment' }, + file: { + type: 'file', + description: + 'One uploaded Sim UserFile; imports/loads may omit this to use an existing staged file', + }, + fileName: { + type: 'string', + description: 'Single Oracle staging, attachment, or output file name; no directory path', + }, + items: { + type: 'array', + description: 'Attachment rows: each has viewpoint and data cells with header and value', + }, + overwrite: { + type: 'boolean', + description: + 'Whether to overwrite an existing generated request attachment; false is preserved', + }, + waitForCompletion: { + type: 'boolean', + description: 'Wait for the Oracle job (default true); false returns the job ID immediately', + }, + maxWaitSeconds: { + type: 'number', + description: + 'Maximum local wait (1-240 seconds; default 120); timeout does not cancel the remote job', + }, + attachmentId: { type: 'string', description: 'Saved request attachment UUID' }, + sheetNames: { + type: 'array', + description: 'Non-empty array of attachment sheet names to import', + }, + action: { + type: 'string', + description: 'Requested workflow action; inspect validTransitionActions before choosing', + }, + transitionWithWarning: { + type: 'boolean', + description: 'Whether to allow the transition with validation warnings; false is preserved', + }, + jobRunId: { type: 'string', description: 'Oracle job UUID' }, + downloadFile: { + type: 'boolean', + description: + 'Download a completed job file alongside its opaque result; supply the original staging file name when no file link is advertised (default false)', + }, + viewpointName: { type: 'string', description: 'Viewpoint name' }, + bindingId: { type: 'string', description: 'Dimension binding UUID' }, + applicationName: { + type: 'string', + description: "Exact application name for Oracle's byName endpoint", + }, + dimensionName: { + type: 'string', + description: "Exact dimension name for Oracle's byName endpoint", + }, + mappingLocation: { type: 'string', description: 'Mapping location from Get Mapping Keys' }, + connection: { + type: 'string', + description: + 'Configured Oracle connection; omit to use staging and, for exports, return a Sim file', + }, + importOption: { + type: 'string', + description: 'Required import mode; no destructive provider default is applied', + }, + purpose: { type: 'string', description: 'Purpose or reason for loading the viewpoint' }, + loadOption: { + type: 'string', + description: 'Required load mode; no provider default is applied', + }, + bindingNames: { type: 'array', description: 'Non-empty array of dimension binding names' }, + nodeChangeTypes: { + type: 'array', + description: 'Node changes to export: NEW, UPDATED, or both', + }, + since: { + type: 'number', + description: + 'Raw Oracle incremental timestamp; units are undocumented. Supply a tenant-confirmed value or use sinceLastExportOfType; no conversion is applied', + }, + sinceLastExportOfType: { + type: 'string', + description: + 'Use a previous export as the incremental boundary; mutually exclusive with since', + }, + connectionName: { + type: 'string', + description: + 'Configured Oracle connection name; omit to export to staging and return a Sim file', + }, + extractName: { + type: 'string', + description: 'Name of the configured dimension viewpoint extract', + }, + fromTime: { + type: 'string', + description: 'Oracle-supported start timestamp (UTC, offset, or region format)', + }, + toTime: { + type: 'string', + description: 'Oracle-supported end timestamp (UTC, offset, or region format)', + }, + }, + outputs: { + applications: { + type: 'json', + description: 'Bounded applications with dimensions', + condition: { field: 'operation', value: ['oracle_epm_edm_list_applications'] }, + }, + dimensions: { + type: 'json', + description: 'Bounded application dimensions', + condition: { field: 'operation', value: ['oracle_epm_edm_list_dimensions'] }, + }, + views: { + type: 'json', + description: 'Bounded views', + condition: { field: 'operation', value: ['oracle_epm_edm_list_views'] }, + }, + viewpoints: { + type: 'json', + description: 'Bounded viewpoints', + condition: { field: 'operation', value: ['oracle_epm_edm_list_viewpoints'] }, + }, + nodeTypes: { + type: 'json', + description: 'Bounded viewpoint-assigned node types', + condition: { field: 'operation', value: ['oracle_epm_edm_list_node_types'] }, + }, + nodeType: { + type: 'json', + description: 'Viewpoint-assigned node-type reference', + condition: { field: 'operation', value: ['oracle_epm_edm_get_node_type'] }, + }, + node: { + type: 'json', + description: 'Node detail and documented validation information', + condition: { + field: 'operation', + value: ['oracle_epm_edm_get_node', 'oracle_epm_edm_get_node_at_location'], + }, + }, + nodes: { + type: 'array', + description: + 'Flat node page or hierarchy occurrences with traversal paths; hierarchy nodes are capped at 5 MiB with remaining-frontier diagnostics', + condition: { + field: 'operation', + value: ['oracle_epm_edm_list_nodes', 'oracle_epm_edm_browse_hierarchy'], + }, + }, + request: { + type: 'json', + description: + 'Request workflow, permitted transitions, validation information, and source relationships', + condition: { + field: 'operation', + value: [ + 'oracle_epm_edm_create_request', + 'oracle_epm_edm_get_request', + 'oracle_epm_edm_assign_request', + ], + }, + }, + requests: { + type: 'json', + description: 'Bounded request collection', + condition: { field: 'operation', value: ['oracle_epm_edm_query_requests'] }, + }, + lineage: { + type: 'json', + description: 'Request lineage and subscription processing instances', + condition: { field: 'operation', value: ['oracle_epm_edm_get_request_lineage'] }, + }, + job: { + type: 'json', + description: 'Oracle job snapshot; null when submitted without waiting', + condition: { + field: 'operation', + value: [ + 'oracle_epm_edm_generate_request_attachment', + 'oracle_epm_edm_import_request_attachment', + 'oracle_epm_edm_transition_request', + 'oracle_epm_edm_get_job_status', + 'oracle_epm_edm_get_job_result', + 'oracle_epm_edm_validate_viewpoint', + 'oracle_epm_edm_export_mappings', + 'oracle_epm_edm_import_dimension', + 'oracle_epm_edm_load_viewpoint', + 'oracle_epm_edm_export_dimension', + 'oracle_epm_edm_incremental_export_dimension', + 'oracle_epm_edm_extract_dimension_viewpoint', + ], + }, + }, + result: { + type: 'json', + description: 'Job-result envelope with an opaque nested result payload', + condition: { + field: 'operation', + value: [ + 'oracle_epm_edm_generate_request_attachment', + 'oracle_epm_edm_import_request_attachment', + 'oracle_epm_edm_transition_request', + 'oracle_epm_edm_get_job_result', + 'oracle_epm_edm_validate_viewpoint', + 'oracle_epm_edm_export_mappings', + 'oracle_epm_edm_import_dimension', + 'oracle_epm_edm_load_viewpoint', + 'oracle_epm_edm_export_dimension', + 'oracle_epm_edm_incremental_export_dimension', + 'oracle_epm_edm_extract_dimension_viewpoint', + ], + }, + }, + file: { + type: 'file', + description: 'Downloaded canonical Sim UserFile', + condition: { + field: 'operation', + value: [ + 'oracle_epm_edm_get_job_result', + 'oracle_epm_edm_validate_viewpoint', + 'oracle_epm_edm_export_mappings', + 'oracle_epm_edm_export_dimension', + 'oracle_epm_edm_incremental_export_dimension', + 'oracle_epm_edm_extract_dimension_viewpoint', + ], + }, + }, + jobId: { + type: 'string', + description: 'Job UUID for resumable polling', + condition: { + field: 'operation', + value: [ + 'oracle_epm_edm_generate_request_attachment', + 'oracle_epm_edm_import_request_attachment', + 'oracle_epm_edm_transition_request', + 'oracle_epm_edm_validate_viewpoint', + 'oracle_epm_edm_export_mappings', + 'oracle_epm_edm_import_dimension', + 'oracle_epm_edm_load_viewpoint', + 'oracle_epm_edm_export_dimension', + 'oracle_epm_edm_incremental_export_dimension', + 'oracle_epm_edm_extract_dimension_viewpoint', + ], + }, + }, + completed: { + type: 'boolean', + description: + 'Whether Oracle reports job status COMPLETED; inspect result and reports for business success', + condition: { + field: 'operation', + value: [ + 'oracle_epm_edm_generate_request_attachment', + 'oracle_epm_edm_import_request_attachment', + 'oracle_epm_edm_transition_request', + 'oracle_epm_edm_validate_viewpoint', + 'oracle_epm_edm_export_mappings', + 'oracle_epm_edm_import_dimension', + 'oracle_epm_edm_load_viewpoint', + 'oracle_epm_edm_export_dimension', + 'oracle_epm_edm_incremental_export_dimension', + 'oracle_epm_edm_extract_dimension_viewpoint', + ], + }, + }, + timedOut: { + type: 'boolean', + description: 'Whether local polling timed out without cancelling the Oracle job', + condition: { + field: 'operation', + value: [ + 'oracle_epm_edm_generate_request_attachment', + 'oracle_epm_edm_import_request_attachment', + 'oracle_epm_edm_transition_request', + 'oracle_epm_edm_validate_viewpoint', + 'oracle_epm_edm_export_mappings', + 'oracle_epm_edm_import_dimension', + 'oracle_epm_edm_load_viewpoint', + 'oracle_epm_edm_export_dimension', + 'oracle_epm_edm_incremental_export_dimension', + 'oracle_epm_edm_extract_dimension_viewpoint', + ], + }, + }, + fileName: { + type: 'string', + description: 'Original Oracle staging or output file name', + condition: { + field: 'operation', + value: [ + 'oracle_epm_edm_upload_request_attachment', + 'oracle_epm_edm_validate_viewpoint', + 'oracle_epm_edm_export_mappings', + 'oracle_epm_edm_export_dimension', + 'oracle_epm_edm_incremental_export_dimension', + 'oracle_epm_edm_extract_dimension_viewpoint', + ], + }, + }, + applicationId: { + type: 'string', + description: 'Selected application UUID', + condition: { field: 'operation', value: ['oracle_epm_edm_list_dimensions'] }, + }, + requestId: { + type: 'string', + description: 'Selected request UUID', + condition: { + field: 'operation', + value: ['oracle_epm_edm_delete_request', 'oracle_epm_edm_upload_request_attachment'], + }, + }, + attachmentId: { + type: 'string', + description: 'Uploaded attachment UUID', + condition: { field: 'operation', value: ['oracle_epm_edm_upload_request_attachment'] }, + }, + attachmentUri: { + type: 'string', + description: 'Validated attachment URI', + condition: { field: 'operation', value: ['oracle_epm_edm_upload_request_attachment'] }, + }, + deleted: { + type: 'boolean', + description: 'Whether request deletion was accepted', + condition: { field: 'operation', value: ['oracle_epm_edm_delete_request'] }, + }, + count: { + type: 'number', + description: 'Returned node count', + condition: { + field: 'operation', + value: ['oracle_epm_edm_list_nodes', 'oracle_epm_edm_browse_hierarchy'], + }, + }, + offset: { + type: 'number', + description: 'Node page offset', + condition: { field: 'operation', value: ['oracle_epm_edm_list_nodes'] }, + }, + nextOffset: { + type: 'number', + description: 'Next node page offset, or null', + condition: { field: 'operation', value: ['oracle_epm_edm_list_nodes'] }, + }, + hasMore: { + type: 'boolean', + description: 'Whether more nodes may exist', + condition: { field: 'operation', value: ['oracle_epm_edm_list_nodes'] }, + }, + truncated: { + type: 'boolean', + description: 'Whether bounded output is incomplete', + condition: { + field: 'operation', + value: ['oracle_epm_edm_list_nodes', 'oracle_epm_edm_browse_hierarchy'], + }, + }, + providerRequests: { + type: 'number', + description: 'Provider calls used by hierarchy traversal', + condition: { field: 'operation', value: ['oracle_epm_edm_browse_hierarchy'] }, + }, + truncationReasons: { + type: 'array', + description: 'Limits, repeated pages, or cycles encountered', + condition: { field: 'operation', value: ['oracle_epm_edm_browse_hierarchy'] }, + }, + remainingFrontier: { + type: 'array', + description: 'Unvisited parent locations, paths, depths, and offsets', + condition: { field: 'operation', value: ['oracle_epm_edm_browse_hierarchy'] }, + }, + mapKeys: { + type: 'array', + description: 'Mapping locations and node-type references', + condition: { field: 'operation', value: ['oracle_epm_edm_get_mapping_keys'] }, + }, + }, +} + +export const OracleEpmEnterpriseDataManagementBlockMeta = { + tags: ['automation', 'data-analytics'], + url: 'https://www.oracle.com/performance-management/enterprise-data-management/', + templates: [ + { + icon: NetSuiteIcon, + title: 'Submit governed dimension changes', + prompt: + 'Create an Oracle EDM request in a selected view, upload a user-provided request spreadsheet, import the selected sheets, poll the import job, inspect the request and its valid transitions, then submit only after the user authorizes submission.', + modules: ['workflows', 'files'], + category: 'operations', + tags: ['automation', 'data-sync'], + }, + { + icon: NetSuiteIcon, + title: 'Review and approve an EDM request', + prompt: + 'Query recent Oracle EDM requests, retrieve the selected request and lineage, summarize validation information, and apply APPROVE only after an authorized reviewer explicitly chooses that available transition.', + modules: ['workflows', 'files'], + category: 'operations', + tags: ['automation', 'data-sync'], + }, + { + icon: NetSuiteIcon, + title: 'Validate before exporting a dimension', + prompt: + "Validate an Oracle EDM viewpoint to a report file, inspect the downloaded report, and export its dimension by name only if validation meets the user's acceptance criteria.", + modules: ['workflows', 'files'], + category: 'operations', + tags: ['automation', 'data-sync'], + }, + { + icon: NetSuiteIcon, + title: 'Merge approved master-data updates', + prompt: + 'Import a user-provided dimension file into Oracle EDM with the explicitly selected Merge mode, poll completion, inspect the opaque job result and resulting requests, and report any requests that remain in draft.', + modules: ['workflows', 'files'], + category: 'operations', + tags: ['automation', 'data-sync'], + }, + { + icon: NetSuiteIcon, + title: 'Investigate subscription-generated requests', + prompt: + 'Query Oracle EDM subscription requests from the last 30 days, inspect their source-request relationships and lineage, and prepare a digest of blocked or incomplete subscription processing.', + modules: ['workflows', 'files'], + category: 'operations', + tags: ['automation', 'data-sync'], + }, + { + icon: NetSuiteIcon, + title: 'Export governed mapping data', + prompt: + "Find an Oracle EDM application's dimension binding, retrieve its mapping keys, choose the mapping location, and export mappings to a file for a downstream data-management workflow.", + modules: ['workflows', 'files'], + category: 'operations', + tags: ['automation', 'data-sync'], + }, + { + icon: NetSuiteIcon, + title: 'Deliver incremental dimension changes', + prompt: + 'Export new or updated Oracle EDM nodes using an explicit previous-export boundary, wait for completion, and deliver the resulting file while reporting the limitations of transaction-history incremental exports.', + modules: ['workflows', 'files'], + category: 'operations', + tags: ['automation', 'data-sync'], + }, + ], + skills: [ + { + name: 'submit-edm-changes', + description: 'Submit governed dimension changes', + content: + '# Submit governed dimension changes\n\n## Steps\n\nCreate Request → Upload Request Attachment → Import Request Attachment → Get Job Status/Result → Get Request → Transition Request (SUBMIT). Do not resubmit writes after a timeout; retain the job ID. Inspect validation messages and validTransitionActions before submitting.\n\n## Output\n\nReport the actual Oracle state, bounded-result diagnostics, and any job/file identifiers needed to resume. Distinguish submission, completion, and business validation.\n\n## Source\n\n[Oracle workflow documentation](https://docs.oracle.com/en/cloud/saas/enterprise-data-management-cloud/dmcaa/request_process_flow_102xde8fe387.html)', + }, + { + name: 'approve-edm-request', + description: 'Review and approve an EDM request', + content: + '# Review and approve an EDM request\n\n## Steps\n\nQuery Requests with one value per filter and at most 90 days. Get Request and Get Request Lineage. Present validation and validTransitionActions, then invoke only the user-selected transition. Approval may leave a further commit stage; report actual status.\n\n## Output\n\nReport the actual Oracle state, bounded-result diagnostics, and any job/file identifiers needed to resume. Distinguish submission, completion, and business validation.\n\n## Source\n\n[Oracle workflow documentation](https://docs.oracle.com/en/cloud/saas/enterprise-data-management-cloud/dmcaa/request_process_flow_102xde8fe387.html)', + }, + { + name: 'validate-edm-export', + description: 'Validate before exporting a dimension', + content: + '# Validate before exporting a dimension\n\n## Steps\n\nValidate Viewpoint with a unique output file name. Poll and retrieve the report as a Sim file. Review it before Export Dimension. Job completion alone does not imply a report contains zero validation issues.\n\n## Output\n\nReport the actual Oracle state, bounded-result diagnostics, and any job/file identifiers needed to resume. Distinguish submission, completion, and business validation.\n\n## Source\n\n[Oracle workflow documentation](https://docs.oracle.com/en/cloud/saas/enterprise-data-management-cloud/dmcaa/validate_viewpoint_100x0b596a96.html)', + }, + { + name: 'merge-edm-dimension', + description: 'Merge approved master-data updates', + content: + '# Merge approved master-data updates\n\n## Steps\n\nImport Dimension with an authorized Sim file and explicit Merge mode. Preserve the job ID; inspect Get Job Result without assuming undocumented nested fields. Query Requests to identify resulting import requests; draft requests can contain validation errors. Never silently choose ResetDimension or ReplaceNodes.\n\n## Output\n\nReport the actual Oracle state, bounded-result diagnostics, and any job/file identifiers needed to resume. Distinguish submission, completion, and business validation.\n\n## Source\n\n[Oracle workflow documentation](https://docs.oracle.com/en/cloud/saas/enterprise-data-management-cloud/dmcaa/working_with_merge_imports_100xd9c958aa.html)', + }, + { + name: 'triage-edm-subscriptions', + description: 'Investigate subscription-generated requests', + content: + '# Investigate subscription-generated requests\n\n## Steps\n\nQuery Requests with requestType Subscription and lastDays 30. Inspect each selected request and its lineage, including incomplete subscription instances and source relationships. This integration observes existing subscriptions; it does not create or administer them.\n\n## Output\n\nReport the actual Oracle state, bounded-result diagnostics, and any job/file identifiers needed to resume. Distinguish submission, completion, and business validation.\n\n## Source\n\n[Oracle workflow documentation](https://docs.oracle.com/en/cloud/saas/enterprise-data-management-cloud/dmcaa/subscribing_to_viewpoints_100x8dae1bc3.html)', + }, + { + name: 'export-edm-mappings', + description: 'Export governed mapping data', + content: + '# Export governed mapping data\n\n## Steps\n\nList Applications/Dimensions to select a binding. Get Mapping Keys using dimension and binding IDs. Export Mappings with exact application/dimension names and the selected location. Wait for the job and return the stored Sim file, or retain job ID and file name to resume.\n\n## Output\n\nReport the actual Oracle state, bounded-result diagnostics, and any job/file identifiers needed to resume. Distinguish submission, completion, and business validation.\n\n## Source\n\n[Oracle workflow documentation](https://docs.oracle.com/en/cloud/saas/enterprise-data-management-cloud/dmcaa/export_mapping_100x31f0bcc0.html)', + }, + { + name: 'export-edm-increments', + description: 'Deliver incremental dimension changes', + content: + '# Deliver incremental dimension changes\n\n## Steps\n\nIncremental Export Dimension requires bindingNames and nodeChangeTypes, plus exactly one since or sinceLastExportOfType. Preserve job ID and original file name for resumed downloads. Incremental exports omit some derived/inherited and Reset/Replace bulk changes; use an existing incremental extract profile when comparing versions is needed.\n\n## Output\n\nReport the actual Oracle state, bounded-result diagnostics, and any job/file identifiers needed to resume. Distinguish submission, completion, and business validation.\n\n## Source\n\n[Oracle workflow documentation](https://docs.oracle.com/en/cloud/saas/enterprise-data-management-cloud/dmcaa/../edmra/edmcs_use_cases_export.html)', + }, + ], +} as const satisfies BlockMeta diff --git a/apps/sim/blocks/registry-maps.ts b/apps/sim/blocks/registry-maps.ts index 3b161aa97e4..2461d25c2ab 100644 --- a/apps/sim/blocks/registry-maps.ts +++ b/apps/sim/blocks/registry-maps.ts @@ -252,6 +252,10 @@ import { OktaBlock, OktaBlockMeta } from '@/blocks/blocks/okta' import { OneDriveBlock, OneDriveBlockMeta } from '@/blocks/blocks/onedrive' import { OnePasswordBlock, OnePasswordBlockMeta } from '@/blocks/blocks/onepassword' import { OpenAIBlock, OpenAIBlockMeta } from '@/blocks/blocks/openai' +import { + OracleEpmEnterpriseDataManagementBlock, + OracleEpmEnterpriseDataManagementBlockMeta, +} from '@/blocks/blocks/oracle_epm_enterprise_data_management' import { OutlookBlock, OutlookBlockMeta } from '@/blocks/blocks/outlook' import { PagerDutyBlock, PagerDutyBlockMeta } from '@/blocks/blocks/pagerduty' import { ParallelBlock, ParallelBlockMeta } from '@/blocks/blocks/parallel' @@ -595,6 +599,7 @@ export const BLOCK_REGISTRY: Record = { onedrive: OneDriveBlock, onepassword: OnePasswordBlock, openai: OpenAIBlock, + oracle_epm_enterprise_data_management: OracleEpmEnterpriseDataManagementBlock, outlook: OutlookBlock, pagerduty: PagerDutyBlock, parallel_ai: ParallelBlock, @@ -917,6 +922,7 @@ export const BLOCK_META_REGISTRY: Record = { onedrive: OneDriveBlockMeta, onepassword: OnePasswordBlockMeta, openai: OpenAIBlockMeta, + oracle_epm_enterprise_data_management: OracleEpmEnterpriseDataManagementBlockMeta, outlook: OutlookBlockMeta, pagerduty: PagerDutyBlockMeta, parallel_ai: ParallelBlockMeta, diff --git a/apps/sim/lib/copilot/generated/docs-manifest.ts b/apps/sim/lib/copilot/generated/docs-manifest.ts index 1b9e432d050..05da945e113 100644 --- a/apps/sim/lib/copilot/generated/docs-manifest.ts +++ b/apps/sim/lib/copilot/generated/docs-manifest.ts @@ -245,6 +245,7 @@ export const DOCS_MANIFEST: readonly string[] = [ 'integrations/onedrive.mdx', 'integrations/onepassword.mdx', 'integrations/openai.mdx', + 'integrations/oracle_epm_enterprise_data_management.mdx', 'integrations/outlook.mdx', 'integrations/pagerduty.mdx', 'integrations/parallel_ai.mdx', diff --git a/apps/sim/lib/integrations/credential-display.test.ts b/apps/sim/lib/integrations/credential-display.test.ts index f73da60137f..664a851b329 100644 --- a/apps/sim/lib/integrations/credential-display.test.ts +++ b/apps/sim/lib/integrations/credential-display.test.ts @@ -68,6 +68,8 @@ const EXPECTED_COVERAGE: Record = { // NetSuite remains an API-key catalog integration, like Snowflake, while its // block uses the shared reusable-credential selector. 'netsuite-service-account': [], + // EDM also exposes the reusable credential on its API-key-classified block. + 'oracle-epm-service-account': [], 'pipedrive-service-account': ['pipedrive'], 'salesforce-service-account': ['salesforce'], 'shopify-service-account': ['shopify'], diff --git a/apps/sim/lib/integrations/icon-mapping.ts b/apps/sim/lib/integrations/icon-mapping.ts index 34b99c0e128..f6610098d6c 100644 --- a/apps/sim/lib/integrations/icon-mapping.ts +++ b/apps/sim/lib/integrations/icon-mapping.ts @@ -464,6 +464,7 @@ export const blockTypeToIconMap: Record = { okta: OktaIcon, onedrive: MicrosoftOneDriveIcon, onepassword: OnePasswordIcon, + oracle_epm_enterprise_data_management: NetSuiteIcon, outlook: OutlookIcon, pagerduty: PagerDutyIcon, parallel_ai: ParallelIcon, diff --git a/apps/sim/lib/internal/oracle-epm-enterprise-data-management/endpoints.ts b/apps/sim/lib/internal/oracle-epm-enterprise-data-management/endpoints.ts new file mode 100644 index 00000000000..f0bfc3e0933 --- /dev/null +++ b/apps/sim/lib/internal/oracle-epm-enterprise-data-management/endpoints.ts @@ -0,0 +1,133 @@ +import type { OracleEpmEndpointDeclaration } from '@/lib/internal/oracle-epm' +import { + defineOracleEpmRouteSpace, + oracleEpmLiteral, + oracleEpmPathParameter, + oracleEpmQuery, +} from '@/lib/internal/oracle-epm' + +export const EDM_JSON_BYTES = 10 * 1024 * 1024 +export const EDM_FILE_BYTES = 95 * 1024 * 1024 +export const EDM_MULTIPART_BYTES = 100 * 1024 * 1024 +export const EDM_UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i + +export const edmRouteSpace = defineOracleEpmRouteSpace({ + context: ['epm', 'rest'], + allowedVersions: ['v1'], +}) + +const textQuery = oracleEpmQuery.string({ maxBytes: 1024 }) +const path = (template: string) => + template.split('/').map((part) => + part.startsWith(':') + ? oracleEpmPathParameter(part.slice(1), { + maxBytes: 255, + ...(part === ':fileName' + ? { mode: 'repository-path' as const } + : part === ':location' + ? {} + : { pattern: EDM_UUID_PATTERN }), + }) + : oracleEpmLiteral(part) + ) + +function endpoint( + template: string, + options: Partial> = {} +) { + return edmRouteSpace.defineEndpoint({ + method: 'GET', + version: 'v1', + path: path(template), + body: 'none', + response: 'json', + timeoutMs: 60_000, + maxResponseBytes: EDM_JSON_BYTES, + ...options, + }) +} + +const post = (template: string) => + endpoint(template, { method: 'POST', body: 'json', maxRequestBytes: EDM_JSON_BYTES }) +const upload = (template: string) => + endpoint(template, { + method: 'POST', + body: 'stream', + maxRequestBytes: EDM_MULTIPART_BYTES, + timeoutMs: 300_000, + headers: { contentType: { name: 'Content-Type', required: true, maxBytes: 256 } }, + }) +const viewpointPath = 'views/:viewId/viewpoints/:viewpointId' +const nodeQuery = { + q: textQuery, + expand: textQuery, + limit: oracleEpmQuery.integer({ minimum: 1, maximum: 100 }), + offset: oracleEpmQuery.integer({ minimum: 0, maximum: 1_000_000 }), + fromId: textQuery, + toId: textQuery, + orderBy: textQuery, +} + +/** Exact public v1 routes from Oracle's EDM REST endpoint catalog. */ +export const edmEndpoints = { + applications: endpoint('applications', { query: { q: textQuery } }), + views: endpoint('views', { query: { q: textQuery } }), + viewpoints: endpoint('views/:viewId/viewpoints', { query: { q: textQuery } }), + nodes: endpoint(`${viewpointPath}/nodes`, { query: nodeQuery }), + node: endpoint(`${viewpointPath}/nodes/:nodeId`, { + query: { q: textQuery, expand: textQuery }, + }), + nodeAtLocation: endpoint(`${viewpointPath}/nodes/:nodeId/locations/:location`, { + query: { q: textQuery, expand: textQuery }, + }), + createRequest: post('requests'), + request: endpoint('requests/:requestId'), + queryRequests: endpoint('requests/byName/query', { + query: { + lastDays: oracleEpmQuery.integer({ minimum: 1, maximum: 90 }), + fromDate: oracleEpmQuery.integer({ minimum: 0, maximum: Number.MAX_SAFE_INTEGER }), + toDate: oracleEpmQuery.integer({ minimum: 0, maximum: Number.MAX_SAFE_INTEGER }), + expand: textQuery, + myActivity: textQuery, + owner: textQuery, + priority: textQuery, + requestNumber: textQuery, + requestType: textQuery, + stage: textQuery, + status: textQuery, + timeLabelName: textQuery, + viewName: textQuery, + }, + }), + lineage: endpoint('requests/:requestId/lineage'), + assignRequest: post('requests/assignRequest'), + deleteRequest: endpoint('requests/:requestId', { method: 'DELETE', response: 'empty' }), + uploadAttachment: upload('requests/:requestId/attachments/importFile'), + generateAttachment: post('requests/:requestId/attachments/generate'), + importAttachment: post('requests/:requestId/import'), + transitionRequest: post('requests/:requestId/transitions'), + job: endpoint('jobRuns/:jobRunId'), + // Leave room for the job snapshot and output envelope under Sim's 10 MiB tool-response cap. + jobResult: endpoint('jobRuns/:jobRunId/result', { maxResponseBytes: 8 * 1024 * 1024 }), + validateViewpoint: post('viewpoints/validate/writeToFile'), + mappingKeys: endpoint('dimensions/:dimensionId/bindings/:bindingId/mappingKeys'), + exportMappings: post('dimensions/byName/exportMappings'), + importDimension: post('dimensions/byName/import'), + loadViewpoint: post('viewpoints/byName/load/file'), + exportDimension: post('dimensions/byName/export'), + incrementalExport: post('dimensions/byName/incrementalExport'), + extractViewpoint: post('dimensions/byName/extract'), + uploadStaging: upload('files/staging'), + stagingFile: endpoint('files/staging/:fileName', { + response: 'stream', + maxResponseBytes: EDM_FILE_BYTES, + timeoutMs: 300_000, + }), + temporaryFile: endpoint('files/temp/:fileId', { + query: { fileName: textQuery }, + response: 'stream', + maxResponseBytes: EDM_FILE_BYTES, + timeoutMs: 300_000, + }), + attachmentReference: endpoint('requests/:requestId/attachments/:attachmentId'), +} diff --git a/apps/sim/lib/internal/oracle-epm-enterprise-data-management/execute-tool.test.ts b/apps/sim/lib/internal/oracle-epm-enterprise-data-management/execute-tool.test.ts new file mode 100644 index 00000000000..45336f3d661 --- /dev/null +++ b/apps/sim/lib/internal/oracle-epm-enterprise-data-management/execute-tool.test.ts @@ -0,0 +1,424 @@ +/** @vitest-environment node */ +import { beforeEach, describe, expect, it, vi } from 'vitest' + +const mocks = vi.hoisted(() => ({ fetch: vi.fn(), dns: vi.fn() })) +vi.mock('@/lib/core/security/input-validation.server', () => ({ + DEFAULT_MAX_RESPONSE_BYTES: 100 * 1024 * 1024, + secureFetchWithPinnedIP: mocks.fetch, + validateUrlWithDNS: mocks.dns, +})) + +import { executeOracleEpmEdmTool } from '@/lib/internal/oracle-epm-enterprise-data-management/execute-tool' + +const id = '11111111-1111-4111-8111-111111111111' +const auth = { + oauthCredential: 'credential', + accessToken: 'dTpw', + instanceUrl: 'https://edm.example.com/gateway', +} +const view = { viewId: id, viewpointId: id } +const names = { + applicationName: 'Planning', + dimensionName: 'Account', + fileName: 'account.csv', + waitForCompletion: false, +} +const job = { links: [{ rel: 'results', href: `${auth.instanceUrl}/epm/rest/v1/jobRuns/${id}` }] } + +async function call(action: string, input: Record = {}, signal?: AbortSignal) { + return executeOracleEpmEdmTool({ + toolId: `oracle_epm_edm_${action}`, + input: { ...auth, operation: `oracle_epm_edm_${action}`, ...input }, + headers: new Headers(), + context: { workflowId: id, workspaceId: id, executionId: id, userId: 'user' }, + requestId: 'execution-request', + signal, + }) +} +interface WireCase { + action: string + input: Record + method: string + route: string + provider: unknown + body?: Record + query?: Record + status?: number +} +const cases: WireCase[] = [ + { + action: 'list_applications', + input: { permission: 'owner' }, + method: 'GET', + route: '/applications', + query: { q: 'permission::owner' }, + provider: { items: [] }, + }, + { + action: 'list_dimensions', + input: { applicationId: id }, + method: 'GET', + route: '/applications', + query: { q: `id::${id}` }, + provider: { items: [{ id, name: 'Planning', dimensions: [{ id, name: 'Account' }] }] }, + }, + { + action: 'list_views', + input: { dimensionId: id }, + method: 'GET', + route: '/views', + query: { q: `dimension::${id}` }, + provider: { items: [] }, + }, + { + action: 'list_viewpoints', + input: { viewId: id, applicationId: id }, + method: 'GET', + route: `/views/${id}/viewpoints`, + query: { q: `application::${id}` }, + provider: { items: [] }, + }, + { + action: 'list_node_types', + input: view, + method: 'GET', + route: `/views/${id}/viewpoints`, + provider: { + items: [ + { id, name: 'Accounts', nodeTypeAssignments: [{ nodeTypeLink: { id, name: 'Account' } }] }, + ], + }, + }, + { + action: 'get_node_type', + input: { ...view, nodeTypeId: id }, + method: 'GET', + route: `/views/${id}/viewpoints`, + provider: { + items: [ + { id, name: 'Accounts', nodeTypeAssignments: [{ nodeTypeLink: { id, name: 'Account' } }] }, + ], + }, + }, + { + action: 'list_nodes', + input: { ...view, scope: 'children', parentNodeId: id }, + method: 'GET', + route: `/views/${id}/viewpoints/${id}/nodes`, + query: { q: `childrenOfNode::${id}`, limit: '50', offset: '0', expand: 'propertyValues::none' }, + provider: { items: [], hasMore: false }, + }, + { + action: 'get_node', + input: { ...view, nodeId: id }, + method: 'GET', + route: `/views/${id}/viewpoints/${id}/nodes/${id}`, + provider: { id, name: 'Account' }, + }, + { + action: 'get_node_at_location', + input: { ...view, nodeId: id, location: `${id},${id}` }, + method: 'GET', + route: `/views/${id}/viewpoints/${id}/nodes/${id}/locations/${id},${id}`, + provider: { id, name: 'Account' }, + }, + { + action: 'browse_hierarchy', + input: view, + method: 'GET', + route: `/views/${id}/viewpoints/${id}/nodes`, + query: { q: 'top', limit: '50', offset: '0', expand: 'propertyValues::none' }, + provider: { items: [], hasMore: false }, + }, + { + action: 'create_request', + input: { viewId: id, title: 'Approved changes' }, + method: 'POST', + route: '/requests', + body: { + viewUri: `${auth.instanceUrl}/epm/rest/v1/views/${id}`, + origin: 'INTERACTIVE', + title: 'Approved changes', + }, + provider: { id, status: 'DRAFT' }, + }, + { + action: 'get_request', + input: { requestId: id }, + method: 'GET', + route: `/requests/${id}`, + provider: { id, status: 'DRAFT', validTransitionActions: ['SUBMIT'] }, + }, + { + action: 'query_requests', + input: { requestType: 'Subscription', status: 'In Flight', expandWorkflow: true }, + method: 'GET', + route: '/requests/byName/query', + query: { lastDays: '30', requestType: 'Subscription', status: 'In Flight', expand: 'workflow' }, + provider: { items: [] }, + }, + { + action: 'get_request_lineage', + input: { requestId: id }, + method: 'GET', + route: `/requests/${id}/lineage`, + provider: { requestLineageNodes: [{ id }], subscriptionInstances: [] }, + }, + { + action: 'assign_request', + input: { requestNumber: 123, userName: 'reviewer' }, + method: 'POST', + route: '/requests/assignRequest', + body: { requestNumber: 123, userName: 'reviewer' }, + provider: { id, requestNumber: 123 }, + }, + { + action: 'delete_request', + input: { requestId: id }, + method: 'DELETE', + route: `/requests/${id}`, + provider: null, + status: 204, + }, + { + action: 'generate_request_attachment', + input: { + requestId: id, + fileName: 'changes.xlsx', + items: [{ viewpoint: 'Accounts', data: [{ header: 'Name', value: 'Account1' }] }], + overwrite: false, + waitForCompletion: false, + }, + method: 'POST', + route: `/requests/${id}/attachments/generate`, + body: { + fileName: 'changes.xlsx', + items: [{ viewpoint: 'Accounts', data: [{ header: 'Name', value: 'Account1' }] }], + overwrite: false, + }, + provider: job, + }, + { + action: 'import_request_attachment', + input: { requestId: id, attachmentId: id, sheetNames: ['Accounts'], waitForCompletion: false }, + method: 'POST', + route: `/requests/${id}/import`, + body: { + attachmentUri: `${auth.instanceUrl}/epm/rest/v1/requests/${id}/attachments/${id}`, + sheetNames: ['Accounts'], + }, + provider: job, + }, + { + action: 'transition_request', + input: { + requestId: id, + action: 'SUBMIT', + transitionWithWarning: false, + waitForCompletion: false, + }, + method: 'POST', + route: `/requests/${id}/transitions`, + body: { action: 'SUBMIT', transitionWithWarning: false }, + provider: job, + }, + { + action: 'get_job_status', + input: { jobRunId: id }, + method: 'GET', + route: `/jobRuns/${id}`, + provider: { id, status: 'PENDING' }, + }, + { + action: 'get_job_result', + input: { jobRunId: id }, + method: 'GET', + route: `/jobRuns/${id}/result`, + provider: { id, status: 'COMPLETED', result: { arbitrary: true } }, + }, + { + action: 'validate_viewpoint', + input: { + viewName: 'Enterprise', + viewpointName: 'Accounts', + fileName: 'validation.xlsx', + waitForCompletion: false, + }, + method: 'POST', + route: '/viewpoints/validate/writeToFile', + body: { viewName: 'Enterprise', viewpointName: 'Accounts', fileName: 'validation.xlsx' }, + provider: job, + }, + { + action: 'get_mapping_keys', + input: { dimensionId: id, bindingId: id }, + method: 'GET', + route: `/dimensions/${id}/bindings/${id}/mappingKeys`, + provider: { mapKeys: [{ location: 'Planning', defaultLocation: true }] }, + }, + { + action: 'export_mappings', + input: { ...names, mappingLocation: 'Planning' }, + method: 'POST', + route: '/dimensions/byName/exportMappings', + body: { + applicationName: 'Planning', + dimensionName: 'Account', + fileName: 'account.csv', + mappingLocation: 'Planning', + }, + provider: job, + }, + { + action: 'import_dimension', + input: { ...names, importOption: 'Merge' }, + method: 'POST', + route: '/dimensions/byName/import', + body: { + applicationName: 'Planning', + dimensionName: 'Account', + fileName: 'account.csv', + importOption: 'Merge', + }, + provider: job, + }, + { + action: 'load_viewpoint', + input: { + viewName: 'Enterprise', + viewpointName: 'Accounts', + fileName: 'account.csv', + purpose: 'Approved changes', + loadOption: 'Merge', + waitForCompletion: false, + }, + method: 'POST', + route: '/viewpoints/byName/load/file', + body: { + viewName: 'Enterprise', + viewpointName: 'Accounts', + fileName: 'account.csv', + purpose: 'Approved changes', + loadOption: 'Merge', + }, + provider: job, + }, + { + action: 'export_dimension', + input: names, + method: 'POST', + route: '/dimensions/byName/export', + body: { applicationName: 'Planning', dimensionName: 'Account', fileName: 'account.csv' }, + provider: job, + }, + { + action: 'incremental_export_dimension', + input: { + ...names, + bindingNames: ['Account'], + nodeChangeTypes: ['NEW', 'UPDATED'], + sinceLastExportOfType: 'FULL', + }, + method: 'POST', + route: '/dimensions/byName/incrementalExport', + body: { + applicationName: 'Planning', + dimensionName: 'Account', + fileName: 'account.csv', + bindingNames: ['Account'], + nodeChangeTypes: ['NEW', 'UPDATED'], + sinceLastExportOfType: 'FULL', + }, + provider: job, + }, + { + action: 'extract_dimension_viewpoint', + input: { + ...names, + extractName: 'Approved extract', + fromTime: '2026-01-01T00:00 America/New_York', + }, + method: 'POST', + route: '/dimensions/byName/extract', + body: { + applicationName: 'Planning', + dimensionName: 'Account', + fileName: 'account.csv', + extractName: 'Approved extract', + fromTime: '2026-01-01T00:00 America/New_York', + }, + provider: job, + }, +] + +describe('EDM internal tool wire contracts', () => { + beforeEach(() => { + vi.clearAllMocks() + mocks.dns.mockResolvedValue({ isValid: true, resolvedIP: '203.0.113.10' }) + }) + it.each(cases)('$action sends the documented method, path, and payload', async (test) => { + mocks.fetch.mockResolvedValue( + test.status === 204 ? new Response(null, { status: 204 }) : Response.json(test.provider) + ) + const response = await call(test.action, test.input) + const result = await response.json() + expect(result, JSON.stringify(result)).toMatchObject({ success: true }) + expect(mocks.fetch).toHaveBeenCalledTimes(1) + const [url, address, options] = mocks.fetch.mock.calls[0] + const parsed = new URL(url) + expect(decodeURIComponent(parsed.pathname)).toBe(`/gateway/epm/rest/v1${test.route}`) + expect(Object.fromEntries(parsed.searchParams)).toEqual(test.query ?? {}) + expect(address).toBe('203.0.113.10') + expect(options).toMatchObject({ + method: test.method, + maxRedirects: 0, + headers: { Authorization: 'Basic dTpw' }, + }) + if (test.body) expect(JSON.parse(options.body)).toEqual(test.body) + }) + it.each([ + ['create_request', { viewId: '../admin' }], + ['import_dimension', names], + [ + 'load_viewpoint', + { viewName: 'Enterprise', viewpointName: 'Accounts', fileName: 'a.csv', purpose: 'Changes' }, + ], + ['transition_request', { requestId: id, action: 'DELETE_EVERYTHING' }], + ['list_nodes', { ...view, limit: 101 }], + ['browse_hierarchy', { ...view, maxNodes: 501 }], + ['query_requests', { lastDays: 91 }], + ['search_nodes', view], + ] as const)('rejects invalid %s before DNS or provider work', async (action, input) => { + const response = await call(action, input) + expect(response.status).toBe(400) + expect(await response.json()).toMatchObject({ success: false, retryable: false }) + expect(mocks.dns).not.toHaveBeenCalled() + expect(mocks.fetch).not.toHaveBeenCalled() + }) + it('rejects an operation discriminator that does not match the registered tool', async () => { + const response = await call('get_request', { + operation: 'oracle_epm_edm_delete_request', + requestId: id, + }) + expect(response.status).toBe(400) + expect(mocks.fetch).not.toHaveBeenCalled() + }) + it('does not retry an ambiguous write failure or expose its provider body', async () => { + mocks.fetch.mockResolvedValue(new Response('provider-secret-canary', { status: 503 })) + const response = await call('create_request', { viewId: id }) + const result = await response.json() + expect(result).toMatchObject({ success: false, retryable: false }) + expect(JSON.stringify(result)).not.toContain('provider-secret-canary') + expect(mocks.fetch).toHaveBeenCalledTimes(1) + }) + it('does not turn a malformed successful provider response into success', async () => { + mocks.fetch.mockResolvedValue(Response.json({ futureSecret: 'provider-secret-canary' })) + const response = await call('get_request', { requestId: id }) + expect(response.status).toBe(502) + expect(await response.text()).not.toContain('provider-secret-canary') + }) + it('honors cancellation before starting the request', async () => { + await expect(call('get_request', { requestId: id }, AbortSignal.abort())).rejects.toThrow() + expect(mocks.fetch).not.toHaveBeenCalled() + }) +}) diff --git a/apps/sim/lib/internal/oracle-epm-enterprise-data-management/execute-tool.ts b/apps/sim/lib/internal/oracle-epm-enterprise-data-management/execute-tool.ts new file mode 100644 index 00000000000..bd8566bf2a3 --- /dev/null +++ b/apps/sim/lib/internal/oracle-epm-enterprise-data-management/execute-tool.ts @@ -0,0 +1,211 @@ +import { createLogger } from '@sim/logger' +import { isRecordLike } from '@sim/utils/object' +import { getValidationErrorMessage } from '@/lib/api/server' +import { isPayloadSizeLimitError } from '@/lib/core/utils/stream-limits' +import { + createOracleEpmClient, + normalizeOracleEpmDestination, + OracleEpmError, +} from '@/lib/internal/oracle-epm' +import { EDM_JSON_BYTES } from '@/lib/internal/oracle-epm-enterprise-data-management/endpoints' +import { + assignEdmRequest, + browseEdmNodes, + createEdmRequest, + deleteEdmRequest, + exportEdmDimension, + exportEdmMappings, + extractEdmDimensionViewpoint, + generateEdmRequestAttachment, + getEdmJobResult, + getEdmJobStatus, + getEdmMappingKeys, + getEdmNode, + getEdmNodeType, + getEdmRequest, + getEdmRequestLineage, + importEdmDimension, + importEdmRequestAttachment, + incrementalExportEdmDimension, + listEdmApplications, + listEdmDimensions, + listEdmNodes, + listEdmNodeTypes, + listEdmViewpoints, + listEdmViews, + loadEdmViewpoint, + queryEdmRequests, + transitionEdmRequest, + uploadEdmRequestAttachment, + validateEdmViewpoint, +} from '@/lib/internal/oracle-epm-enterprise-data-management/operations' +import { edmInputSchemas } from '@/lib/internal/oracle-epm-enterprise-data-management/schemas' +import { + type EdmAction, + type EdmInput, + type EdmOperationContext, + EdmOperationError, +} from '@/lib/internal/oracle-epm-enterprise-data-management/types' +import type { InternalToolOperationHandler } from '@/lib/internal/tool-operations/types' + +const logger = createLogger('OracleEpmEdm') + +export async function executeEdmOperation(input: EdmInput, context: EdmOperationContext) { + switch (input.operation) { + case 'oracle_epm_edm_list_applications': + return listEdmApplications(input, context) + case 'oracle_epm_edm_list_dimensions': + return listEdmDimensions(input, context) + case 'oracle_epm_edm_list_views': + return listEdmViews(input, context) + case 'oracle_epm_edm_list_viewpoints': + return listEdmViewpoints(input, context) + case 'oracle_epm_edm_list_node_types': + return listEdmNodeTypes(input, context) + case 'oracle_epm_edm_get_node_type': + return getEdmNodeType(input, context) + case 'oracle_epm_edm_list_nodes': + return listEdmNodes(input, context) + case 'oracle_epm_edm_get_node': + return getEdmNode(input, context) + case 'oracle_epm_edm_get_node_at_location': + return getEdmNode(input, context) + case 'oracle_epm_edm_browse_hierarchy': + return browseEdmNodes(input, context) + case 'oracle_epm_edm_create_request': + return createEdmRequest(input, context) + case 'oracle_epm_edm_get_request': + return getEdmRequest(input, context) + case 'oracle_epm_edm_query_requests': + return queryEdmRequests(input, context) + case 'oracle_epm_edm_get_request_lineage': + return getEdmRequestLineage(input, context) + case 'oracle_epm_edm_assign_request': + return assignEdmRequest(input, context) + case 'oracle_epm_edm_delete_request': + return deleteEdmRequest(input, context) + case 'oracle_epm_edm_upload_request_attachment': + return uploadEdmRequestAttachment(input, context) + case 'oracle_epm_edm_generate_request_attachment': + return generateEdmRequestAttachment(input, context) + case 'oracle_epm_edm_import_request_attachment': + return importEdmRequestAttachment(input, context) + case 'oracle_epm_edm_transition_request': + return transitionEdmRequest(input, context) + case 'oracle_epm_edm_get_job_status': + return getEdmJobStatus(input, context) + case 'oracle_epm_edm_get_job_result': + return getEdmJobResult(input, context) + case 'oracle_epm_edm_validate_viewpoint': + return validateEdmViewpoint(input, context) + case 'oracle_epm_edm_get_mapping_keys': + return getEdmMappingKeys(input, context) + case 'oracle_epm_edm_export_mappings': + return exportEdmMappings(input, context) + case 'oracle_epm_edm_import_dimension': + return importEdmDimension(input, context) + case 'oracle_epm_edm_load_viewpoint': + return loadEdmViewpoint(input, context) + case 'oracle_epm_edm_export_dimension': + return exportEdmDimension(input, context) + case 'oracle_epm_edm_incremental_export_dimension': + return incrementalExportEdmDimension(input, context) + case 'oracle_epm_edm_extract_dimension_viewpoint': + return extractEdmDimensionViewpoint(input, context) + } +} + +export const executeOracleEpmEdmTool: InternalToolOperationHandler = async (request) => { + request.signal?.throwIfAborted() + const action = request.toolId.slice('oracle_epm_edm_'.length) + if (!request.toolId.startsWith('oracle_epm_edm_') || !Object.hasOwn(edmInputSchemas, action)) { + return Response.json( + { success: false, retryable: false, error: 'Unsupported Oracle EDM operation' }, + { status: 400 } + ) + } + if (!isRecordLike(request.input) || request.input.operation !== request.toolId) { + return Response.json( + { + success: false, + retryable: false, + error: 'EDM input operation must match the executing tool', + }, + { status: 400 } + ) + } + try { + if (Buffer.byteLength(JSON.stringify(request.input), 'utf8') > EDM_JSON_BYTES) { + return Response.json( + { success: false, retryable: false, error: 'EDM operation input exceeds 10 MiB' }, + { status: 413 } + ) + } + } catch { + return Response.json( + { success: false, retryable: false, error: 'Invalid EDM operation input' }, + { status: 400 } + ) + } + const parsed = edmInputSchemas[action as EdmAction].safeParse(request.input) + if (!parsed.success) { + return Response.json( + { + success: false, + retryable: false, + error: getValidationErrorMessage(parsed.error, 'Invalid EDM input'), + }, + { status: 400 } + ) + } + try { + const input = parsed.data + const instanceUrl = normalizeOracleEpmDestination(input.instanceUrl) + const context: EdmOperationContext = { + client: createOracleEpmClient({ instanceUrl, accessToken: input.accessToken }), + instanceUrl, + signal: request.signal, + execution: request.context, + } + const output = await executeEdmOperation(input, context) + request.signal?.throwIfAborted() + const failed = 'job' in output && output.job?.status === 'ERROR' + return Response.json({ + success: !failed, + output, + ...(failed + ? { retryable: false, error: 'Oracle EDM job failed; inspect the returned job' } + : {}), + }) + } catch (error) { + request.signal?.throwIfAborted() + if (error instanceof EdmOperationError) { + return Response.json( + { success: false, retryable: false, error: error.message, output: error.output }, + // Keep accepted-job failures on the structured ToolResponse path so the job ID survives. + { status: error.output ? 200 : error.status } + ) + } + if (error instanceof OracleEpmError) { + return Response.json( + { success: false, retryable: false, error: error.message }, + { status: error.status ?? 502 } + ) + } + if (isPayloadSizeLimitError(error)) { + return Response.json( + { success: false, retryable: false, error: 'EDM payload exceeded the allowed size' }, + { status: 413 } + ) + } + logger.warn('EDM operation failed', { action, requestId: request.requestId }) + return Response.json( + { + success: false, + retryable: false, + error: 'Oracle EDM operation failed or returned an unsupported response', + }, + { status: 502 } + ) + } +} diff --git a/apps/sim/lib/internal/oracle-epm-enterprise-data-management/files.test.ts b/apps/sim/lib/internal/oracle-epm-enterprise-data-management/files.test.ts new file mode 100644 index 00000000000..1f647bbc3e3 --- /dev/null +++ b/apps/sim/lib/internal/oracle-epm-enterprise-data-management/files.test.ts @@ -0,0 +1,191 @@ +/** @vitest-environment node */ +import { Readable } from 'node:stream' +import { beforeEach, describe, expect, it, vi } from 'vitest' + +const mocks = vi.hoisted(() => ({ + access: vi.fn(), + download: vi.fn(), + create: vi.fn(), + write: vi.fn(), + complete: vi.fn(), + abort: vi.fn(), + remove: vi.fn(), + sign: vi.fn(), + key: vi.fn(), + id: vi.fn(), +})) +vi.mock('@/app/api/files/authorization', () => ({ verifyFileAccess: mocks.access })) +vi.mock('@/lib/uploads/core/storage-service', () => ({ + downloadFileStream: mocks.download, + createMultipartUpload: mocks.create, + deleteFile: mocks.remove, + generatePresignedDownloadUrl: mocks.sign, +})) +vi.mock('@/lib/uploads/contexts/execution/utils', () => ({ + generateFileId: mocks.id, + generateUniqueExecutionFileKey: mocks.key, +})) + +import { createOracleEpmClient } from '@/lib/internal/oracle-epm/client.server' +import { + buildEdmMultipart, + storeEdmFile, +} from '@/lib/internal/oracle-epm-enterprise-data-management/files' +import type { EdmOperationContext } from '@/lib/internal/oracle-epm-enterprise-data-management/types' + +const id = '11111111-1111-4111-8111-111111111111' +const source = { + id: 'file-1', + name: 'changes.csv', + url: '', + size: 3, + type: 'text/csv', + key: 'workspace/test/changes.csv', + context: 'workspace', +} +const context: EdmOperationContext = { + client: createOracleEpmClient({ instanceUrl: 'https://edm.example.com', accessToken: 'dTpw' }), + instanceUrl: 'https://edm.example.com', + execution: { workflowId: id, workspaceId: id, executionId: id, userId: 'authorized-user' }, +} + +describe('EDM authorized file transfers', () => { + beforeEach(() => { + vi.clearAllMocks() + mocks.access.mockResolvedValue(true) + mocks.download.mockImplementation(async () => Readable.from([Buffer.from('abc')])) + mocks.create.mockResolvedValue({ + write: mocks.write, + complete: mocks.complete, + abort: mocks.abort, + }) + mocks.complete.mockResolvedValue({ key: 'execution/result.csv', size: 3 }) + mocks.key.mockReturnValue('execution/result.csv') + mocks.id.mockReturnValue('result-file') + mocks.sign.mockResolvedValue('https://storage.example.com/signed') + }) + it('authorizes the canonical file before opening storage and encodes both multipart fields', async () => { + const result = await buildEdmMultipart(source, 'account changes.csv', context) + expect(mocks.access).toHaveBeenCalledWith( + source.key, + 'authorized-user', + undefined, + 'workspace', + false + ) + expect(mocks.access.mock.invocationCallOrder[0]).toBeLessThan( + mocks.download.mock.invocationCallOrder[0] + ) + const request = new Request('https://edm.example.com', { + method: 'POST', + headers: { 'Content-Type': result.contentType }, + body: result.body as BodyInit, + }) + const form = await request.formData() + expect(form.get('fileName')).toBe('account changes.csv') + const file = form.get('file') + expect(file).toBeInstanceOf(File) + expect(await (file as File).text()).toBe('abc') + expect((file as File).type).toBe('text/csv') + expect(result.body.byteLength).toBeLessThan(100 * 1024 * 1024) + }) + it('rejects unauthorized files without reading storage', async () => { + mocks.access.mockResolvedValue(false) + await expect(buildEdmMultipart(source, undefined, context)).rejects.toThrow() + expect(mocks.download).not.toHaveBeenCalled() + }) + it('does not accept a caller file URL as upload authority', async () => { + await expect( + buildEdmMultipart( + { ...source, key: undefined, url: 'https://other.example.com/secret' }, + undefined, + context + ) + ).rejects.toThrow() + expect(mocks.download).not.toHaveBeenCalled() + }) + it('rejects multiple input files instead of silently selecting the first', async () => { + await expect( + buildEdmMultipart([source, { ...source, id: 'file-2' }], undefined, context) + ).rejects.toThrow() + expect(mocks.access).not.toHaveBeenCalled() + }) + it('rejects a declared source larger than 95 MiB before authorization or storage reads', async () => { + await expect( + buildEdmMultipart({ ...source, size: 95 * 1024 * 1024 + 1 }, undefined, context) + ).rejects.toThrow() + expect(mocks.access).not.toHaveBeenCalled() + expect(mocks.download).not.toHaveBeenCalled() + }) + it('counts observed bytes when the source metadata underreports its size', async () => { + const chunk = Buffer.alloc(6 * 1024 * 1024) + mocks.download.mockResolvedValue( + Readable.from( + (async function* () { + for (let i = 0; i < 16; i++) yield chunk + })() + ) + ) + await expect(buildEdmMultipart(source, undefined, context)).rejects.toThrow() + }) + it('sanitizes provider content types before constructing MIME headers', async () => { + const result = await buildEdmMultipart( + { ...source, type: 'text/csv\r\nX-Injected: yes' }, + undefined, + context + ) + expect(Buffer.from(result.body).toString()).toContain('Content-Type: application/octet-stream') + expect(Buffer.from(result.body).toString()).not.toContain('X-Injected') + }) + it('stores downloads under trusted execution context as a canonical UserFile', async () => { + const result = await storeEdmFile( + { + status: 200, + body: new Response('abc').body!, + contentType: 'text/csv', + contentLength: 3, + }, + 'account.csv', + context + ) + expect(mocks.key).toHaveBeenCalledWith( + expect.objectContaining({ workspaceId: id, workflowId: id, executionId: id }), + 'account.csv' + ) + expect(result).toMatchObject({ + id: 'result-file', + name: 'account.csv', + size: 3, + type: 'text/csv', + key: 'execution/result.csv', + context: 'execution', + }) + expect(mocks.write).toHaveBeenCalled() + expect(mocks.complete).toHaveBeenCalledTimes(1) + }) + it('does not create a stored file without a trusted execution context', async () => { + await expect( + storeEdmFile( + { status: 200, body: new Response('abc').body!, contentType: 'text/csv', contentLength: 3 }, + 'account.csv', + { ...context, execution: { workflowId: id, userId: 'authorized-user' } } + ) + ).rejects.toThrow('trusted') + expect(mocks.create).not.toHaveBeenCalled() + }) + it('rejects an oversized advertised download before creating storage', async () => { + await expect( + storeEdmFile( + { + status: 200, + body: new Response('abc').body!, + contentType: 'text/csv', + contentLength: 95 * 1024 * 1024 + 1, + }, + 'account.csv', + context + ) + ).rejects.toThrow() + expect(mocks.create).not.toHaveBeenCalled() + }) +}) diff --git a/apps/sim/lib/internal/oracle-epm-enterprise-data-management/files.ts b/apps/sim/lib/internal/oracle-epm-enterprise-data-management/files.ts new file mode 100644 index 00000000000..f955b05ac87 --- /dev/null +++ b/apps/sim/lib/internal/oracle-epm-enterprise-data-management/files.ts @@ -0,0 +1,111 @@ +import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' +import type { OracleEpmClientResponse, OracleEpmEndpoint } from '@/lib/internal/oracle-epm' +import { openOracleEpmSourceFile, storeOracleEpmDownload } from '@/lib/internal/oracle-epm' +import { + EDM_FILE_BYTES, + EDM_MULTIPART_BYTES, +} from '@/lib/internal/oracle-epm-enterprise-data-management/endpoints' +import { + type EdmOperationContext, + EdmOperationError, + edmJsonData, +} from '@/lib/internal/oracle-epm-enterprise-data-management/types' +import { parseRawFileInput } from '@/lib/uploads/utils/file-schemas' +import { processFilesToUserFiles } from '@/lib/uploads/utils/file-utils' +import { isUuid } from '@/executor/constants' + +const logger = createLogger('OracleEpmEdmFiles') + +export function requireEdmDownloadContext(context: EdmOperationContext) { + const { workspaceId, workflowId, executionId } = context.execution + if ( + !workspaceId || + !executionId || + !isUuid(workspaceId) || + !isUuid(workflowId) || + !isUuid(executionId) + ) { + throw new EdmOperationError( + 'A trusted workspace, workflow, and execution are required to store EDM files' + ) + } + return { workspaceId, workflowId, executionId } +} + +/** Multipart field values are data, never interpolated into MIME headers. */ +export async function buildEdmMultipart( + input: unknown, + fileName: string | undefined, + context: EdmOperationContext +) { + if (!context.execution.userId) + throw new EdmOperationError('An authenticated execution user is required to upload a file') + const raw = parseRawFileInput(input) + if (!raw) throw new EdmOperationError('Select one uploaded Sim file') + const files = processFilesToUserFiles(raw, 'oracle-epm-edm', logger) + if (files.length !== 1) throw new EdmOperationError('Select exactly one uploaded Sim file') + const file = files[0] + const source = await openOracleEpmSourceFile({ + file, + userId: context.execution.userId, + maxBytes: EDM_FILE_BYTES, + signal: context.signal, + }) + const outputName = fileName ?? source.fileName + const boundary = `sim-edm-${generateId()}` + const prefix = Buffer.from( + `--${boundary}\r\nContent-Disposition: form-data; name="fileName"\r\n\r\n${outputName}\r\n--${boundary}\r\nContent-Disposition: form-data; name="file"; filename="upload"\r\nContent-Type: ${source.contentType}\r\n\r\n` + ) + const suffix = Buffer.from(`\r\n--${boundary}--\r\n`) + let bytes = prefix.length + suffix.length + const chunks: Buffer[] = [prefix] + for await (const chunk of source.chunks) { + bytes += chunk.length + if (bytes > EDM_MULTIPART_BYTES) + throw new EdmOperationError('EDM multipart body exceeds 100 MiB', 413) + chunks.push(chunk) + } + chunks.push(suffix) + context.signal?.throwIfAborted() + return { + body: new Uint8Array(Buffer.concat(chunks, bytes)), + contentType: `multipart/form-data; boundary=${boundary}`, + fileName: outputName, + } +} + +export async function uploadEdmFile( + endpoint: OracleEpmEndpoint, + input: unknown, + fileName: string | undefined, + context: EdmOperationContext, + pathParams?: Record +) { + const multipart = await buildEdmMultipart(input, fileName, context) + const response = await context.client.request(endpoint, { + pathParams, + headers: { contentType: multipart.contentType }, + stream: multipart.body, + signal: context.signal, + }) + return { data: edmJsonData(response), fileName: multipart.fileName } +} + +export async function storeEdmFile( + response: OracleEpmClientResponse, + fileName: string, + context: EdmOperationContext +) { + const execution = requireEdmDownloadContext(context) + if (!('body' in response)) throw new EdmOperationError('Oracle EDM did not return a file', 502) + return storeOracleEpmDownload({ + body: response.body, + fileName, + contentType: response.contentType, + contentLength: response.contentLength, + context: execution, + maxBytes: EDM_FILE_BYTES, + signal: context.signal, + }) +} diff --git a/apps/sim/lib/internal/oracle-epm-enterprise-data-management/hierarchy.test.ts b/apps/sim/lib/internal/oracle-epm-enterprise-data-management/hierarchy.test.ts new file mode 100644 index 00000000000..7818d40da3f --- /dev/null +++ b/apps/sim/lib/internal/oracle-epm-enterprise-data-management/hierarchy.test.ts @@ -0,0 +1,129 @@ +/** @vitest-environment node */ +import { describe, expect, it, vi } from 'vitest' +import { browseEdmHierarchy } from '@/lib/internal/oracle-epm-enterprise-data-management/hierarchy' +import { edmNodeSchema } from '@/lib/internal/oracle-epm-enterprise-data-management/schemas' + +const a = '11111111-1111-4111-8111-111111111111' +const b = '22222222-2222-4222-8222-222222222222' +const shared = '33333333-3333-4333-8333-333333333333' +const bounds = { maxDepth: 2, maxNodes: 200, pageSize: 50, maxRequests: 50 } +const node = (id: string, extra = {}) => + edmNodeSchema.parse({ id, name: id, hasChildren: false, ...extra }) + +describe('EDM bounded hierarchy workflows', () => { + it('preserves shared-node occurrences under different parents and locations', async () => { + const result = await browseEdmHierarchy(bounds, async (frontier) => ({ + items: + frontier.parentNodeId === null + ? [node(a, { hasChildren: true }), node(b, { hasChildren: true })] + : [ + node(shared, { + parentNodeId: frontier.parentNodeId, + location: `${frontier.parentNodeId},${shared}`, + }), + ], + hasMore: false, + })) + expect( + result.nodes.filter((item) => item.id === shared).map((item) => item.traversalPath) + ).toEqual([ + [a, shared], + [b, shared], + ]) + expect(result.nodes.filter((item) => item.id === shared).map((item) => item.location)).toEqual([ + `${a},${shared}`, + `${b},${shared}`, + ]) + expect(result).toMatchObject({ + count: 4, + providerRequests: 3, + truncated: false, + remainingFrontier: [], + }) + }) + it('reports depth-limited frontier without making an extra provider request', async () => { + const read = vi.fn(async () => ({ items: [node(a, { hasChildren: true })], hasMore: false })) + const result = await browseEdmHierarchy({ ...bounds, maxDepth: 0 }, read) + expect(read).toHaveBeenCalledTimes(1) + expect(result).toMatchObject({ + truncated: true, + truncationReasons: ['depth'], + remainingFrontier: [{ parentNodeId: a, depth: 1, offset: 0 }], + }) + }) + it('bounds pages by remaining node capacity and reports the next page', async () => { + const read = vi.fn(async () => ({ items: [node(a), node(b)], hasMore: true })) + const result = await browseEdmHierarchy({ ...bounds, maxNodes: 2 }, read) + expect(read).toHaveBeenCalledWith(expect.anything(), 2) + expect(result).toMatchObject({ + count: 2, + truncated: true, + truncationReasons: ['nodes'], + remainingFrontier: [{ offset: 2 }], + }) + }) + it('stops at the provider-request budget and preserves unvisited parents', async () => { + const result = await browseEdmHierarchy({ ...bounds, maxRequests: 1 }, async () => ({ + items: [node(a, { hasChildren: true })], + hasMore: false, + })) + expect(result).toMatchObject({ + providerRequests: 1, + truncated: true, + truncationReasons: ['provider-requests'], + remainingFrontier: [{ parentNodeId: a }], + }) + }) + it('detects a provider repeating a page instead of looping or duplicating nodes', async () => { + const read = vi.fn(async () => ({ items: [node(a)], hasMore: true })) + const result = await browseEdmHierarchy(bounds, read) + expect(read).toHaveBeenCalledTimes(2) + expect(result).toMatchObject({ + count: 1, + truncated: true, + truncationReasons: ['repeated-page'], + }) + }) + it('retains an encountered cycle as a distinct occurrence but does not expand it', async () => { + const result = await browseEdmHierarchy(bounds, async () => ({ + items: [node(a, { hasChildren: true })], + hasMore: false, + })) + expect(result).toMatchObject({ + count: 2, + providerRequests: 2, + truncated: true, + truncationReasons: ['cycle'], + }) + }) + it('does not start provider work after cancellation', async () => { + const read = vi.fn() + await expect(browseEdmHierarchy(bounds, read, AbortSignal.abort())).rejects.toThrow() + expect(read).not.toHaveBeenCalled() + }) + it('bounds accumulated output bytes across otherwise valid provider pages', async () => { + const result = await browseEdmHierarchy( + { ...bounds, maxNodes: 500 }, + async (frontier, limit) => ({ + items: Array.from({ length: limit }, (_, index) => + node( + `${(frontier.offset + index).toString(16).padStart(8, '0')}-1111-4111-8111-111111111111`, + { + name: 'x'.repeat(20_000), + description: 'y'.repeat(20_000), + } + ) + ), + hasMore: true, + }) + ) + expect(result.count).toBeGreaterThan(50) + expect(result.count).toBeLessThan(500) + expect(Buffer.byteLength(JSON.stringify(result.nodes))).toBeLessThanOrEqual(5 * 1024 * 1024) + expect(result).toMatchObject({ + truncated: true, + truncationReasons: ['output-bytes'], + remainingFrontier: [{ offset: result.count }], + }) + }) +}) diff --git a/apps/sim/lib/internal/oracle-epm-enterprise-data-management/hierarchy.ts b/apps/sim/lib/internal/oracle-epm-enterprise-data-management/hierarchy.ts new file mode 100644 index 00000000000..4b786bdd324 --- /dev/null +++ b/apps/sim/lib/internal/oracle-epm-enterprise-data-management/hierarchy.ts @@ -0,0 +1,113 @@ +import type { + EdmHierarchyFrontier, + EdmHierarchyNode, + EdmNode, +} from '@/lib/internal/oracle-epm-enterprise-data-management/types' + +interface HierarchyBounds { + maxDepth: number + maxNodes: number + pageSize: number + maxRequests: number +} + +const MAX_HIERARCHY_NODE_BYTES = 5 * 1024 * 1024 + +/** A bounded breadth-first traversal; a node ID alone is never an occurrence identity. */ +export async function browseEdmHierarchy( + bounds: HierarchyBounds, + readPage: ( + frontier: EdmHierarchyFrontier, + limit: number + ) => Promise<{ items: EdmNode[]; hasMore?: boolean | null }>, + signal?: AbortSignal +) { + const queue: EdmHierarchyFrontier[] = [ + { parentNodeId: null, parentLocation: null, path: [], depth: 0, offset: 0 }, + ] + const remainingFrontier: EdmHierarchyFrontier[] = [] + const nodes: EdmHierarchyNode[] = [] + const seen = new Set() + const reasons = new Set() + let providerRequests = 0 + let projectedBytes = 2 + while (queue.length) { + signal?.throwIfAborted() + if (nodes.length >= bounds.maxNodes) { + reasons.add('nodes') + break + } + if (providerRequests >= bounds.maxRequests) { + reasons.add('provider-requests') + break + } + const frontier = queue.shift()! + if (frontier.depth > bounds.maxDepth) { + remainingFrontier.push(frontier) + reasons.add('depth') + continue + } + const limit = Math.min(bounds.pageSize, bounds.maxNodes - nodes.length) + const page = await readPage(frontier, limit) + providerRequests += 1 + signal?.throwIfAborted() + let added = 0 + let byteLimited = false + for (const [index, node] of page.items.slice(0, limit).entries()) { + const key = JSON.stringify([frontier.path, node.id, node.parentNodeId, node.location]) + if (seen.has(key)) continue + const path = [...frontier.path, node.id] + const occurrence = { + ...node, + depth: frontier.depth, + traversalPath: path, + traversalParentLocation: frontier.parentLocation, + } + const bytes = Buffer.byteLength(JSON.stringify(occurrence), 'utf8') + 1 + if (projectedBytes + bytes > MAX_HIERARCHY_NODE_BYTES) { + reasons.add('output-bytes') + queue.unshift({ ...frontier, offset: frontier.offset + index }) + byteLimited = true + break + } + seen.add(key) + projectedBytes += bytes + nodes.push(occurrence) + added += 1 + if (node.hasChildren === false || node.childCount === 0) continue + const next = { + parentNodeId: node.id, + parentLocation: path.join(','), + path, + depth: frontier.depth + 1, + offset: 0, + } + if (frontier.path.includes(node.id)) { + reasons.add('cycle') + remainingFrontier.push(next) + } else { + queue.push(next) + } + } + if (byteLimited) break + const hasMore = page.hasMore ?? page.items.length >= limit + if (hasMore || page.items.length > limit) { + const next = { ...frontier, offset: frontier.offset + Math.min(page.items.length, limit) } + if (added === 0) { + reasons.add('repeated-page') + remainingFrontier.push(next) + } else { + queue.unshift(next) + } + } + } + remainingFrontier.push(...queue) + return { + nodes, + count: nodes.length, + providerRequests, + truncated: remainingFrontier.length > 0, + truncationReasons: [...reasons], + remainingFrontier, + } +} diff --git a/apps/sim/lib/internal/oracle-epm-enterprise-data-management/index.ts b/apps/sim/lib/internal/oracle-epm-enterprise-data-management/index.ts new file mode 100644 index 00000000000..e3218994d73 --- /dev/null +++ b/apps/sim/lib/internal/oracle-epm-enterprise-data-management/index.ts @@ -0,0 +1,7 @@ +export { executeOracleEpmEdmTool } from '@/lib/internal/oracle-epm-enterprise-data-management/execute-tool' +export { edmInputSchemas } from '@/lib/internal/oracle-epm-enterprise-data-management/schemas' +export type { + EdmAction, + EdmInput, + EdmOperationContext, +} from '@/lib/internal/oracle-epm-enterprise-data-management/types' diff --git a/apps/sim/lib/internal/oracle-epm-enterprise-data-management/jobs.test.ts b/apps/sim/lib/internal/oracle-epm-enterprise-data-management/jobs.test.ts new file mode 100644 index 00000000000..01a491630c0 --- /dev/null +++ b/apps/sim/lib/internal/oracle-epm-enterprise-data-management/jobs.test.ts @@ -0,0 +1,189 @@ +/** @vitest-environment node */ +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' + +const mocks = vi.hoisted(() => ({ fetch: vi.fn(), dns: vi.fn(), store: vi.fn() })) +vi.mock('@/lib/core/security/input-validation.server', () => ({ + DEFAULT_MAX_RESPONSE_BYTES: 100 * 1024 * 1024, + secureFetchWithPinnedIP: mocks.fetch, + validateUrlWithDNS: mocks.dns, +})) +vi.mock('@/lib/internal/oracle-epm/files.server', () => ({ + storeOracleEpmDownload: mocks.store, + openOracleEpmSourceFile: vi.fn(), +})) + +import { createOracleEpmClient } from '@/lib/internal/oracle-epm/client.server' +import { edmEndpoints } from '@/lib/internal/oracle-epm-enterprise-data-management/endpoints' +import { + downloadEdmJobResult, + startEdmJob, + waitForEdmJob, +} from '@/lib/internal/oracle-epm-enterprise-data-management/jobs' +import type { EdmOperationContext } from '@/lib/internal/oracle-epm-enterprise-data-management/types' + +const id = '11111111-1111-4111-8111-111111111111' +const origin = 'https://edm.example.com' +const root = `${origin}/epm/rest/v1` +const context: EdmOperationContext = { + client: createOracleEpmClient({ instanceUrl: origin, accessToken: 'dTpw' }), + instanceUrl: origin, + execution: { workflowId: id, workspaceId: id, executionId: id, userId: 'user' }, +} +const wait = { waitForCompletion: true, maxWaitSeconds: 120 } +const accepted = { links: [{ rel: 'results', href: `${root}/jobRuns/${id}` }] } +describe('EDM asynchronous completion and resume', () => { + beforeEach(() => { + vi.clearAllMocks() + mocks.dns.mockResolvedValue({ isValid: true, resolvedIP: '203.0.113.10' }) + mocks.store.mockResolvedValue({ + id: 'file', + name: 'account.csv', + key: 'execution/account.csv', + url: 'https://storage.example.com/signed', + size: 3, + type: 'text/csv', + context: 'execution', + }) + }) + afterEach(() => vi.useRealTimers()) + it('returns an accepted job without polling when wait is explicitly false', async () => { + mocks.fetch.mockResolvedValue(Response.json(accepted)) + const result = await startEdmJob( + edmEndpoints.exportDimension, + { fileName: 'account.csv' }, + { ...wait, waitForCompletion: false }, + context, + undefined, + 'account.csv' + ) + expect(result).toMatchObject({ + jobId: id, + completed: false, + timedOut: false, + job: null, + fileName: 'account.csv', + }) + expect(mocks.fetch).toHaveBeenCalledTimes(1) + expect(mocks.store).not.toHaveBeenCalled() + }) + it('polls a running job to completion using the shared polling primitive', async () => { + vi.useFakeTimers() + mocks.fetch + .mockResolvedValueOnce(Response.json({ id, status: 'RUNNING' })) + .mockResolvedValueOnce(Response.json({ id, status: 'COMPLETED' })) + const pending = waitForEdmJob(id, wait, context) + await vi.advanceTimersByTimeAsync(5000) + expect(await pending).toMatchObject({ + jobId: id, + job: { status: 'COMPLETED' }, + completed: true, + timedOut: false, + }) + expect(mocks.fetch).toHaveBeenCalledTimes(2) + }) + it('reports provider failure without treating it as successful completion', async () => { + mocks.fetch.mockResolvedValue( + Response.json({ id, status: 'ERROR', error: 'Validation failed' }) + ) + expect(await waitForEdmJob(id, wait, context)).toMatchObject({ + completed: false, + timedOut: false, + job: { status: 'ERROR' }, + }) + expect(mocks.fetch).toHaveBeenCalledTimes(1) + }) + it('preserves the job ID and last snapshot on a local timeout', async () => { + vi.useFakeTimers() + mocks.fetch.mockImplementation(async () => Response.json({ id, status: 'RUNNING' })) + const pending = waitForEdmJob(id, { ...wait, maxWaitSeconds: 1 }, context) + await vi.advanceTimersByTimeAsync(2000) + expect(await pending).toMatchObject({ + jobId: id, + completed: false, + timedOut: true, + job: { status: 'RUNNING' }, + }) + expect(mocks.fetch.mock.calls.every((call) => call[2].method === 'GET')).toBe(true) + }) + it('propagates caller cancellation without claiming that the remote job was cancelled', async () => { + const controller = new AbortController() + mocks.fetch.mockImplementation(async () => { + controller.abort(new DOMException('User cancelled', 'AbortError')) + return Response.json({ id, status: 'RUNNING' }) + }) + await expect( + waitForEdmJob(id, wait, { ...context, signal: controller.signal }) + ).rejects.toMatchObject({ name: 'AbortError' }) + expect(mocks.fetch.mock.calls.every((call) => call[2].method === 'GET')).toBe(true) + }) + it('completes a by-name export, retrieves its opaque result, then stores the explicitly named staging file', async () => { + mocks.fetch + .mockResolvedValueOnce(Response.json(accepted)) + .mockResolvedValueOnce( + Response.json({ + id, + status: 'COMPLETED', + links: [{ rel: 'results', href: `${root}/jobRuns/${id}/result` }], + }) + ) + .mockResolvedValueOnce( + Response.json({ id, status: 'COMPLETED', result: { providerSpecific: true } }) + ) + .mockResolvedValueOnce( + new Response('abc', { headers: { 'Content-Type': 'text/csv', 'Content-Length': '3' } }) + ) + const result = await startEdmJob( + edmEndpoints.exportDimension, + { fileName: 'account.csv' }, + wait, + context, + undefined, + 'account.csv' + ) + expect(result).toMatchObject({ + completed: true, + result: { result: { providerSpecific: true } }, + file: { context: 'execution', name: 'account.csv' }, + }) + expect(mocks.fetch.mock.calls.map((call) => new URL(call[0]).pathname)).toEqual([ + '/epm/rest/v1/dimensions/byName/export', + `/epm/rest/v1/jobRuns/${id}`, + `/epm/rest/v1/jobRuns/${id}/result`, + '/epm/rest/v1/files/staging/account.csv', + ]) + }) + it('resumes a staging download using the original file name, without resubmitting the export', async () => { + mocks.fetch + .mockResolvedValueOnce(Response.json({ id, status: 'COMPLETED' })) + .mockResolvedValueOnce(Response.json({ id, status: 'COMPLETED', result: null })) + .mockResolvedValueOnce(new Response('abc', { headers: { 'Content-Type': 'text/csv' } })) + expect(await downloadEdmJobResult(id, 'account.csv', context)).toHaveProperty('file') + expect(mocks.fetch.mock.calls.every((call) => call[2].method === 'GET')).toBe(true) + }) + it('requires an original staging file name if no file link was advertised', async () => { + mocks.fetch.mockResolvedValue(Response.json({ id, status: 'COMPLETED' })) + await expect(downloadEdmJobResult(id, undefined, context)).rejects.toThrow( + 'original staging file name' + ) + expect(mocks.store).not.toHaveBeenCalled() + }) + it('does not download a result from a job that is still running', async () => { + mocks.fetch.mockResolvedValue(Response.json({ id, status: 'RUNNING' })) + await expect(downloadEdmJobResult(id, 'account.csv', context)).rejects.toThrow('must complete') + expect(mocks.fetch).toHaveBeenCalledTimes(1) + expect(mocks.store).not.toHaveBeenCalled() + }) + it('checks file-storage authority before starting a file-producing write', async () => { + await expect( + startEdmJob( + edmEndpoints.exportDimension, + {}, + wait, + { ...context, execution: { workflowId: id } }, + undefined, + 'account.csv' + ) + ).rejects.toThrow('trusted') + expect(mocks.fetch).not.toHaveBeenCalled() + }) +}) diff --git a/apps/sim/lib/internal/oracle-epm-enterprise-data-management/jobs.ts b/apps/sim/lib/internal/oracle-epm-enterprise-data-management/jobs.ts new file mode 100644 index 00000000000..6d975a63579 --- /dev/null +++ b/apps/sim/lib/internal/oracle-epm-enterprise-data-management/jobs.ts @@ -0,0 +1,154 @@ +import type { OracleEpmEndpoint } from '@/lib/internal/oracle-epm' +import { OracleEpmError, pollOracleEpmJob } from '@/lib/internal/oracle-epm' +import { edmEndpoints } from '@/lib/internal/oracle-epm-enterprise-data-management/endpoints' +import { + requireEdmDownloadContext, + storeEdmFile, +} from '@/lib/internal/oracle-epm-enterprise-data-management/files' +import { + edmDownloadLink, + edmJobLink, +} from '@/lib/internal/oracle-epm-enterprise-data-management/links' +import { + edmJobResultSchema, + edmJobSchema, +} from '@/lib/internal/oracle-epm-enterprise-data-management/schemas' +import { + type EdmAsyncOutput, + type EdmJob, + type EdmOperationContext, + EdmOperationError, + edmJsonData, +} from '@/lib/internal/oracle-epm-enterprise-data-management/types' + +export async function readEdmJob(jobRunId: string, context: EdmOperationContext) { + const data = edmJsonData( + await context.client.request(edmEndpoints.job, { + pathParams: { jobRunId }, + signal: context.signal, + }) + ) + return edmJobSchema.parse(data) +} + +export async function readEdmJobResult(jobRunId: string, context: EdmOperationContext) { + const data = edmJsonData( + await context.client.request(edmEndpoints.jobResult, { + pathParams: { jobRunId }, + signal: context.signal, + }) + ) + return edmJobResultSchema.parse(data) +} + +/** Local cancellation stops waiting; it does not claim to cancel the remote Oracle job. */ +export async function waitForEdmJob( + jobId: string, + options: { waitForCompletion: boolean; maxWaitSeconds: number }, + context: EdmOperationContext +): Promise { + if (!options.waitForCompletion) return { jobId, job: null, completed: false, timedOut: false } + let latest: EdmJob | null = null + try { + const outcome = await pollOracleEpmJob({ + read: async (signal) => { + latest = await readEdmJob(jobId, { ...context, signal }) + return latest + }, + classify: (job) => { + if (job.status === 'COMPLETED') return { state: 'success', result: job } + if (job.status === 'ERROR') return { state: 'failure', error: job } + return { state: 'pending' } + }, + signal: context.signal, + maxWaitMs: options.maxWaitSeconds * 1000, + cleanupReserveMs: 100, + maxAttempts: 1000, + initialDelayMs: 1000, + maxDelayMs: 5000, + }) + const job = outcome.state === 'success' ? outcome.result : outcome.error + return { jobId, job, completed: job.status === 'COMPLETED', timedOut: false } + } catch (error) { + context.signal?.throwIfAborted() + if (error instanceof DOMException && error.name === 'TimeoutError') { + return { jobId, job: latest, completed: false, timedOut: true } + } + throw new EdmOperationError( + 'Oracle EDM status retrieval failed; resume with the returned job ID', + error instanceof OracleEpmError ? (error.status ?? 502) : 502, + { jobId, job: latest, completed: false, timedOut: false } + ) + } +} + +export async function startEdmJob( + endpoint: OracleEpmEndpoint, + body: Record, + options: { waitForCompletion: boolean; maxWaitSeconds: number }, + context: EdmOperationContext, + pathParams?: Record, + outputFileName?: string +): Promise { + if (outputFileName && options.waitForCompletion) requireEdmDownloadContext(context) + const response = edmJsonData( + await context.client.request(endpoint, { + pathParams, + json: body, + signal: context.signal, + }) + ) + const { id } = edmJobLink(context.client, response) + let output: EdmAsyncOutput = { jobId: id, job: null, completed: false, timedOut: false } + if (outputFileName) output.fileName = outputFileName + try { + output = { ...output, ...(await waitForEdmJob(id, options, context)) } + if (!output.completed) return output + output.result = await readEdmJobResult(id, context) + if (outputFileName) { + const linkedFile = output.job ? edmDownloadLink(context.client, output.job) : null + const response = linkedFile + ? await context.client.requestValidatedLink(linkedFile.handle, context.signal) + : await context.client.request(edmEndpoints.stagingFile, { + pathParams: { fileName: outputFileName }, + signal: context.signal, + }) + output.file = await storeEdmFile(response, outputFileName, context) + } + return output + } catch (error) { + context.signal?.throwIfAborted() + if (error instanceof EdmOperationError && error.output) output = { ...output, ...error.output } + throw new EdmOperationError( + 'Oracle EDM accepted the job but follow-up failed; resume with the returned job ID', + error instanceof OracleEpmError || error instanceof EdmOperationError + ? (error.status ?? 502) + : 502, + output + ) + } +} + +export async function downloadEdmJobResult( + jobRunId: string, + fileName: string | undefined, + context: EdmOperationContext +) { + requireEdmDownloadContext(context) + const job = await readEdmJob(jobRunId, context) + if (job.status !== 'COMPLETED') + throw new EdmOperationError('The EDM job must complete before downloading its file') + const link = edmDownloadLink(context.client, job) + if (!link && !fileName) + throw new EdmOperationError( + 'Provide the original staging file name for a job without an advertised file link' + ) + const result = await readEdmJobResult(jobRunId, context) + const response = link + ? await context.client.requestValidatedLink(link.handle, context.signal) + : await context.client.request(edmEndpoints.stagingFile, { + pathParams: { fileName: fileName! }, + signal: context.signal, + }) + return { job, result, file: await storeEdmFile(response, fileName ?? link!.fileName, context) } +} diff --git a/apps/sim/lib/internal/oracle-epm-enterprise-data-management/links.test.ts b/apps/sim/lib/internal/oracle-epm-enterprise-data-management/links.test.ts new file mode 100644 index 00000000000..e9f50651de1 --- /dev/null +++ b/apps/sim/lib/internal/oracle-epm-enterprise-data-management/links.test.ts @@ -0,0 +1,85 @@ +/** @vitest-environment node */ +import { describe, expect, it } from 'vitest' +import { createOracleEpmClient } from '@/lib/internal/oracle-epm/client.server' +import { + edmAttachmentLink, + edmDownloadLink, + edmJobLink, + validateEdmStagingLink, +} from '@/lib/internal/oracle-epm-enterprise-data-management/links' + +const id = '11111111-1111-4111-8111-111111111111' +const other = '22222222-2222-4222-8222-222222222222' +const origin = 'https://edm.example.com/gateway' +const root = `${origin}/epm/rest/v1` +const client = createOracleEpmClient({ instanceUrl: origin, accessToken: 'dTpw' }) +const envelope = (rel: string, href: string, method?: string) => ({ + links: [{ rel, href, ...(method ? { method } : {}) }], +}) + +describe('EDM workflow link admission', () => { + it('accepts the public v1 job route while preserving a gateway base path', () => { + expect(edmJobLink(client, envelope('results', `${root}/jobRuns/${id}`)).id).toBe(id) + }) + it.each([ + `https://other.example.com/gateway/epm/rest/v1/jobRuns/${id}`, + `http://edm.example.com/gateway/epm/rest/v1/jobRuns/${id}`, + `https://edm.example.com/epm/rest/v1/jobRuns/${id}`, + `${origin}/epm/ui-rest/v1/jobRuns/${id}`, + `${root}/jobRuns/${id}?url=https://other.example.com`, + `${root}/jobRuns/${id}#fragment`, + `${root}/jobRuns/../applications`, + ])('rejects an unsafe or unsupported job target: %s', (href) => { + expect(() => edmJobLink(client, envelope('results', href))).toThrow() + }) + it('rejects ambiguous relations and write methods before following a link', () => { + const link = envelope('results', `${root}/jobRuns/${id}`) + expect(() => edmJobLink(client, { links: [...link.links, ...link.links] })).toThrow() + expect(() => edmJobLink(client, envelope('results', `${root}/jobRuns/${id}`, 'POST'))).toThrow() + }) + it('binds attachment links to the requested request', () => { + const href = `${root}/requests/${id}/attachments/${other}` + expect(edmAttachmentLink(client, envelope('attachment', href), id)).toEqual({ + attachmentId: other, + attachmentUri: href, + }) + expect(() => edmAttachmentLink(client, envelope('attachment', href), other)).toThrow( + 'different request' + ) + }) + it('validates the exact staged file name including spaces', () => { + expect(() => + validateEdmStagingLink( + client, + envelope('file', `${root}/files/staging/account%20changes.csv`), + 'account changes.csv' + ) + ).not.toThrow() + expect(() => + validateEdmStagingLink( + client, + envelope('file', `${root}/files/staging/other.csv`), + 'account.csv' + ) + ).toThrow('different staging file') + }) + it('supports both documented temporary and staging download routes', () => { + expect( + edmDownloadLink(client, envelope('results', `${root}/files/temp/${id}?fileName=account.csv`)) + ?.fileName + ).toBe('account.csv') + expect( + edmDownloadLink(client, envelope('results', `${root}/files/staging/account%20changes.csv`)) + ?.fileName + ).toBe('account changes.csv') + }) + it('does not interpret a public job-result JSON link as a downloadable file', () => { + expect(edmDownloadLink(client, envelope('results', `${root}/jobRuns/${id}/result`))).toBeNull() + expect(edmDownloadLink(client, { links: [] })).toBeNull() + }) + it('does not turn an unsupported result URL into a staging fallback', () => { + expect(() => + edmDownloadLink(client, envelope('results', 'https://other.example.com/account.csv')) + ).toThrow('unsupported') + }) +}) diff --git a/apps/sim/lib/internal/oracle-epm-enterprise-data-management/links.ts b/apps/sim/lib/internal/oracle-epm-enterprise-data-management/links.ts new file mode 100644 index 00000000000..1a2e4fdfd67 --- /dev/null +++ b/apps/sim/lib/internal/oracle-epm-enterprise-data-management/links.ts @@ -0,0 +1,114 @@ +import type { OracleEpmClient, OracleEpmValidatedLink } from '@/lib/internal/oracle-epm' +import { + edmEndpoints, + edmRouteSpace, +} from '@/lib/internal/oracle-epm-enterprise-data-management/endpoints' +import { edmLinkEnvelopeSchema } from '@/lib/internal/oracle-epm-enterprise-data-management/schemas' +import { EdmOperationError } from '@/lib/internal/oracle-epm-enterprise-data-management/types' + +const policies = { + job: edmRouteSpace.defineReturnedLinkPolicy({ + relation: 'results', + method: 'GET', + endpoint: edmEndpoints.job, + preserveGatewayBasePath: true, + }), + attachment: edmRouteSpace.defineReturnedLinkPolicy({ + relation: 'attachment', + method: 'GET', + endpoint: edmEndpoints.attachmentReference, + preserveGatewayBasePath: true, + }), + staging: edmRouteSpace.defineReturnedLinkPolicy({ + relation: 'file', + method: 'GET', + endpoint: edmEndpoints.stagingFile, + preserveGatewayBasePath: true, + }), + stagingResult: edmRouteSpace.defineReturnedLinkPolicy({ + relation: 'results', + method: 'GET', + endpoint: edmEndpoints.stagingFile, + preserveGatewayBasePath: true, + }), + temporaryResult: edmRouteSpace.defineReturnedLinkPolicy({ + relation: 'results', + method: 'GET', + endpoint: edmEndpoints.temporaryFile, + preserveGatewayBasePath: true, + }), + jsonResult: edmRouteSpace.defineReturnedLinkPolicy({ + relation: 'results', + method: 'GET', + endpoint: edmEndpoints.jobResult, + preserveGatewayBasePath: true, + }), +} + +function requireLink(data: unknown, relation: string) { + const matches = edmLinkEnvelopeSchema.parse(data).links.filter((link) => link.rel === relation) + if (matches.length !== 1) + throw new EdmOperationError('Oracle EDM did not return one expected workflow link', 502) + return matches[0] +} + +/** Validate first; URL parsing below only extracts identifiers from the admitted route. */ +export function edmJobLink(client: OracleEpmClient, data: unknown) { + const link = requireLink(data, 'results') + const handle = client.validateReturnedLink(policies.job, link) + const id = new URL(link.href).pathname.split('/').at(-1) + if (!id) throw new EdmOperationError('Oracle EDM did not return a job identifier', 502) + return { id: decodeURIComponent(id), handle } +} + +export function edmAttachmentLink(client: OracleEpmClient, data: unknown, requestId: string) { + const link = requireLink(data, 'attachment') + client.validateReturnedLink(policies.attachment, link) + const segments = new URL(link.href).pathname.split('/').map(decodeURIComponent) + if (segments.at(-3)?.toLowerCase() !== requestId.toLowerCase()) { + throw new EdmOperationError('Oracle EDM returned an attachment for a different request', 502) + } + return { attachmentId: segments.at(-1)!, attachmentUri: link.href } +} + +export function validateEdmStagingLink(client: OracleEpmClient, data: unknown, fileName: string) { + const link = requireLink(data, 'file') + client.validateReturnedLink(policies.staging, link) + if (decodeURIComponent(new URL(link.href).pathname.split('/').at(-1)!) !== fileName) { + throw new EdmOperationError('Oracle EDM returned a different staging file', 502) + } +} + +export function edmDownloadLink( + client: OracleEpmClient, + data: unknown +): { + handle: OracleEpmValidatedLink + fileName: string +} | null { + const links = edmLinkEnvelopeSchema.parse(data).links.filter((link) => link.rel === 'results') + if (links.length === 0) return null + if (links.length !== 1) + throw new EdmOperationError('Oracle EDM returned ambiguous result links', 502) + const link = links[0] + for (const policy of [policies.temporaryResult, policies.stagingResult]) { + try { + const handle = client.validateReturnedLink(policy, link) + const url = new URL(link.href) + return { + handle, + fileName: + url.searchParams.get('fileName') ?? decodeURIComponent(url.pathname.split('/').at(-1)!), + } + } catch { + /** A result relation may denote either documented file route; neither permits arbitrary URLs. */ + } + } + try { + // A JSON result is not a file. By-name workflows download their explicitly named staging file. + client.validateReturnedLink(policies.jsonResult, link) + return null + } catch { + throw new EdmOperationError('Oracle EDM returned an unsupported result file link', 502) + } +} diff --git a/apps/sim/lib/internal/oracle-epm-enterprise-data-management/operations.test.ts b/apps/sim/lib/internal/oracle-epm-enterprise-data-management/operations.test.ts new file mode 100644 index 00000000000..219dcd3c494 --- /dev/null +++ b/apps/sim/lib/internal/oracle-epm-enterprise-data-management/operations.test.ts @@ -0,0 +1,368 @@ +/** @vitest-environment node */ +import { beforeEach, describe, expect, it, vi } from 'vitest' + +const mocks = vi.hoisted(() => ({ fetch: vi.fn(), dns: vi.fn(), source: vi.fn(), store: vi.fn() })) +vi.mock('@/lib/core/security/input-validation.server', () => ({ + DEFAULT_MAX_RESPONSE_BYTES: 100 * 1024 * 1024, + secureFetchWithPinnedIP: mocks.fetch, + validateUrlWithDNS: mocks.dns, +})) +vi.mock('@/lib/internal/oracle-epm/files.server', () => ({ + openOracleEpmSourceFile: mocks.source, + storeOracleEpmDownload: mocks.store, +})) + +import { readStreamToBufferWithLimit } from '@/lib/core/utils/stream-limits' +import { executeOracleEpmEdmTool } from '@/lib/internal/oracle-epm-enterprise-data-management/execute-tool' + +const requestId = '11111111-1111-4111-8111-111111111111' +const attachmentId = '22222222-2222-4222-8222-222222222222' +const jobId = '33333333-3333-4333-8333-333333333333' +const root = 'https://edm.example.com/epm/rest/v1' +const file = { + id: 'file', + name: 'changes.csv', + size: 3, + type: 'text/csv', + key: 'workspace/changes.csv', + context: 'workspace', + url: '', +} +const job = { id: jobId, status: 'COMPLETED' } +const accepted = { links: [{ rel: 'results', href: `${root}/jobRuns/${jobId}` }] } +const resultEnvelope = { ...job, result: null } +async function callResponse(action: string, input: Record) { + const response = await executeOracleEpmEdmTool({ + toolId: `oracle_epm_edm_${action}`, + input: { + oauthCredential: 'credential', + accessToken: 'dTpw', + instanceUrl: 'https://edm.example.com', + operation: `oracle_epm_edm_${action}`, + ...input, + }, + headers: new Headers(), + requestId: 'test-request', + context: { + workflowId: requestId, + workspaceId: requestId, + executionId: requestId, + userId: 'user', + }, + }) + return response +} +async function call(action: string, input: Record) { + return (await callResponse(action, input)).json() +} +describe('EDM governed request and transfer workflows', () => { + it.each(['status', 'result', 'download', 'storage'] as const)( + 'preserves the accepted job handle when %s follow-up fails', + async (phase) => { + mocks.fetch.mockResolvedValueOnce(Response.json(accepted)) + if (phase !== 'status') mocks.fetch.mockResolvedValueOnce(Response.json(job)) + if (phase === 'download' || phase === 'storage') + mocks.fetch.mockResolvedValueOnce(Response.json(resultEnvelope)) + if (phase === 'storage') { + mocks.fetch.mockResolvedValueOnce(new Response('abc')) + mocks.store.mockRejectedValueOnce(new Error('private-storage-secret')) + } else + mocks.fetch.mockResolvedValueOnce(new Response('private-provider-secret', { status: 503 })) + const response = await callResponse('export_dimension', { + applicationName: 'Planning', + dimensionName: 'Account', + fileName: 'result.csv', + }) + // Non-2xx internal responses take a different shared executor path and lose normal outputs. + expect(response.status).toBe(200) + const result = await response.json() + expect(result).toMatchObject({ + success: false, + retryable: false, + output: { jobId, fileName: 'result.csv' }, + }) + expect(JSON.stringify(result)).not.toContain('private-provider-secret') + expect(JSON.stringify(result)).not.toContain('private-storage-secret') + expect(mocks.fetch.mock.calls.filter((call) => call[2].method === 'POST')).toHaveLength(1) + } + ) + it('preserves the accepted job handle when the opaque result exceeds the output budget', async () => { + mocks.fetch + .mockResolvedValueOnce(Response.json(accepted)) + .mockResolvedValueOnce(Response.json(job)) + .mockImplementationOnce( + async (_url: string, _ip: string, options: { maxResponseBytes: number }) => { + const response = Response.json({ ...job, result: 'x'.repeat(8 * 1024 * 1024) }) + // Model secureFetch's bounded JSON reader using the actual requested endpoint budget. + response.json = async () => + JSON.parse( + ( + await readStreamToBufferWithLimit(response.body, { + maxBytes: options.maxResponseBytes, + label: 'EDM result response', + }) + ).toString('utf8') + ) + return response + } + ) + const response = await callResponse('export_dimension', { + applicationName: 'Planning', + dimensionName: 'Account', + fileName: 'result.csv', + }) + expect(response.status).toBe(200) + const result = await response.json() + expect(result).toMatchObject({ + success: false, + retryable: false, + output: { jobId, fileName: 'result.csv', completed: true }, + }) + expect(result.output).not.toHaveProperty('result') + expect(Buffer.byteLength(JSON.stringify(result))).toBeLessThan(10 * 1024 * 1024) + expect(mocks.fetch.mock.calls.filter((call) => call[2].method === 'POST')).toHaveLength(1) + }) + it('keeps a documented completed-job business failure opaque and available to callers', async () => { + // Oracle's byName export example has COMPLETED with result.success false. + const result = { success: false } + mocks.fetch + .mockResolvedValueOnce(Response.json(accepted)) + .mockResolvedValueOnce(Response.json(job)) + .mockResolvedValueOnce(Response.json({ ...job, result })) + const response = await call('export_dimension', { + applicationName: 'Planning', + dimensionName: 'Account', + fileName: 'result.csv', + connection: 'Planning', + }) + expect(response.output.completed).toBe(true) + expect(response.output.result.result).toEqual(result) + expect(response.output).not.toHaveProperty('businessSuccess') + }) + beforeEach(() => { + vi.clearAllMocks() + mocks.dns.mockResolvedValue({ isValid: true, resolvedIP: '203.0.113.10' }) + mocks.source.mockImplementation(async () => ({ + fileName: 'changes.csv', + contentType: 'text/csv', + maxBytes: 95 * 1024 * 1024, + chunks: (async function* () { + yield Buffer.from('abc') + })(), + })) + mocks.store.mockResolvedValue({ ...file, context: 'execution', key: 'execution/result.csv' }) + }) + it('creates a request, uploads an attachment, imports its sheets, and transitions after completion', async () => { + mocks.fetch + .mockResolvedValueOnce( + Response.json({ id: requestId, status: 'DRAFT', validTransitionActions: ['SUBMIT'] }) + ) + .mockResolvedValueOnce( + Response.json({ + links: [ + { + rel: 'attachment', + href: `${root}/requests/${requestId}/attachments/${attachmentId}`, + }, + ], + }) + ) + .mockResolvedValueOnce(Response.json(accepted)) + .mockResolvedValueOnce(Response.json(job)) + .mockResolvedValueOnce(Response.json(resultEnvelope)) + .mockResolvedValueOnce(Response.json(accepted)) + .mockResolvedValueOnce(Response.json(job)) + .mockResolvedValueOnce(Response.json(resultEnvelope)) + const created = await call('create_request', { viewId: requestId, title: 'Approved updates' }) + const uploaded = await call('upload_request_attachment', { + requestId: created.output.request.id, + file, + }) + expect(uploaded).toMatchObject({ + success: true, + output: { attachmentId, requestId, fileName: 'changes.csv' }, + }) + const imported = await call('import_request_attachment', { + requestId, + attachmentId: uploaded.output.attachmentId, + sheetNames: ['Accounts'], + }) + expect(imported).toMatchObject({ success: true, output: { completed: true, jobId } }) + const transitioned = await call('transition_request', { + requestId, + action: created.output.request.validTransitionActions[0], + transitionWithWarning: false, + }) + expect(transitioned).toMatchObject({ success: true, output: { completed: true } }) + const writes = mocks.fetch.mock.calls.filter((call) => call[2].method === 'POST') + expect(writes.map((call) => new URL(call[0]).pathname)).toEqual([ + '/epm/rest/v1/requests', + `/epm/rest/v1/requests/${requestId}/attachments/importFile`, + `/epm/rest/v1/requests/${requestId}/import`, + `/epm/rest/v1/requests/${requestId}/transitions`, + ]) + expect(JSON.parse(writes[2][2].body)).toEqual({ + attachmentUri: uploaded.output.attachmentUri, + sheetNames: ['Accounts'], + }) + expect(JSON.parse(writes[3][2].body)).toEqual({ + action: 'SUBMIT', + transitionWithWarning: false, + }) + }) + it('stages a Sim file before an explicit Merge import and returns the completion envelope', async () => { + mocks.fetch + .mockResolvedValueOnce( + Response.json({ links: [{ rel: 'file', href: `${root}/files/staging/changes.csv` }] }) + ) + .mockResolvedValueOnce(Response.json(accepted)) + .mockResolvedValueOnce(Response.json(job)) + .mockResolvedValueOnce(Response.json({ ...job, result: { requestSpecific: 'opaque' } })) + const result = await call('import_dimension', { + applicationName: 'Planning', + dimensionName: 'Account', + fileName: 'changes.csv', + importOption: 'Merge', + file, + }) + expect(result).toMatchObject({ + success: true, + output: { completed: true, result: { result: { requestSpecific: 'opaque' } } }, + }) + expect(mocks.fetch.mock.calls.map((call) => new URL(call[0]).pathname)).toEqual([ + '/epm/rest/v1/files/staging', + '/epm/rest/v1/dimensions/byName/import', + `/epm/rest/v1/jobRuns/${jobId}`, + `/epm/rest/v1/jobRuns/${jobId}/result`, + ]) + }) + it('stops before starting an import when Oracle advertises a different staged file', async () => { + mocks.fetch.mockResolvedValue( + Response.json({ links: [{ rel: 'file', href: `${root}/files/staging/wrong.csv` }] }) + ) + const result = await call('import_dimension', { + applicationName: 'Planning', + dimensionName: 'Account', + fileName: 'changes.csv', + importOption: 'Merge', + file, + }) + expect(result).toMatchObject({ success: false, retryable: false }) + expect(mocks.fetch).toHaveBeenCalledTimes(1) + }) + it('reports a failed attachment import without retrying the write or reading a success result', async () => { + mocks.fetch + .mockResolvedValueOnce(Response.json(accepted)) + .mockResolvedValueOnce( + Response.json({ id: jobId, status: 'ERROR', error: 'Invalid request sheet' }) + ) + const result = await call('import_request_attachment', { + requestId, + attachmentId, + sheetNames: ['Accounts'], + }) + expect(result).toMatchObject({ + success: false, + retryable: false, + output: { jobId, completed: false, job: { status: 'ERROR' } }, + }) + expect(mocks.fetch).toHaveBeenCalledTimes(2) + }) + it.each([ + [ + 'export_dimension', + { applicationName: 'Planning', dimensionName: 'Account', fileName: 'result.csv' }, + ], + [ + 'extract_dimension_viewpoint', + { + applicationName: 'Planning', + dimensionName: 'Account', + fileName: 'result.csv', + extractName: 'Current', + }, + ], + [ + 'export_mappings', + { + applicationName: 'Planning', + dimensionName: 'Account', + fileName: 'result.csv', + mappingLocation: 'Planning', + }, + ], + [ + 'validate_viewpoint', + { viewName: 'Enterprise', viewpointName: 'Accounts', fileName: 'result.csv' }, + ], + ] as const)('%s completes and returns a stored Sim file', async (action, input) => { + mocks.fetch + .mockResolvedValueOnce(Response.json(accepted)) + .mockResolvedValueOnce(Response.json(job)) + .mockResolvedValueOnce(Response.json(resultEnvelope)) + .mockResolvedValueOnce(new Response('abc', { headers: { 'Content-Type': 'text/csv' } })) + const result = await call(action, input) + expect(result).toMatchObject({ + success: true, + output: { completed: true, file: { context: 'execution' } }, + }) + expect(new URL(mocks.fetch.mock.calls[3][0]).pathname).toBe( + '/epm/rest/v1/files/staging/result.csv' + ) + }) + it('exports to an Oracle connection without attempting a Sim file download', async () => { + mocks.fetch + .mockResolvedValueOnce(Response.json(accepted)) + .mockResolvedValueOnce(Response.json(job)) + .mockResolvedValueOnce(Response.json(resultEnvelope)) + const result = await call('export_dimension', { + applicationName: 'Planning', + dimensionName: 'Account', + fileName: 'result.csv', + connection: 'Planning Connection', + }) + expect(result).toMatchObject({ success: true, output: { completed: true } }) + expect(result.output).not.toHaveProperty('file') + expect(mocks.store).not.toHaveBeenCalled() + expect(mocks.fetch).toHaveBeenCalledTimes(3) + }) + it('preserves subscription lineage for operational investigation without administration calls', async () => { + const instance = { + id: attachmentId, + subscriptionStatus: 'INCOMPLETE', + sourceRequest: requestId, + targetRequest: jobId, + message: 'Review required', + } + mocks.fetch.mockResolvedValue( + Response.json({ + requestLineageNodes: [ + { + id: jobId, + origin: 'SUBSCRIPTION', + sourceRequest: { id: requestId }, + incompleteSubscriptions: [instance], + }, + ], + subscriptionInstances: [instance], + }) + ) + const result = await call('get_request_lineage', { requestId }) + expect(result).toMatchObject({ + success: true, + output: { + lineage: { + requestLineageNodes: [ + { + origin: 'SUBSCRIPTION', + sourceRequest: { id: requestId }, + incompleteSubscriptions: [instance], + }, + ], + subscriptionInstances: [instance], + }, + }, + }) + expect(mocks.fetch).toHaveBeenCalledTimes(1) + }) +}) diff --git a/apps/sim/lib/internal/oracle-epm-enterprise-data-management/operations/discovery.ts b/apps/sim/lib/internal/oracle-epm-enterprise-data-management/operations/discovery.ts new file mode 100644 index 00000000000..0b27439125e --- /dev/null +++ b/apps/sim/lib/internal/oracle-epm-enterprise-data-management/operations/discovery.ts @@ -0,0 +1,141 @@ +import { edmEndpoints } from '@/lib/internal/oracle-epm-enterprise-data-management/endpoints' +import { + edmApplicationSchema, + edmPageSchema, + edmViewpointSchema, + edmViewSchema, +} from '@/lib/internal/oracle-epm-enterprise-data-management/schemas' +import { + type EdmInput, + type EdmOperationContext, + EdmOperationError, + edmJsonData, +} from '@/lib/internal/oracle-epm-enterprise-data-management/types' + +export function projectEdmList(items: T[], maxResults: number, providerHasMore = false) { + return { + items: items.slice(0, maxResults), + count: Math.min(items.length, maxResults), + truncated: providerHasMore || items.length > maxResults, + } +} + +export async function readEdmApplications(context: EdmOperationContext, q?: string) { + const data = edmJsonData( + await context.client.request(edmEndpoints.applications, { + query: { q }, + signal: context.signal, + }) + ) + return edmPageSchema(edmApplicationSchema).parse(data) +} + +export async function readEdmViews(context: EdmOperationContext, q?: string) { + const data = edmJsonData( + await context.client.request(edmEndpoints.views, { query: { q }, signal: context.signal }) + ) + return edmPageSchema(edmViewSchema).parse(data) +} + +export async function readEdmViewpoints(viewId: string, context: EdmOperationContext, q?: string) { + const data = edmJsonData( + await context.client.request(edmEndpoints.viewpoints, { + pathParams: { viewId }, + query: { q }, + signal: context.signal, + }) + ) + return edmPageSchema(edmViewpointSchema).parse(data) +} + +export async function listEdmApplications( + input: EdmInput<'list_applications'>, + context: EdmOperationContext +) { + const q = input.applicationId + ? `id::${input.applicationId}` + : input.permission + ? `permission::${input.permission}` + : undefined + const page = await readEdmApplications(context, q) + return { applications: projectEdmList(page.items, input.maxResults, page.hasMore ?? false) } +} + +export async function listEdmDimensions( + input: EdmInput<'list_dimensions'>, + context: EdmOperationContext +) { + const page = await readEdmApplications(context, `id::${input.applicationId}`) + const application = page.items.find( + (item) => item.id.toLowerCase() === input.applicationId.toLowerCase() + ) + if (!application) throw new EdmOperationError('The EDM application was not found', 404) + return { + applicationId: application.id, + dimensions: projectEdmList(application.dimensions, input.maxResults), + } +} + +export async function listEdmViews(input: EdmInput<'list_views'>, context: EdmOperationContext) { + const q = input.dimensionId + ? `dimension::${input.dimensionId}` + : input.objectStatus + ? `objectStatus::${input.objectStatus}` + : undefined + const page = await readEdmViews(context, q) + return { views: projectEdmList(page.items, input.maxResults, page.hasMore ?? false) } +} + +export async function listEdmViewpoints( + input: EdmInput<'list_viewpoints'>, + context: EdmOperationContext +) { + const q = input.dimensionId + ? `dimension::${input.dimensionId}` + : input.applicationId + ? `application::${input.applicationId}` + : undefined + const page = await readEdmViewpoints(input.viewId, context, q) + return { viewpoints: projectEdmList(page.items, input.maxResults, page.hasMore ?? false) } +} + +export async function readEdmNodeTypes( + viewId: string, + viewpointId: string, + context: EdmOperationContext +) { + const page = await readEdmViewpoints(viewId, context) + const viewpoint = page.items.find((item) => item.id.toLowerCase() === viewpointId.toLowerCase()) + if (!viewpoint) + throw new EdmOperationError('The EDM viewpoint was not found in the returned view', 404) + return viewpoint.nodeTypeAssignments.map((assignment) => ({ + ...assignment.nodeTypeLink, + viewpointId: viewpoint.id, + relatedViewpoints: assignment.relatedViewpoints, + })) +} + +export async function listEdmNodeTypes( + input: EdmInput<'list_node_types'>, + context: EdmOperationContext +) { + return { + nodeTypes: projectEdmList( + await readEdmNodeTypes(input.viewId, input.viewpointId, context), + input.maxResults + ), + } +} + +export async function getEdmNodeType( + input: EdmInput<'get_node_type'>, + context: EdmOperationContext +) { + const assignments = await readEdmNodeTypes(input.viewId, input.viewpointId, context) + const nodeType = assignments.find( + (item) => item.id.toLowerCase() === input.nodeTypeId.toLowerCase() + ) + if (!nodeType) + throw new EdmOperationError('The EDM node type is not assigned to the selected viewpoint', 404) + return { nodeType } +} diff --git a/apps/sim/lib/internal/oracle-epm-enterprise-data-management/operations/exports.ts b/apps/sim/lib/internal/oracle-epm-enterprise-data-management/operations/exports.ts new file mode 100644 index 00000000000..1988c43352b --- /dev/null +++ b/apps/sim/lib/internal/oracle-epm-enterprise-data-management/operations/exports.ts @@ -0,0 +1,72 @@ +import { filterUndefined } from '@sim/utils/object' +import { edmEndpoints } from '@/lib/internal/oracle-epm-enterprise-data-management/endpoints' +import { startEdmJob } from '@/lib/internal/oracle-epm-enterprise-data-management/jobs' +import type { + EdmInput, + EdmOperationContext, +} from '@/lib/internal/oracle-epm-enterprise-data-management/types' + +export async function exportEdmDimension( + input: EdmInput<'export_dimension'>, + context: EdmOperationContext +) { + return startEdmJob( + edmEndpoints.exportDimension, + filterUndefined({ + applicationName: input.applicationName, + dimensionName: input.dimensionName, + fileName: input.fileName, + connection: input.connection, + }), + input, + context, + undefined, + input.connection ? undefined : input.fileName + ) +} + +export async function incrementalExportEdmDimension( + input: EdmInput<'incremental_export_dimension'>, + context: EdmOperationContext +) { + return startEdmJob( + edmEndpoints.incrementalExport, + filterUndefined({ + applicationName: input.applicationName, + dimensionName: input.dimensionName, + fileName: input.fileName, + bindingNames: input.bindingNames, + nodeChangeTypes: input.nodeChangeTypes, + since: input.since, + sinceLastExportOfType: input.sinceLastExportOfType, + connectionName: input.connectionName, + }), + input, + context, + undefined, + input.connectionName ? undefined : input.fileName + ) +} + +export async function extractEdmDimensionViewpoint( + input: EdmInput<'extract_dimension_viewpoint'>, + context: EdmOperationContext +) { + return startEdmJob( + edmEndpoints.extractViewpoint, + filterUndefined({ + applicationName: input.applicationName, + dimensionName: input.dimensionName, + fileName: input.fileName, + extractName: input.extractName, + connection: input.connection, + fromTime: input.fromTime, + toTime: input.toTime, + requestNumber: input.requestNumber, + }), + input, + context, + undefined, + input.connection ? undefined : input.fileName + ) +} diff --git a/apps/sim/lib/internal/oracle-epm-enterprise-data-management/operations/imports.ts b/apps/sim/lib/internal/oracle-epm-enterprise-data-management/operations/imports.ts new file mode 100644 index 00000000000..ac641242a05 --- /dev/null +++ b/apps/sim/lib/internal/oracle-epm-enterprise-data-management/operations/imports.ts @@ -0,0 +1,61 @@ +import { filterUndefined } from '@sim/utils/object' +import { edmEndpoints } from '@/lib/internal/oracle-epm-enterprise-data-management/endpoints' +import { uploadEdmFile } from '@/lib/internal/oracle-epm-enterprise-data-management/files' +import { startEdmJob } from '@/lib/internal/oracle-epm-enterprise-data-management/jobs' +import { validateEdmStagingLink } from '@/lib/internal/oracle-epm-enterprise-data-management/links' +import type { + EdmInput, + EdmOperationContext, +} from '@/lib/internal/oracle-epm-enterprise-data-management/types' + +async function stageFile( + input: { file?: unknown; fileName: string }, + context: EdmOperationContext +) { + if (input.file === undefined) return + const result = await uploadEdmFile( + edmEndpoints.uploadStaging, + input.file, + input.fileName, + context + ) + validateEdmStagingLink(context.client, result.data, input.fileName) +} + +export async function importEdmDimension( + input: EdmInput<'import_dimension'>, + context: EdmOperationContext +) { + await stageFile(input, context) + return startEdmJob( + edmEndpoints.importDimension, + filterUndefined({ + applicationName: input.applicationName, + dimensionName: input.dimensionName, + fileName: input.fileName, + importOption: input.importOption, + connection: input.connection, + }), + input, + context + ) +} + +export async function loadEdmViewpoint( + input: EdmInput<'load_viewpoint'>, + context: EdmOperationContext +) { + await stageFile(input, context) + return startEdmJob( + edmEndpoints.loadViewpoint, + { + viewName: input.viewName, + viewpointName: input.viewpointName, + fileName: input.fileName, + purpose: input.purpose, + loadOption: input.loadOption, + }, + input, + context + ) +} diff --git a/apps/sim/lib/internal/oracle-epm-enterprise-data-management/operations/index.ts b/apps/sim/lib/internal/oracle-epm-enterprise-data-management/operations/index.ts new file mode 100644 index 00000000000..d7125cd7e80 --- /dev/null +++ b/apps/sim/lib/internal/oracle-epm-enterprise-data-management/operations/index.ts @@ -0,0 +1,43 @@ +export { + getEdmNodeType, + listEdmApplications, + listEdmDimensions, + listEdmNodeTypes, + listEdmViewpoints, + listEdmViews, +} from '@/lib/internal/oracle-epm-enterprise-data-management/operations/discovery' +export { + exportEdmDimension, + extractEdmDimensionViewpoint, + incrementalExportEdmDimension, +} from '@/lib/internal/oracle-epm-enterprise-data-management/operations/exports' +export { + importEdmDimension, + loadEdmViewpoint, +} from '@/lib/internal/oracle-epm-enterprise-data-management/operations/imports' +export { + getEdmJobResult, + getEdmJobStatus, +} from '@/lib/internal/oracle-epm-enterprise-data-management/operations/jobs' +export { + exportEdmMappings, + getEdmMappingKeys, +} from '@/lib/internal/oracle-epm-enterprise-data-management/operations/mappings' +export { + browseEdmNodes, + getEdmNode, + listEdmNodes, +} from '@/lib/internal/oracle-epm-enterprise-data-management/operations/nodes' +export { + assignEdmRequest, + createEdmRequest, + deleteEdmRequest, + generateEdmRequestAttachment, + getEdmRequest, + getEdmRequestLineage, + importEdmRequestAttachment, + queryEdmRequests, + transitionEdmRequest, + uploadEdmRequestAttachment, +} from '@/lib/internal/oracle-epm-enterprise-data-management/operations/requests' +export { validateEdmViewpoint } from '@/lib/internal/oracle-epm-enterprise-data-management/operations/validations' diff --git a/apps/sim/lib/internal/oracle-epm-enterprise-data-management/operations/jobs.ts b/apps/sim/lib/internal/oracle-epm-enterprise-data-management/operations/jobs.ts new file mode 100644 index 00000000000..169d4439902 --- /dev/null +++ b/apps/sim/lib/internal/oracle-epm-enterprise-data-management/operations/jobs.ts @@ -0,0 +1,25 @@ +import { + downloadEdmJobResult, + readEdmJob, + readEdmJobResult, +} from '@/lib/internal/oracle-epm-enterprise-data-management/jobs' +import type { + EdmInput, + EdmOperationContext, +} from '@/lib/internal/oracle-epm-enterprise-data-management/types' + +export async function getEdmJobStatus( + input: EdmInput<'get_job_status'>, + context: EdmOperationContext +) { + return { job: await readEdmJob(input.jobRunId, context) } +} + +export async function getEdmJobResult( + input: EdmInput<'get_job_result'>, + context: EdmOperationContext +) { + return input.downloadFile + ? downloadEdmJobResult(input.jobRunId, input.fileName, context) + : { result: await readEdmJobResult(input.jobRunId, context) } +} diff --git a/apps/sim/lib/internal/oracle-epm-enterprise-data-management/operations/mappings.ts b/apps/sim/lib/internal/oracle-epm-enterprise-data-management/operations/mappings.ts new file mode 100644 index 00000000000..3d987f9f5c4 --- /dev/null +++ b/apps/sim/lib/internal/oracle-epm-enterprise-data-management/operations/mappings.ts @@ -0,0 +1,42 @@ +import { filterUndefined } from '@sim/utils/object' +import { edmEndpoints } from '@/lib/internal/oracle-epm-enterprise-data-management/endpoints' +import { startEdmJob } from '@/lib/internal/oracle-epm-enterprise-data-management/jobs' +import { edmMappingKeysSchema } from '@/lib/internal/oracle-epm-enterprise-data-management/schemas' +import { + type EdmInput, + type EdmOperationContext, + edmJsonData, +} from '@/lib/internal/oracle-epm-enterprise-data-management/types' + +export async function getEdmMappingKeys( + input: EdmInput<'get_mapping_keys'>, + context: EdmOperationContext +) { + const data = edmJsonData( + await context.client.request(edmEndpoints.mappingKeys, { + pathParams: { dimensionId: input.dimensionId, bindingId: input.bindingId }, + signal: context.signal, + }) + ) + return edmMappingKeysSchema.parse(data) +} + +export async function exportEdmMappings( + input: EdmInput<'export_mappings'>, + context: EdmOperationContext +) { + return startEdmJob( + edmEndpoints.exportMappings, + filterUndefined({ + applicationName: input.applicationName, + dimensionName: input.dimensionName, + fileName: input.fileName, + mappingLocation: input.mappingLocation, + connection: input.connection, + }), + input, + context, + undefined, + input.connection ? undefined : input.fileName + ) +} diff --git a/apps/sim/lib/internal/oracle-epm-enterprise-data-management/operations/nodes.ts b/apps/sim/lib/internal/oracle-epm-enterprise-data-management/operations/nodes.ts new file mode 100644 index 00000000000..efdf135e018 --- /dev/null +++ b/apps/sim/lib/internal/oracle-epm-enterprise-data-management/operations/nodes.ts @@ -0,0 +1,114 @@ +import { edmEndpoints } from '@/lib/internal/oracle-epm-enterprise-data-management/endpoints' +import { browseEdmHierarchy } from '@/lib/internal/oracle-epm-enterprise-data-management/hierarchy' +import { + edmNodeSchema, + edmPageSchema, +} from '@/lib/internal/oracle-epm-enterprise-data-management/schemas' +import { + type EdmInput, + type EdmOperationContext, + edmJsonData, +} from '@/lib/internal/oracle-epm-enterprise-data-management/types' + +export async function readEdmNodePage( + input: { + viewId: string + viewpointId: string + q: string + limit: number + offset: number + expand?: string + fromId?: string + toId?: string + orderBy?: string + }, + context: EdmOperationContext +) { + const { viewId, viewpointId, ...query } = input + const data = edmJsonData( + await context.client.request(edmEndpoints.nodes, { + pathParams: { viewId, viewpointId }, + query, + signal: context.signal, + }) + ) + return edmPageSchema(edmNodeSchema).parse(data) +} + +export async function listEdmNodes(input: EdmInput<'list_nodes'>, context: EdmOperationContext) { + const q = + input.scope === 'children' + ? `childrenOfNode::${input.parentNodeId}` + : input.scope === 'request' + ? `request::${input.requestId}` + : input.scope + const page = await readEdmNodePage( + { + viewId: input.viewId, + viewpointId: input.viewpointId, + q, + limit: input.limit, + offset: input.offset, + expand: input.expand ?? 'propertyValues::none', + fromId: input.fromId, + toId: input.toId, + orderBy: input.orderBy, + }, + context + ) + const nodes = page.items.slice(0, input.limit) + const hasMore = page.hasMore ?? page.items.length >= input.limit + return { + nodes, + count: nodes.length, + offset: input.offset, + hasMore, + nextOffset: hasMore ? input.offset + nodes.length : null, + truncated: page.items.length > input.limit, + } +} + +export async function getEdmNode( + input: EdmInput<'get_node'> | EdmInput<'get_node_at_location'>, + context: EdmOperationContext +) { + const atLocation = input.operation === 'oracle_epm_edm_get_node_at_location' + const data = edmJsonData( + await context.client.request(atLocation ? edmEndpoints.nodeAtLocation : edmEndpoints.node, { + pathParams: { + viewId: input.viewId, + viewpointId: input.viewpointId, + nodeId: input.nodeId, + ...(atLocation ? { location: input.location } : {}), + }, + query: { + q: input.requestId ? `request::${input.requestId}` : undefined, + expand: input.expand, + }, + signal: context.signal, + }) + ) + return { node: edmNodeSchema.parse(data) } +} + +export async function browseEdmNodes( + input: EdmInput<'browse_hierarchy'>, + context: EdmOperationContext +) { + return browseEdmHierarchy( + input, + (frontier, limit) => + readEdmNodePage( + { + viewId: input.viewId, + viewpointId: input.viewpointId, + q: frontier.parentNodeId ? `childrenOfNode::${frontier.parentNodeId}` : 'top', + limit, + offset: frontier.offset, + expand: 'propertyValues::none', + }, + context + ), + context.signal + ) +} diff --git a/apps/sim/lib/internal/oracle-epm-enterprise-data-management/operations/requests.ts b/apps/sim/lib/internal/oracle-epm-enterprise-data-management/operations/requests.ts new file mode 100644 index 00000000000..ba25abbdb2e --- /dev/null +++ b/apps/sim/lib/internal/oracle-epm-enterprise-data-management/operations/requests.ts @@ -0,0 +1,184 @@ +import { filterUndefined } from '@sim/utils/object' +import { edmEndpoints } from '@/lib/internal/oracle-epm-enterprise-data-management/endpoints' +import { uploadEdmFile } from '@/lib/internal/oracle-epm-enterprise-data-management/files' +import { startEdmJob } from '@/lib/internal/oracle-epm-enterprise-data-management/jobs' +import { edmAttachmentLink } from '@/lib/internal/oracle-epm-enterprise-data-management/links' +import { projectEdmList } from '@/lib/internal/oracle-epm-enterprise-data-management/operations/discovery' +import { + edmLineageSchema, + edmPageSchema, + edmRequestSchema, +} from '@/lib/internal/oracle-epm-enterprise-data-management/schemas' +import { + type EdmInput, + type EdmOperationContext, + edmJsonData, +} from '@/lib/internal/oracle-epm-enterprise-data-management/types' + +export async function createEdmRequest( + input: EdmInput<'create_request'>, + context: EdmOperationContext +) { + const data = edmJsonData( + await context.client.request(edmEndpoints.createRequest, { + json: filterUndefined({ + viewUri: `${context.instanceUrl}/epm/rest/v1/views/${encodeURIComponent(input.viewId)}`, + origin: 'INTERACTIVE', + title: input.title, + description: input.description, + notes: input.notes, + priority: input.priority, + timeLabelName: input.timeLabelName, + }), + signal: context.signal, + }) + ) + return { request: edmRequestSchema.parse(data) } +} + +export async function getEdmRequest(input: EdmInput<'get_request'>, context: EdmOperationContext) { + const data = edmJsonData( + await context.client.request(edmEndpoints.request, { + pathParams: { requestId: input.requestId }, + signal: context.signal, + }) + ) + return { request: edmRequestSchema.parse(data) } +} + +export async function queryEdmRequests( + input: EdmInput<'query_requests'>, + context: EdmOperationContext +) { + const data = edmJsonData( + await context.client.request(edmEndpoints.queryRequests, { + query: { + lastDays: input.fromDate === undefined ? (input.lastDays ?? 30) : undefined, + fromDate: input.fromDate, + toDate: input.toDate, + myActivity: input.myActivity, + owner: input.owner, + priority: input.priority, + requestNumber: input.requestNumber?.toString(), + requestType: input.requestType, + stage: input.stage, + status: input.status, + timeLabelName: input.timeLabelName, + viewName: input.viewName, + expand: input.expandWorkflow ? 'workflow' : undefined, + }, + signal: context.signal, + }) + ) + const page = edmPageSchema(edmRequestSchema).parse(data) + return { requests: projectEdmList(page.items, input.maxResults, page.hasMore ?? false) } +} + +export async function getEdmRequestLineage( + input: EdmInput<'get_request_lineage'>, + context: EdmOperationContext +) { + const data = edmJsonData( + await context.client.request(edmEndpoints.lineage, { + pathParams: { requestId: input.requestId }, + signal: context.signal, + }) + ) + return { lineage: edmLineageSchema.parse(data) } +} + +export async function assignEdmRequest( + input: EdmInput<'assign_request'>, + context: EdmOperationContext +) { + const data = edmJsonData( + await context.client.request(edmEndpoints.assignRequest, { + json: filterUndefined({ + requestNumber: input.requestNumber, + userName: input.userName, + comment: input.comment, + }), + signal: context.signal, + }) + ) + return { request: edmRequestSchema.parse(data) } +} + +export async function deleteEdmRequest( + input: EdmInput<'delete_request'>, + context: EdmOperationContext +) { + await context.client.request(edmEndpoints.deleteRequest, { + pathParams: { requestId: input.requestId }, + signal: context.signal, + }) + return { requestId: input.requestId, deleted: true } +} + +export async function uploadEdmRequestAttachment( + input: EdmInput<'upload_request_attachment'>, + context: EdmOperationContext +) { + const response = await uploadEdmFile( + edmEndpoints.uploadAttachment, + input.file, + input.fileName, + context, + { requestId: input.requestId } + ) + return { + requestId: input.requestId, + fileName: response.fileName, + ...edmAttachmentLink(context.client, response.data, input.requestId), + } +} + +export async function generateEdmRequestAttachment( + input: EdmInput<'generate_request_attachment'>, + context: EdmOperationContext +) { + return startEdmJob( + edmEndpoints.generateAttachment, + filterUndefined({ + fileName: input.fileName, + items: input.items, + overwrite: input.overwrite, + }), + input, + context, + { requestId: input.requestId } + ) +} + +export async function importEdmRequestAttachment( + input: EdmInput<'import_request_attachment'>, + context: EdmOperationContext +) { + return startEdmJob( + edmEndpoints.importAttachment, + { + attachmentUri: `${context.instanceUrl}/epm/rest/v1/requests/${encodeURIComponent(input.requestId)}/attachments/${encodeURIComponent(input.attachmentId)}`, + sheetNames: input.sheetNames, + }, + input, + context, + { requestId: input.requestId } + ) +} + +export async function transitionEdmRequest( + input: EdmInput<'transition_request'>, + context: EdmOperationContext +) { + return startEdmJob( + edmEndpoints.transitionRequest, + filterUndefined({ + action: input.action, + comment: input.comment, + transitionWithWarning: input.transitionWithWarning, + }), + input, + context, + { requestId: input.requestId } + ) +} diff --git a/apps/sim/lib/internal/oracle-epm-enterprise-data-management/operations/validations.ts b/apps/sim/lib/internal/oracle-epm-enterprise-data-management/operations/validations.ts new file mode 100644 index 00000000000..f9511c99c32 --- /dev/null +++ b/apps/sim/lib/internal/oracle-epm-enterprise-data-management/operations/validations.ts @@ -0,0 +1,26 @@ +import { filterUndefined } from '@sim/utils/object' +import { edmEndpoints } from '@/lib/internal/oracle-epm-enterprise-data-management/endpoints' +import { startEdmJob } from '@/lib/internal/oracle-epm-enterprise-data-management/jobs' +import type { + EdmInput, + EdmOperationContext, +} from '@/lib/internal/oracle-epm-enterprise-data-management/types' + +export async function validateEdmViewpoint( + input: EdmInput<'validate_viewpoint'>, + context: EdmOperationContext +) { + return startEdmJob( + edmEndpoints.validateViewpoint, + filterUndefined({ + viewName: input.viewName, + viewpointName: input.viewpointName, + fileName: input.fileName, + requestNumber: input.requestNumber, + }), + input, + context, + undefined, + input.fileName + ) +} diff --git a/apps/sim/lib/internal/oracle-epm-enterprise-data-management/schemas.test.ts b/apps/sim/lib/internal/oracle-epm-enterprise-data-management/schemas.test.ts new file mode 100644 index 00000000000..dc2e84d45c0 --- /dev/null +++ b/apps/sim/lib/internal/oracle-epm-enterprise-data-management/schemas.test.ts @@ -0,0 +1,183 @@ +/** @vitest-environment node */ +import { describe, expect, it } from 'vitest' +import { + edmApplicationSchema, + edmInputSchemas, + edmJobResultSchema, + edmJobSchema, + edmLinkEnvelopeSchema, + edmNodeSchema, + edmRequestSchema, +} from '@/lib/internal/oracle-epm-enterprise-data-management/schemas' + +const id = '11111111-1111-4111-8111-111111111111' +const auth = { + oauthCredential: 'credential', + accessToken: 'dTpw', + instanceUrl: 'https://edm.example.com', +} +const base = { + ...auth, + applicationName: 'Planning', + dimensionName: 'Account', + fileName: 'account.csv', +} + +describe('EDM documented contracts and input boundaries', () => { + it.each([1700000000000, '2026-01-02T03:04:05.000Z'])( + 'accepts documented timestamp representations: %s', + (created) => { + expect(edmJobSchema.parse({ id, status: 'COMPLETED', created }).created).toBe(created) + } + ) + it('accepts links-only asynchronous responses without inventing entity fields', () => { + expect( + edmLinkEnvelopeSchema.parse({ + links: [{ rel: 'results', href: `https://edm.example.com/epm/rest/v1/jobRuns/${id}` }], + }).links + ).toHaveLength(1) + }) + it('preserves opaque job results without interpreting their nested schema', () => { + const result = { sheets: [{ providerSpecific: ['arbitrary', 12, null] }], futureField: false } + expect(edmJobResultSchema.parse({ id, status: 'COMPLETED', result }).result).toEqual(result) + }) + it('projects documented node fields instead of recursive provider extras', () => { + const node = edmNodeSchema.parse({ + id, + name: 'Account', + location: id, + propertyValues: [{ value: null, displayValue: '' }], + children: [{ secret: 'not projected' }], + }) + expect(node.propertyValues[0].value).toBeNull() + expect(node).not.toHaveProperty('children') + expect(node.path).toEqual([]) + }) + it('keeps subscription request relationships and excludes sensitive user fields', () => { + const request = edmRequestSchema.parse({ + id, + origin: 'SUBSCRIPTION', + sourceRequest: { id }, + autoSubmitted: false, + validTransitionActions: ['SUBMIT'], + createdByUser: { id, userName: 'reviewer', ssoToken: 'secret' }, + }) + expect(request).toMatchObject({ + origin: 'SUBSCRIPTION', + autoSubmitted: false, + sourceRequest: { id }, + validTransitionActions: ['SUBMIT'], + }) + expect(request.createdByUser).not.toHaveProperty('ssoToken') + }) + it('accepts optional application data without requiring unavailable bindings', () => { + expect( + edmApplicationSchema.parse({ id, name: 'Planning', dimensions: [{ id, name: 'Account' }] }) + .dimensions[0].bindings + ).toEqual([]) + }) + it.each(['import_dimension', 'load_viewpoint'] as const)( + 'requires an explicit mode for %s', + (action) => { + const fields = { + ...base, + viewName: 'Enterprise', + viewpointName: 'Accounts', + purpose: 'Approved changes', + operation: `oracle_epm_edm_${action}`, + } + expect(edmInputSchemas[action].safeParse(fields).success).toBe(false) + } + ) + it('preserves explicitly false workflow options', () => { + const parsed = edmInputSchemas.transition_request.parse({ + ...auth, + operation: 'oracle_epm_edm_transition_request', + requestId: id, + action: 'SUBMIT', + transitionWithWarning: false, + waitForCompletion: false, + }) + expect(parsed.transitionWithWarning).toBe(false) + expect(parsed.waitForCompletion).toBe(false) + }) + it.each([ + { lastDays: 91 }, + { fromDate: 1 }, + { fromDate: 1, toDate: 90 * 86400 + 2 }, + { fromDate: 20, toDate: 1 }, + { fromDate: 1, toDate: 2, lastDays: 1 }, + { owner: 'one,two' }, + { requestType: 'Interactive,Subscription' }, + ])('rejects ambiguous or oversized request windows and filters: %j', (input) => { + expect( + edmInputSchemas.query_requests.safeParse({ + ...auth, + operation: 'oracle_epm_edm_query_requests', + ...input, + }).success + ).toBe(false) + }) + it('accepts a 90-day epoch-second window without a relative default', () => { + const parsed = edmInputSchemas.query_requests.parse({ + ...auth, + operation: 'oracle_epm_edm_query_requests', + fromDate: 1700000000, + toDate: 1700000000 + 90 * 86400, + }) + expect(parsed.lastDays).toBeUndefined() + }) + it.each([{}, { since: 1, sinceLastExportOfType: 'FULL' }])( + 'requires exactly one incremental-export boundary: %j', + (boundary) => { + expect( + edmInputSchemas.incremental_export_dimension.safeParse({ + ...base, + operation: 'oracle_epm_edm_incremental_export_dimension', + bindingNames: ['Account'], + nodeChangeTypes: ['NEW'], + ...boundary, + }).success + ).toBe(false) + } + ) + it('rejects unbounded traversal before provider work', () => { + expect( + edmInputSchemas.browse_hierarchy.safeParse({ + ...auth, + operation: 'oracle_epm_edm_browse_hierarchy', + viewId: id, + viewpointId: id, + maxDepth: 4, + }).success + ).toBe(false) + }) + it.each([ + { scope: 'children' }, + { scope: 'request' }, + { scope: 'top', parentNodeId: id }, + { fromId: id, toId: id }, + ])('rejects inconsistent node scope: %j', (input) => { + expect( + edmInputSchemas.list_nodes.safeParse({ + ...auth, + operation: 'oracle_epm_edm_list_nodes', + viewId: id, + viewpointId: id, + ...input, + }).success + ).toBe(false) + }) + it.each(['../account.csv', 'a/b.csv', 'a\\b.csv', 'a\r\nInjected: yes'])( + 'rejects a non-file staging name: %s', + (fileName) => { + expect( + edmInputSchemas.export_dimension.safeParse({ + ...base, + operation: 'oracle_epm_edm_export_dimension', + fileName, + }).success + ).toBe(false) + } + ) +}) diff --git a/apps/sim/lib/internal/oracle-epm-enterprise-data-management/schemas.ts b/apps/sim/lib/internal/oracle-epm-enterprise-data-management/schemas.ts new file mode 100644 index 00000000000..aa56ca6aa3e --- /dev/null +++ b/apps/sim/lib/internal/oracle-epm-enterprise-data-management/schemas.ts @@ -0,0 +1,614 @@ +import { z } from 'zod' +import { FileInputSchema } from '@/lib/uploads/utils/file-schemas' + +const text = z.string().max(20_000) +const name = z.string().trim().min(1).max(255) +const id = z.string().trim().uuid() +const optionalText = text.nullish() +const timestamp = z.union([z.number().int(), z.string().max(64)]).nullish() +const strings = z.array(text).max(1000) +const count = z.number().int().nonnegative().nullish() +const links = z + .array( + z.object({ + rel: z.string().max(128), + href: z.string().max(4096), + method: z.string().max(16).optional(), + }) + ) + .max(100) + .nullish() + .transform((value) => value ?? []) + +export const edmLinkEnvelopeSchema = z.object({ links }) +export const edmReferenceSchema = z.object({ + id, + name: optionalText, + description: optionalText, + links, +}) +const ref = edmReferenceSchema.nullish() +const refs = z + .array(edmReferenceSchema) + .max(1000) + .nullish() + .transform((value) => value ?? []) +const entity = { + id, + name: text, + description: optionalText, + objectStatus: optionalText, + timeCreated: timestamp, + timeModified: timestamp, + permittedActions: strings.nullish().transform((value) => value ?? []), + links, +} + +export const edmDimensionSchema = z.object({ + ...entity, + dimensionType: optionalText, + connected: z.boolean().nullish(), + externalName: optionalText, + isBound: z.boolean().nullish(), + supportsMapping: z.boolean().nullish(), + supportsMappingExport: z.boolean().nullish(), + supportsExtracts: z.boolean().nullish(), + supportedDirection: optionalText, + bindings: z + .array( + z.object({ + id, + name: optionalText, + description: optionalText, + bindingType: optionalText, + viewpoint: ref, + view: ref, + links, + }) + ) + .max(1000) + .nullish() + .transform((value) => value ?? []), +}) +export const edmApplicationSchema = z.object({ + ...entity, + primaryView: ref, + supportedDirection: optionalText, + dimensions: z + .array(edmDimensionSchema) + .max(1000) + .nullish() + .transform((value) => value ?? []), +}) +export const edmViewSchema = z.object({ ...entity, master: z.boolean().nullish() }) +export const edmNodeTypeAssignmentSchema = z.object({ + nodeTypeLink: edmReferenceSchema, + relatedViewpoints: refs, +}) +export const edmViewpointSchema = z.object({ + ...entity, + label: optionalText, + hasHierarchy: z.boolean().nullish(), + scope: optionalText, + bindingType: optionalText, + viewId: id.nullish(), + viewName: optionalText, + applicationLink: ref, + dimensionLink: ref, + nodeSetLink: ref, + hierarchySetLink: ref, + nodeTypeAssignments: z + .array(edmNodeTypeAssignmentSchema) + .max(1000) + .nullish() + .transform((value) => value ?? []), +}) + +const validation = z.object({ + message: optionalText, + code: optionalText, + type: optionalText, + severity: optionalText, + userCanResolve: z.boolean().nullish(), + timeCreated: timestamp, +}) +export const edmNodeSchema = z.object({ + id, + name: text, + description: optionalText, + nodeType: ref, + hasChildren: z.boolean().nullish(), + location: text.nullish(), + path: refs, + relationshipId: id.nullish(), + parentNodeId: id.nullish(), + parentName: optionalText, + parentNodeTypeId: id.nullish(), + childCount: count, + locationCount: count, + previousLocation: optionalText, + nextLocation: optionalText, + propertyCount: count, + propertyValues: z + .array( + z.object({ + value: optionalText, + displayValue: optionalText, + propertyName: optionalText, + propertyId: id.nullish(), + origin: optionalText, + propertyLevel: optionalText, + labels: strings.nullish().transform((value) => value ?? []), + readOnly: z.boolean().nullish(), + validated: z.boolean().nullish(), + }) + ) + .max(1000) + .nullish() + .transform((value) => value ?? []), + requestItem: z + .object({ + id, + name: optionalText, + description: optionalText, + actionCount: count, + nodeTypeName: optionalText, + nodeTypeId: id.nullish(), + applicationName: optionalText, + actionSummary: optionalText, + validations: z + .array(validation) + .max(1000) + .nullish() + .transform((value) => value ?? []), + }) + .nullish(), + links, +}) + +const user = z + .object({ + id: id.nullish(), + userName: optionalText, + fullName: optionalText, + }) + .nullish() +export const EDM_TRANSITIONS = [ + 'SUBMIT', + 'APPROVE', + 'PUSHBACK', + 'REJECT', + 'WITHDRAW', + 'RECALL', + 'COMMIT', + 'CLOSE', +] as const +export const edmRequestSchema = z.object({ + id, + title: optionalText, + description: optionalText, + priority: optionalText, + origin: optionalText, + requestType: optionalText, + status: optionalText, + stage: optionalText, + requestNumber: count, + timeCreated: timestamp, + timeModified: timestamp, + timeSubmitted: timestamp, + blockedUntil: timestamp, + notes: optionalText, + itemCount: count, + commentCount: count, + validationErrorCount: count, + attachmentCount: count, + actionCount: count, + commentRequiredOnTransition: z.boolean().nullish(), + validTransitionActions: z + .array(z.enum(EDM_TRANSITIONS)) + .max(8) + .nullish() + .transform((value) => value ?? []), + viewId: id.nullish(), + viewName: optionalText, + createdByUser: user, + modifiedByUser: user, + submittedByUser: user, + assignedToUser: user, + owner: user, + sourceRequest: ref, + subscriptions: refs, + autoSubmitted: z.boolean().nullish(), + links, +}) +const subscription = z.object({ + id, + name: optionalText, + description: optionalText, + sourceViewpoint: ref, + targetViewpoint: ref, + sourceRequest: id.nullish(), + targetRequest: id.nullish(), + subscriptionStatus: optionalText, + message: optionalText, + assigneeName: optionalText, + timeCreated: timestamp, + timeModified: timestamp, +}) +export const edmLineageSchema = z.object({ + requestLineageNodes: z + .array( + z.object({ + id, + title: optionalText, + origin: optionalText, + status: optionalText, + autoSubmitted: z.boolean().nullish(), + sourceRequest: ref, + timeCreated: timestamp, + viewpoints: refs, + incompleteSubscriptions: z + .array(subscription) + .max(1000) + .nullish() + .transform((value) => value ?? []), + links, + }) + ) + .max(1000), + subscriptionInstances: z + .array(subscription) + .max(1000) + .nullish() + .transform((value) => value ?? []), + links, +}) +export const edmJobSchema = z.object({ + id, + description: optionalText, + origin: optionalText, + status: z.enum(['PENDING', 'RUNNING', 'ERROR', 'COMPLETED']), + error: optionalText, + created: timestamp, + lastModified: timestamp, + jobSize: count, + jobProgress: count, + links, +}) +/** Oracle documents only JsonNode for result; no operation-specific result paths are inferred. */ +export const edmJobResultSchema = edmJobSchema + .omit({ error: true, jobSize: true, jobProgress: true }) + .extend({ + result: z.unknown(), + }) +export const edmMappingKeysSchema = z.object({ + mapKeys: z + .array( + z.object({ + location: text, + sourceNodeType: ref, + targetNodeType: ref, + defaultLocation: z.boolean().nullish(), + }) + ) + .max(1000), +}) +export function edmPageSchema(item: T) { + return z.object({ + items: z.array(item).max(5000), + hasMore: z.boolean().nullish(), + count, + totalResults: count, + limit: count, + offset: count, + links, + }) +} + +const auth = { + oauthCredential: z.string().trim().min(1).max(1024), + accessToken: z.string().min(1).max(8192), + instanceUrl: z.string().trim().min(1).max(2048), +} +const maxResults = z.number().int().min(1).max(500).default(200) +const view = { viewId: id } +const viewpoint = { ...view, viewpointId: id } +const request = { requestId: id } +const job = { jobRunId: id } +const wait = { + waitForCompletion: z.boolean().default(true), + maxWaitSeconds: z.number().int().min(1).max(240).default(120), +} +const fileName = name.refine( + (value) => !/[\\/\r\n\u0000]/.test(value) && value !== '.' && value !== '..', + 'File name must be a single file name, not a path' +) +const fileOutput = { fileName, ...wait } +const dimensionNames = { applicationName: name, dimensionName: name } +const viewpointNames = { viewName: name, viewpointName: name } +const expansion = z + .enum([ + 'propertyValues::none', + 'propertyValues::all', + 'propertyValues::columnVisible', + 'propertyValues::locationVisible', + 'requestItem.validations', + 'bestLocationRtl', + ]) + .optional() +const nodeDetail = { ...viewpoint, nodeId: id, requestId: id.optional(), expand: expansion } +const positiveInteger = z.number().int().min(1).max(2_147_483_647) +const filterName = name.refine((value) => !value.includes(','), 'Select one value per filter') +const parseJson = (value: unknown) => { + if (typeof value !== 'string') return value + try { + return JSON.parse(value) + } catch { + return value + } +} +const stringList = z.preprocess(parseJson, z.array(name).min(1).max(100)) +function operation(action: T, fields: S) { + return z.object({ ...auth, operation: z.literal(`oracle_epm_edm_${action}`), ...fields }) +} + +export const edmInputSchemas = { + list_applications: operation('list_applications', { + applicationId: id.optional(), + permission: z + .enum(['owner', 'datamanager', 'participant', 'participant_with_write']) + .optional(), + maxResults, + }).refine( + (value) => !value.applicationId || !value.permission, + 'Choose applicationId or permission, not both' + ), + list_dimensions: operation('list_dimensions', { applicationId: id, maxResults }), + list_views: operation('list_views', { + dimensionId: id.optional(), + objectStatus: z.enum(['DRAFT', 'ACTIVE', 'ARCHIVED']).optional(), + maxResults, + }).refine( + (value) => !value.dimensionId || !value.objectStatus, + 'Choose dimensionId or objectStatus, not both' + ), + list_viewpoints: operation('list_viewpoints', { + ...view, + dimensionId: id.optional(), + applicationId: id.optional(), + maxResults, + }).refine( + (value) => !value.dimensionId || !value.applicationId, + 'Choose dimensionId or applicationId, not both' + ), + list_node_types: operation('list_node_types', { ...viewpoint, maxResults }), + get_node_type: operation('get_node_type', { ...viewpoint, nodeTypeId: id }), + list_nodes: operation('list_nodes', { + ...viewpoint, + scope: z.enum(['all', 'top', 'children', 'request']).default('top'), + parentNodeId: id.optional(), + requestId: id.optional(), + expand: expansion, + limit: z.number().int().min(1).max(100).default(50), + offset: z.number().int().min(0).max(1_000_000).default(0), + fromId: name.optional(), + toId: name.optional(), + orderBy: z.enum(['hsConfig:asc', 'hsConfig:desc']).optional(), + }).superRefine((value, ctx) => { + if (value.scope === 'children' && !value.parentNodeId) + ctx.addIssue({ + code: 'custom', + path: ['parentNodeId'], + message: 'parentNodeId is required for children', + }) + if (value.scope === 'request' && !value.requestId) + ctx.addIssue({ + code: 'custom', + path: ['requestId'], + message: 'requestId is required for request nodes', + }) + if (value.parentNodeId && value.scope !== 'children') + ctx.addIssue({ + code: 'custom', + path: ['parentNodeId'], + message: 'parentNodeId requires children scope', + }) + if (value.requestId && value.scope !== 'request') + ctx.addIssue({ + code: 'custom', + path: ['requestId'], + message: 'requestId requires request scope', + }) + if (value.fromId && value.toId) + ctx.addIssue({ + code: 'custom', + path: ['toId'], + message: 'fromId and toId cannot be combined', + }) + }), + get_node: operation('get_node', nodeDetail), + get_node_at_location: operation('get_node_at_location', { + ...nodeDetail, + location: name.refine( + (value) => value.split(',').every((part) => id.safeParse(part).success), + 'Location must contain comma-separated node UUIDs' + ), + }), + browse_hierarchy: operation('browse_hierarchy', { + ...viewpoint, + maxDepth: z.number().int().min(0).max(3).default(2), + maxNodes: z.number().int().min(1).max(500).default(200), + pageSize: z.number().int().min(1).max(100).default(50), + maxRequests: z.number().int().min(1).max(100).default(50), + }), + create_request: operation('create_request', { + ...view, + title: name.optional(), + description: text.optional(), + notes: text.optional(), + priority: z.enum(['NONE', 'LOW', 'MEDIUM', 'HIGH']).optional(), + timeLabelName: name.optional(), + }), + get_request: operation('get_request', request), + query_requests: operation('query_requests', { + lastDays: z.number().int().min(1).max(90).optional(), + fromDate: z.number().int().nonnegative().max(Number.MAX_SAFE_INTEGER).optional(), + toDate: z.number().int().nonnegative().max(Number.MAX_SAFE_INTEGER).optional(), + myActivity: z + .enum(['Assigned', 'Collaborated', 'Submitted', 'Invited', 'Contributed', 'Managed']) + .optional(), + owner: filterName.optional(), + priority: z.enum(['None', 'Low', 'Medium', 'High']).optional(), + requestNumber: positiveInteger.optional(), + requestType: z.enum(['Interactive', 'Subscription', 'Import', 'Consolidation']).optional(), + stage: z.enum(['Submit', 'Approved', 'Commit', 'Closed']).optional(), + status: z + .enum([ + 'Draft', + 'In Flight', + 'Recalled', + 'Pushed Back', + 'Completed', + 'Rejected', + 'Blocked', + 'Consolidated', + ]) + .optional(), + timeLabelName: filterName.optional(), + viewName: filterName.optional(), + expandWorkflow: z.boolean().optional(), + maxResults, + }).superRefine((value, ctx) => { + if (value.fromDate !== undefined || value.toDate !== undefined) { + if ( + value.lastDays !== undefined || + value.fromDate === undefined || + value.toDate === undefined || + value.toDate < value.fromDate || + value.toDate - value.fromDate > 90 * 86400 + ) + ctx.addIssue({ + code: 'custom', + path: ['fromDate'], + message: + 'Provide fromDate and toDate in epoch seconds, at most 90 days apart, without lastDays', + }) + } + }), + get_request_lineage: operation('get_request_lineage', request), + assign_request: operation('assign_request', { + requestNumber: positiveInteger, + userName: name, + comment: text.optional(), + }), + delete_request: operation('delete_request', request), + upload_request_attachment: operation('upload_request_attachment', { + ...request, + file: FileInputSchema, + fileName: fileName.optional(), + }), + generate_request_attachment: operation('generate_request_attachment', { + ...request, + ...fileOutput, + overwrite: z.boolean().optional(), + items: z.preprocess( + parseJson, + z + .array( + z.object({ + viewpoint: name, + data: z + .array(z.object({ header: name, value: text })) + .min(1) + .max(100), + }) + ) + .min(1) + .max(1000) + ), + }), + import_request_attachment: operation('import_request_attachment', { + ...request, + attachmentId: id, + sheetNames: stringList, + ...wait, + }), + transition_request: operation('transition_request', { + ...request, + action: z.enum(EDM_TRANSITIONS), + comment: text.optional(), + transitionWithWarning: z.boolean().optional(), + ...wait, + }), + get_job_status: operation('get_job_status', job), + get_job_result: operation('get_job_result', { + ...job, + downloadFile: z.boolean().default(false), + fileName: fileName.optional(), + }), + validate_viewpoint: operation('validate_viewpoint', { + ...viewpointNames, + ...fileOutput, + requestNumber: positiveInteger.optional(), + }), + get_mapping_keys: operation('get_mapping_keys', { dimensionId: id, bindingId: id }), + export_mappings: operation('export_mappings', { + ...dimensionNames, + ...fileOutput, + mappingLocation: name, + connection: name.optional(), + }), + import_dimension: operation('import_dimension', { + ...dimensionNames, + ...fileOutput, + file: FileInputSchema.optional(), + connection: name.optional(), + importOption: z.enum(['ResetDimension', 'ReplaceNodes', 'Merge']), + }).refine( + (value) => !(value.file && value.connection), + 'A Sim file upload cannot be combined with a configured connection' + ), + load_viewpoint: operation('load_viewpoint', { + ...viewpointNames, + ...fileOutput, + file: FileInputSchema.optional(), + purpose: name, + loadOption: z.enum(['ReplaceNodes', 'Merge']), + }), + export_dimension: operation('export_dimension', { + ...dimensionNames, + ...fileOutput, + connection: name.optional(), + }), + incremental_export_dimension: operation('incremental_export_dimension', { + ...dimensionNames, + ...fileOutput, + bindingNames: stringList, + nodeChangeTypes: z.preprocess( + parseJson, + z + .array(z.enum(['NEW', 'UPDATED'])) + .min(1) + .max(2) + .refine( + (values) => new Set(values).size === values.length, + 'Node change types must be unique' + ) + ), + since: z.number().int().nonnegative().max(Number.MAX_SAFE_INTEGER).optional(), + sinceLastExportOfType: z.enum(['FULL', 'INCREMENTAL']).optional(), + connectionName: name.optional(), + }).refine( + (value) => (value.since !== undefined) !== (value.sinceLastExportOfType !== undefined), + 'Provide exactly one of since or sinceLastExportOfType' + ), + extract_dimension_viewpoint: operation('extract_dimension_viewpoint', { + ...dimensionNames, + ...fileOutput, + extractName: name, + connection: name.optional(), + fromTime: name.optional(), + toTime: name.optional(), + requestNumber: positiveInteger.optional(), + }), +} diff --git a/apps/sim/lib/internal/oracle-epm-enterprise-data-management/types.ts b/apps/sim/lib/internal/oracle-epm-enterprise-data-management/types.ts new file mode 100644 index 00000000000..d93d3348706 --- /dev/null +++ b/apps/sim/lib/internal/oracle-epm-enterprise-data-management/types.ts @@ -0,0 +1,72 @@ +import type { z } from 'zod' +import type { OracleEpmClient, OracleEpmClientResponse } from '@/lib/internal/oracle-epm' +import type { + edmApplicationSchema, + edmDimensionSchema, + edmInputSchemas, + edmJobResultSchema, + edmJobSchema, + edmNodeSchema, + edmRequestSchema, + edmViewpointSchema, + edmViewSchema, +} from '@/lib/internal/oracle-epm-enterprise-data-management/schemas' +import type { InternalToolOperationContext } from '@/lib/internal/tool-operations/types' +import type { UserFile } from '@/executor/types' + +export type EdmAction = keyof typeof edmInputSchemas +export type EdmInput = z.output<(typeof edmInputSchemas)[A]> +export type EdmInputParams = z.input<(typeof edmInputSchemas)[A]> +export type EdmApplication = z.output +export type EdmDimension = z.output +export type EdmView = z.output +export type EdmViewpoint = z.output +export type EdmNode = z.output +export type EdmRequest = z.output +export type EdmJob = z.output +export type EdmJobResult = z.output +export interface EdmOperationContext { + client: OracleEpmClient + instanceUrl: string + signal?: AbortSignal + execution: InternalToolOperationContext +} +export interface EdmAsyncOutput { + jobId: string + job: EdmJob | null + completed: boolean + timedOut: boolean + result?: EdmJobResult + file?: UserFile + fileName?: string +} +export interface EdmHierarchyNode extends EdmNode { + depth: number + traversalPath: string[] + traversalParentLocation: string | null +} +export interface EdmHierarchyFrontier { + parentNodeId: string | null + parentLocation: string | null + path: string[] + depth: number + offset: number +} + +/** Fixed, product-authored failures; never construct these from provider or storage error text. */ +export class EdmOperationError extends Error { + constructor( + message: string, + readonly status = 400, + readonly output?: EdmAsyncOutput + ) { + super(message) + this.name = 'EdmOperationError' + } +} + +export function edmJsonData(response: OracleEpmClientResponse): unknown { + if (!('data' in response)) + throw new EdmOperationError('Oracle EDM returned an invalid JSON response', 502) + return response.data +} diff --git a/apps/sim/lib/internal/tool-operations/registry.server.ts b/apps/sim/lib/internal/tool-operations/registry.server.ts index 45bb6cb5cd4..f6dda4ca904 100644 --- a/apps/sim/lib/internal/tool-operations/registry.server.ts +++ b/apps/sim/lib/internal/tool-operations/registry.server.ts @@ -783,6 +783,39 @@ const NETSUITE_TOOL_IDS = [ ] as const const OKTA_TOOL_IDS = ['okta_update_group'] as const + +const ORACLE_EPM_EDM_TOOL_IDS = [ + 'oracle_epm_edm_list_applications', + 'oracle_epm_edm_list_dimensions', + 'oracle_epm_edm_list_views', + 'oracle_epm_edm_list_viewpoints', + 'oracle_epm_edm_list_node_types', + 'oracle_epm_edm_get_node_type', + 'oracle_epm_edm_list_nodes', + 'oracle_epm_edm_get_node', + 'oracle_epm_edm_get_node_at_location', + 'oracle_epm_edm_browse_hierarchy', + 'oracle_epm_edm_create_request', + 'oracle_epm_edm_get_request', + 'oracle_epm_edm_query_requests', + 'oracle_epm_edm_get_request_lineage', + 'oracle_epm_edm_assign_request', + 'oracle_epm_edm_delete_request', + 'oracle_epm_edm_upload_request_attachment', + 'oracle_epm_edm_generate_request_attachment', + 'oracle_epm_edm_import_request_attachment', + 'oracle_epm_edm_transition_request', + 'oracle_epm_edm_get_job_status', + 'oracle_epm_edm_get_job_result', + 'oracle_epm_edm_validate_viewpoint', + 'oracle_epm_edm_get_mapping_keys', + 'oracle_epm_edm_export_mappings', + 'oracle_epm_edm_import_dimension', + 'oracle_epm_edm_load_viewpoint', + 'oracle_epm_edm_export_dimension', + 'oracle_epm_edm_incremental_export_dimension', + 'oracle_epm_edm_extract_dimension_viewpoint', +] as const const SALESFORCE_TOOL_IDS = ['salesforce_update_custom_field'] as const const SLACK_TOOL_IDS = [ @@ -1431,6 +1464,10 @@ registerFamily(handlerLoaders, NETSUITE_TOOL_IDS, async () => { registerFamily(handlerLoaders, OKTA_TOOL_IDS, async () => { return (await import('@/lib/internal/okta/execute-tool')).executeOktaTool }) +registerFamily(handlerLoaders, ORACLE_EPM_EDM_TOOL_IDS, async () => { + return (await import('@/lib/internal/oracle-epm-enterprise-data-management/execute-tool')) + .executeOracleEpmEdmTool +}) registerFamily(handlerLoaders, SALESFORCE_TOOL_IDS, async () => { return (await import('@/lib/internal/salesforce/execute-tool')).executeSalesforceTool }) diff --git a/apps/sim/lib/oauth/oauth.ts b/apps/sim/lib/oauth/oauth.ts index 692a59510fe..0b7489f7261 100644 --- a/apps/sim/lib/oauth/oauth.ts +++ b/apps/sim/lib/oauth/oauth.ts @@ -1028,6 +1028,24 @@ export const OAUTH_PROVIDERS: Record = { }, defaultService: 'netsuite', }, + 'oracle-epm-enterprise-data-management': { + name: 'Oracle EPM Enterprise Data Management', + icon: NetSuiteIcon, + services: { + 'oracle-epm-enterprise-data-management': { + name: 'Oracle EPM Enterprise Data Management', + description: + 'Manage enterprise dimensions, viewpoints, nodes, requests, validation, and data transfers.', + providerId: 'oracle-epm-enterprise-data-management', + serviceAccountProviderId: 'oracle-epm-service-account', + icon: NetSuiteIcon, + baseProviderIcon: NetSuiteIcon, + scopes: [], + authType: 'service_account', + }, + }, + defaultService: 'oracle-epm-enterprise-data-management', + }, reddit: { name: 'Reddit', icon: RedditIcon, diff --git a/apps/sim/lib/oauth/types.ts b/apps/sim/lib/oauth/types.ts index d7b5b668f2a..34ca29cdbd7 100644 --- a/apps/sim/lib/oauth/types.ts +++ b/apps/sim/lib/oauth/types.ts @@ -93,6 +93,7 @@ export type OAuthProvider = | 'zoho-desk' export type OAuthService = + | 'oracle-epm-enterprise-data-management' | 'google' | 'google-email' | 'google-drive' diff --git a/apps/sim/lib/selectors/manifest.test.ts b/apps/sim/lib/selectors/manifest.test.ts index df9322d33e3..fd8e88a5d13 100644 --- a/apps/sim/lib/selectors/manifest.test.ts +++ b/apps/sim/lib/selectors/manifest.test.ts @@ -9,8 +9,8 @@ describe('selector manifest', () => { const count = (classification: (typeof classifications)[number]) => classifications.filter((value) => value === classification).length - expect(Object.keys(selectorManifest)).toHaveLength(94) - expect(count('provider-server')).toBe(82) + expect(Object.keys(selectorManifest)).toHaveLength(100) + expect(count('provider-server')).toBe(88) expect(count('internal-server')).toBe(11) expect(count('local')).toBe(1) expect(classifications).not.toContain('provider-legacy') @@ -36,7 +36,7 @@ describe('selector manifest', () => { const rawConnectionKeys = providerKeys.filter( (key) => !serverSelectorRegistry[key as keyof typeof serverSelectorRegistry].credential ) - expect(providerKeys).toHaveLength(82) + expect(providerKeys).toHaveLength(88) expect(rawConnectionKeys.sort()).toEqual([ 'cloudwatch.logGroups', 'cloudwatch.logStreams', @@ -98,7 +98,7 @@ describe('selector manifest', () => { (attachment) => attachment.destination !== 'fixed' ) - expect(preparedDestinations).toHaveLength(13) + expect(preparedDestinations).toHaveLength(19) for (const attachment of preparedDestinations) { expect(attachment.destination).toEqual( expect.objectContaining({ diff --git a/apps/sim/lib/selectors/manifest.ts b/apps/sim/lib/selectors/manifest.ts index 172fcfa0ac5..3559bcea085 100644 --- a/apps/sim/lib/selectors/manifest.ts +++ b/apps/sim/lib/selectors/manifest.ts @@ -188,6 +188,24 @@ export const selectorManifest = { detail: true, unknownDetail: true, }), + 'oracleEpmEdm.applications': providerSelector([], { search: true, detail: true }), + 'oracleEpmEdm.dimensions': providerSelector(['applicationId'], { + readiness: { all: ['oauthCredential', 'applicationId'] }, + search: true, + detail: true, + }), + 'oracleEpmEdm.views': providerSelector([], { search: true, detail: true }), + 'oracleEpmEdm.viewpoints': providerSelector(['viewId'], { + readiness: { all: ['oauthCredential', 'viewId'] }, + search: true, + detail: true, + }), + 'oracleEpmEdm.nodeTypes': providerSelector(['viewId', 'viewpointId'], { + readiness: { all: ['oauthCredential', 'viewId', 'viewpointId'] }, + search: true, + detail: true, + }), + 'oracleEpmEdm.requests': providerSelector([], { search: true, detail: true }), 'pipedrive.pipelines': providerSelector([], { detail: true }), 'sharepoint.lists': providerSelector(['siteId'], { readiness: { all: ['oauthCredential', 'siteId'] }, diff --git a/apps/sim/lib/selectors/server/providers/oracle-epm-enterprise-data-management.test.ts b/apps/sim/lib/selectors/server/providers/oracle-epm-enterprise-data-management.test.ts new file mode 100644 index 00000000000..d3004d7a104 --- /dev/null +++ b/apps/sim/lib/selectors/server/providers/oracle-epm-enterprise-data-management.test.ts @@ -0,0 +1,220 @@ +/** @vitest-environment node */ +import { beforeEach, describe, expect, it, vi } from 'vitest' + +const mocks = vi.hoisted(() => ({ bundle: vi.fn(), fetch: vi.fn(), dns: vi.fn() })) +vi.mock('@/lib/selectors/server/providers/credential-bundle', () => ({ + resolveSelectorCredentialBundle: mocks.bundle, +})) +vi.mock('@/lib/core/security/input-validation.server', () => ({ + DEFAULT_MAX_RESPONSE_BYTES: 100 * 1024 * 1024, + secureFetchWithPinnedIP: mocks.fetch, + validateUrlWithDNS: mocks.dns, +})) + +import { + buildSelectorContextFromValues, + getSelectorContextSubBlocks, +} from '@/lib/selectors/context' +import { + SelectorConnectionUnavailableError, + SelectorContextUnavailableError, + SelectorOptionsUnavailableError, +} from '@/lib/selectors/server/errors' +import { createSelectorProtectedValues } from '@/lib/selectors/server/protected-values' +import { oracleEpmEdmSelectorAttachments } from '@/lib/selectors/server/providers/oracle-epm-enterprise-data-management' +import type { ExecuteServerSelectorArgs } from '@/lib/selectors/server/types' +import { OracleEpmEnterpriseDataManagementBlock } from '@/blocks/blocks/oracle_epm_enterprise_data_management' + +const id = '11111111-1111-4111-8111-111111111111' +const other = '22222222-2222-4222-8222-222222222222' +type Key = keyof typeof oracleEpmEdmSelectorAttachments +function args(selectorKey: Key): ExecuteServerSelectorArgs { + return { + selectorKey, + context: {}, + request: { kind: 'list' }, + scope: { kind: 'workspace', workspaceId: id }, + workspaceId: id, + principal: { kind: 'session', userId: 'user', sessionId: 'session' }, + requesterUserId: 'user', + credential: { + suppliedId: 'credential', + providerId: 'oracle-epm-service-account', + access: { + ok: true, + credentialType: 'service_account', + resolvedCredentialId: 'credential', + credentialOwnerUserId: 'user', + }, + }, + protectedValues: createSelectorProtectedValues(), + references: new Map(), + } +} +describe('EDM credential-bound server selectors', () => { + beforeEach(() => { + vi.clearAllMocks() + mocks.bundle.mockResolvedValue({ + accessToken: 'dTpw', + instanceUrl: 'https://edm.example.com/gateway', + }) + mocks.dns.mockResolvedValue({ isValid: true, resolvedIP: '203.0.113.10' }) + }) + it('binds discovery to the authorized credential destination, not raw selector context', async () => { + mocks.fetch.mockResolvedValue(Response.json({ items: [{ id, name: 'Planning' }] })) + const input = args('oracleEpmEdm.applications') + input.context = { domain: 'other.example.com' } + const result = await oracleEpmEdmSelectorAttachments[input.selectorKey as Key].execute(input) + expect(result).toMatchObject({ kind: 'list', items: [{ id, label: 'Planning' }] }) + expect(new URL(mocks.fetch.mock.calls[0][0]).origin).toBe('https://edm.example.com') + expect(mocks.bundle).toHaveBeenCalledWith( + expect.objectContaining({ credential: input.credential }) + ) + }) + it.each([ + undefined, + { + suppliedId: 'credential', + providerId: 'netsuite-service-account', + access: { + ok: true, + credentialType: 'service_account' as const, + resolvedCredentialId: 'credential', + }, + }, + ])('rejects missing or wrong-provider credential authority', async (credential) => { + const input = { ...args('oracleEpmEdm.applications'), credential } + await expect( + oracleEpmEdmSelectorAttachments['oracleEpmEdm.applications'].execute(input) + ).rejects.toBeInstanceOf(SelectorConnectionUnavailableError) + expect(mocks.bundle).not.toHaveBeenCalled() + expect(mocks.fetch).not.toHaveBeenCalled() + }) + it.each([ + 'oracleEpmEdm.dimensions', + 'oracleEpmEdm.viewpoints', + 'oracleEpmEdm.nodeTypes', + ] as const)('requires active dependencies for %s before provider discovery', async (key) => { + await expect(oracleEpmEdmSelectorAttachments[key].execute(args(key))).rejects.toBeInstanceOf( + SelectorContextUnavailableError + ) + expect(mocks.fetch).not.toHaveBeenCalled() + }) + it('derives dimensions from the selected application', async () => { + mocks.fetch.mockResolvedValue( + Response.json({ + items: [{ id, name: 'Planning', dimensions: [{ id: other, name: 'Account' }] }], + }) + ) + const input = { ...args('oracleEpmEdm.dimensions'), context: { applicationId: id } } + expect( + await oracleEpmEdmSelectorAttachments['oracleEpmEdm.dimensions'].execute(input) + ).toMatchObject({ items: [{ id: other, label: 'Account' }] }) + expect(new URL(mocks.fetch.mock.calls[0][0]).searchParams.get('q')).toBe(`id::${id}`) + expect(mocks.fetch).toHaveBeenCalledTimes(1) + }) + it('derives node-type references from the selected viewpoint assignment', async () => { + mocks.fetch.mockResolvedValue( + Response.json({ + items: [ + { + id, + name: 'Accounts', + nodeTypeAssignments: [{ nodeTypeLink: { id: other, name: 'Account Type' } }], + }, + ], + }) + ) + const input = { ...args('oracleEpmEdm.nodeTypes'), context: { viewId: other, viewpointId: id } } + expect( + await oracleEpmEdmSelectorAttachments['oracleEpmEdm.nodeTypes'].execute(input) + ).toMatchObject({ items: [{ id: other, label: 'Account Type' }] }) + expect(new URL(mocks.fetch.mock.calls[0][0]).pathname).toBe( + `/gateway/epm/rest/v1/views/${other}/viewpoints` + ) + }) + it('uses a 30-day request window and safe request labels', async () => { + mocks.fetch.mockResolvedValue( + Response.json({ items: [{ id, title: 'Approval', requestNumber: 12, status: 'DRAFT' }] }) + ) + expect( + await oracleEpmEdmSelectorAttachments['oracleEpmEdm.requests'].execute( + args('oracleEpmEdm.requests') + ) + ).toMatchObject({ + items: [{ id, label: '12 — Approval', meta: { status: 'DRAFT', requestNumber: 12 } }], + }) + expect(new URL(mocks.fetch.mock.calls[0][0]).searchParams.get('lastDays')).toBe('30') + }) + it('keeps local search bounded and reports truncation rather than claiming provider search', async () => { + const items = Array.from({ length: 501 }, (_, n) => ({ + id: `${n.toString(16).padStart(8, '0')}-1111-4111-8111-111111111111`, + name: `Application ${n}`, + })) + mocks.fetch.mockResolvedValue(Response.json({ items })) + const input = { + ...args('oracleEpmEdm.applications'), + request: { kind: 'list' as const, search: 'Application 500' }, + } + expect( + await oracleEpmEdmSelectorAttachments['oracleEpmEdm.applications'].execute(input) + ).toMatchObject({ + items: [], + diagnostics: { truncated: { reason: 'provider-cap', limit: 500 } }, + }) + expect(new URL(mocks.fetch.mock.calls[0][0]).search).toBe('') + }) + it('resolves selected details only from the bounded discovered set', async () => { + mocks.fetch.mockResolvedValue(Response.json({ items: [{ id, name: 'Planning' }] })) + const input = { + ...args('oracleEpmEdm.applications'), + request: { kind: 'detail' as const, id: other }, + } + expect( + await oracleEpmEdmSelectorAttachments['oracleEpmEdm.applications'].execute(input) + ).toEqual({ kind: 'detail', item: null }) + }) + it.each([401, 403, 429, 500])( + 'returns safe selector errors for provider status %s', + async (status) => { + mocks.fetch.mockResolvedValue(new Response('provider-secret-canary', { status })) + const expected = + status === 401 || status === 403 + ? new SelectorConnectionUnavailableError(status) + : new SelectorOptionsUnavailableError(status === 429 ? 429 : 502) + await expect( + oracleEpmEdmSelectorAttachments['oracleEpmEdm.applications'].execute( + args('oracleEpmEdm.applications') + ) + ).rejects.toEqual(expected) + } + ) + it('uses active advanced canonical dependencies and excludes unrelated stale fields', () => { + const values = { + operation: 'oracle_epm_edm_list_node_types', + credential: 'stale-credential', + manualCredential: 'active-credential', + viewSelector: id, + viewManual: other, + viewpointSelector: id, + viewpointManual: other, + applicationManual: id, + } + const configs = getSelectorContextSubBlocks( + OracleEpmEnterpriseDataManagementBlock.subBlocks, + values + ) + const result = buildSelectorContextFromValues({ + selectorKey: 'oracleEpmEdm.nodeTypes', + contextConfigs: configs, + values, + dependsOn: ['credential', 'viewId', 'viewpointId'], + canonicalModes: { oauthCredential: 'advanced', viewId: 'advanced', viewpointId: 'advanced' }, + }) + expect(result).toEqual({ + oauthCredential: 'active-credential', + viewId: other, + viewpointId: other, + }) + }) +}) diff --git a/apps/sim/lib/selectors/server/providers/oracle-epm-enterprise-data-management.ts b/apps/sim/lib/selectors/server/providers/oracle-epm-enterprise-data-management.ts new file mode 100644 index 00000000000..440ee978a8c --- /dev/null +++ b/apps/sim/lib/selectors/server/providers/oracle-epm-enterprise-data-management.ts @@ -0,0 +1,220 @@ +import { ORACLE_EPM_SERVICE_ACCOUNT_PROVIDER_ID } from '@/lib/credentials/client-credential-accounts/descriptors' +import { + createOracleEpmClient, + normalizeOracleEpmDestination, + OracleEpmError, +} from '@/lib/internal/oracle-epm' +import { + listEdmApplications, + listEdmDimensions, + listEdmNodeTypes, + listEdmViewpoints, + listEdmViews, + queryEdmRequests, +} from '@/lib/internal/oracle-epm-enterprise-data-management/operations' +import { edmInputSchemas } from '@/lib/internal/oracle-epm-enterprise-data-management/schemas' +import type { EdmOperationContext } from '@/lib/internal/oracle-epm-enterprise-data-management/types' +import type { ServerSelectorKey } from '@/lib/selectors/manifest' +import { + SelectorConnectionUnavailableError, + SelectorContextUnavailableError, + SelectorOptionsUnavailableError, +} from '@/lib/selectors/server/errors' +import { resolveSelectorCredentialBundle } from '@/lib/selectors/server/providers/credential-bundle' +import { flatSelectorResult } from '@/lib/selectors/server/providers/flat-results' +import { + definePreparedSelectorAttachment, + type ExecuteServerSelectorArgs, + type ServerSelectorAttachmentMap, +} from '@/lib/selectors/server/types' +import type { SafeSelectorOption } from '@/lib/selectors/types' + +type EdmSelectorKey = Extract +interface PreparedEdmSelector { + auth: { oauthCredential: string; accessToken: string; instanceUrl: string } + context: EdmOperationContext +} +const MAX_OPTIONS = 500 + +async function prepareEdmSelector(args: ExecuteServerSelectorArgs): Promise { + const credential = args.credential + const access = credential?.access + if ( + !credential || + access?.credentialType !== 'service_account' || + !access.resolvedCredentialId || + credential.providerId !== ORACLE_EPM_SERVICE_ACCOUNT_PROVIDER_ID + ) { + throw new SelectorConnectionUnavailableError() + } + const token = await resolveSelectorCredentialBundle({ + credential, + protectedValues: args.protectedValues, + recordCredentialUse: args.recordCredentialUse, + providerId: ORACLE_EPM_SERVICE_ACCOUNT_PROVIDER_ID, + }) + if (!token.instanceUrl) throw new SelectorConnectionUnavailableError() + let instanceUrl: string + try { + instanceUrl = normalizeOracleEpmDestination(token.instanceUrl) + } catch { + throw new SelectorConnectionUnavailableError() + } + const auth = { + oauthCredential: access.resolvedCredentialId, + accessToken: token.accessToken, + instanceUrl, + } + return { + auth, + context: { + client: createOracleEpmClient(auth), + instanceUrl, + signal: args.signal, + execution: { + workflowId: args.scope.kind === 'workflow' ? args.scope.workflowId : '', + workspaceId: args.workspaceId, + userId: args.requesterUserId, + }, + }, + } +} + +/** Search here filters only the bounded discovery result; it is not Oracle node search. */ +async function discoverEdmSelector(args: ExecuteServerSelectorArgs, prepared: PreparedEdmSelector) { + args.signal?.throwIfAborted() + const { auth, context } = prepared + let options: SafeSelectorOption[] + let truncated: boolean + const base = { ...auth, maxResults: MAX_OPTIONS } + const project = (items: { id: string; name?: string | null; description?: string | null }[]) => + items.map((item) => ({ + id: item.id, + label: item.name || item.id, + ...(item.description ? { meta: { description: item.description } } : {}), + })) + switch (args.selectorKey as EdmSelectorKey) { + case 'oracleEpmEdm.applications': { + const input = edmInputSchemas.list_applications.parse({ + ...base, + operation: 'oracle_epm_edm_list_applications', + }) + const result = (await listEdmApplications(input, context)).applications + options = project(result.items) + truncated = result.truncated + break + } + case 'oracleEpmEdm.dimensions': { + const input = edmInputSchemas.list_dimensions.safeParse({ + ...base, + operation: 'oracle_epm_edm_list_dimensions', + applicationId: args.context.applicationId, + }) + if (!input.success) throw new SelectorContextUnavailableError() + const result = (await listEdmDimensions(input.data, context)).dimensions + options = project(result.items) + truncated = result.truncated + break + } + case 'oracleEpmEdm.views': { + const input = edmInputSchemas.list_views.parse({ + ...base, + operation: 'oracle_epm_edm_list_views', + }) + const result = (await listEdmViews(input, context)).views + options = project(result.items) + truncated = result.truncated + break + } + case 'oracleEpmEdm.viewpoints': { + const input = edmInputSchemas.list_viewpoints.safeParse({ + ...base, + operation: 'oracle_epm_edm_list_viewpoints', + viewId: args.context.viewId, + }) + if (!input.success) throw new SelectorContextUnavailableError() + const result = (await listEdmViewpoints(input.data, context)).viewpoints + options = project(result.items) + truncated = result.truncated + break + } + case 'oracleEpmEdm.nodeTypes': { + const input = edmInputSchemas.list_node_types.safeParse({ + ...base, + operation: 'oracle_epm_edm_list_node_types', + viewId: args.context.viewId, + viewpointId: args.context.viewpointId, + }) + if (!input.success) throw new SelectorContextUnavailableError() + const result = (await listEdmNodeTypes(input.data, context)).nodeTypes + options = project(result.items) + truncated = result.truncated + break + } + case 'oracleEpmEdm.requests': { + const input = edmInputSchemas.query_requests.parse({ + ...base, + operation: 'oracle_epm_edm_query_requests', + lastDays: 30, + }) + const result = (await queryEdmRequests(input, context)).requests + options = result.items.map((item) => ({ + id: item.id, + label: + [item.requestNumber, item.title] + .filter((value) => value !== null && value !== undefined && value !== '') + .join(' — ') || item.id, + meta: { status: item.status ?? null, requestNumber: item.requestNumber ?? null }, + })) + truncated = result.truncated + break + } + } + const unique = [...new Map(options.map((item) => [item.id, item])).values()] + const search = + args.request.kind === 'list' ? args.request.search?.trim().toLowerCase() : undefined + const filtered = search + ? unique.filter((item) => item.label.toLowerCase().includes(search)) + : unique + return flatSelectorResult( + args.request, + filtered, + true, + truncated ? { truncated: { reason: 'provider-cap', limit: MAX_OPTIONS } } : undefined + ) +} + +async function executeEdmSelector(args: ExecuteServerSelectorArgs, prepared: PreparedEdmSelector) { + try { + return await discoverEdmSelector(args, prepared) + } catch (error) { + args.signal?.throwIfAborted() + if (error instanceof SelectorContextUnavailableError) throw error + if (error instanceof OracleEpmError) { + if (error.status === 401 || error.status === 403) + throw new SelectorConnectionUnavailableError(error.status) + if (error.status === 429) throw new SelectorOptionsUnavailableError(429) + } + throw new SelectorOptionsUnavailableError() + } +} + +const attachment = { + credential: { + kind: 'stored', + field: 'oauthCredential', + serviceIds: ['oracle-epm-enterprise-data-management'], + }, + integrationBlockTypes: ['oracle_epm_enterprise_data_management'], + destination: { kind: 'credential-bound', prepare: prepareEdmSelector }, + execute: executeEdmSelector, +} as const + +export const oracleEpmEdmSelectorAttachments = { + 'oracleEpmEdm.applications': definePreparedSelectorAttachment(attachment), + 'oracleEpmEdm.dimensions': definePreparedSelectorAttachment(attachment), + 'oracleEpmEdm.views': definePreparedSelectorAttachment(attachment), + 'oracleEpmEdm.viewpoints': definePreparedSelectorAttachment(attachment), + 'oracleEpmEdm.nodeTypes': definePreparedSelectorAttachment(attachment), + 'oracleEpmEdm.requests': definePreparedSelectorAttachment(attachment), +} satisfies ServerSelectorAttachmentMap diff --git a/apps/sim/lib/selectors/server/registry.ts b/apps/sim/lib/selectors/server/registry.ts index ef9a815f1af..c6235d6c94c 100644 --- a/apps/sim/lib/selectors/server/registry.ts +++ b/apps/sim/lib/selectors/server/registry.ts @@ -21,6 +21,7 @@ import { microsoftSelectorAttachments } from '@/lib/selectors/server/providers/m import { mondaySelectorAttachments } from '@/lib/selectors/server/providers/monday' import { netsuiteSelectorAttachments } from '@/lib/selectors/server/providers/netsuite' import { notionSelectorAttachments } from '@/lib/selectors/server/providers/notion' +import { oracleEpmEdmSelectorAttachments } from '@/lib/selectors/server/providers/oracle-epm-enterprise-data-management' import { pipedriveSelectorAttachments } from '@/lib/selectors/server/providers/pipedrive' import { sharepointSelectorAttachments } from '@/lib/selectors/server/providers/sharepoint' import { slackSelectorAttachments } from '@/lib/selectors/server/providers/slack' @@ -55,6 +56,7 @@ export const serverSelectorRegistry = { ...mondaySelectorAttachments, ...netsuiteSelectorAttachments, ...notionSelectorAttachments, + ...oracleEpmEdmSelectorAttachments, ...pipedriveSelectorAttachments, ...sharepointSelectorAttachments, ...slackSelectorAttachments, diff --git a/apps/sim/lib/selectors/types.ts b/apps/sim/lib/selectors/types.ts index ad644b8946b..d44adfddef6 100644 --- a/apps/sim/lib/selectors/types.ts +++ b/apps/sim/lib/selectors/types.ts @@ -2,6 +2,10 @@ import type { ComponentType } from 'react' export const selectorContextKeys = [ 'oauthCredential', + 'applicationId', + 'dimensionId', + 'viewId', + 'viewpointId', 'domain', 'teamId', 'projectId', diff --git a/apps/sim/tools/generated/tool-ids.ts b/apps/sim/tools/generated/tool-ids.ts index 6d97df92a01..e4d3c84eedd 100644 --- a/apps/sim/tools/generated/tool-ids.ts +++ b/apps/sim/tools/generated/tool-ids.ts @@ -3,7 +3,7 @@ /** Every registered tool id, including versioned variants. */ const toolIds: string[] = JSON.parse( - '["a2a_cancel_task","a2a_get_agent_card","a2a_get_task","a2a_send_message","affinity_batch_update_entity_fields","affinity_batch_update_list_entry_fields","affinity_create_list","affinity_create_list_field_dropdown_option","affinity_create_merge","affinity_create_note","affinity_create_reminder","affinity_delete_list_field_dropdown_option","affinity_delete_note","affinity_get_company","affinity_get_current_user","affinity_get_entity_field_value","affinity_get_list","affinity_get_list_entry","affinity_get_list_entry_field","affinity_get_list_field_dropdown_option","affinity_get_merge","affinity_get_merge_task","affinity_get_note","affinity_get_opportunity","affinity_get_person","affinity_get_saved_view","affinity_get_transcript","affinity_get_user","affinity_list_calls","affinity_list_chat_messages","affinity_list_companies","affinity_list_coworker_connections","affinity_list_emails","affinity_list_entity_field_values","affinity_list_entity_list_entries","affinity_list_entity_lists","affinity_list_entity_notes","affinity_list_entity_relationships","affinity_list_field_dropdown_options","affinity_list_field_metadata","affinity_list_field_value_changes","affinity_list_investor_executive_connections","affinity_list_list_entries","affinity_list_list_entry_field_value_changes","affinity_list_list_entry_fields","affinity_list_list_field_dropdown_options","affinity_list_list_fields","affinity_list_lists","affinity_list_meetings","affinity_list_merge_tasks","affinity_list_merges","affinity_list_note_attached_companies","affinity_list_note_attached_opportunities","affinity_list_note_attached_persons","affinity_list_note_replies","affinity_list_notes","affinity_list_opportunities","affinity_list_persons","affinity_list_reminders","affinity_list_saved_view_entries","affinity_list_saved_views","affinity_list_transcript_fragments","affinity_list_transcripts","affinity_list_users","affinity_search_companies","affinity_search_files","affinity_search_list_entries","affinity_search_notes","affinity_search_persons","affinity_semantic_search","affinity_update_entity_field_value","affinity_update_list_entry_field","affinity_update_list_field_dropdown_option","affinity_update_note","agentmail_create_draft","agentmail_create_inbox","agentmail_delete_draft","agentmail_delete_inbox","agentmail_delete_thread","agentmail_forward_message","agentmail_get_draft","agentmail_get_inbox","agentmail_get_message","agentmail_get_thread","agentmail_list_drafts","agentmail_list_inboxes","agentmail_list_messages","agentmail_list_threads","agentmail_reply_message","agentmail_send_draft","agentmail_send_message","agentmail_update_draft","agentmail_update_inbox","agentmail_update_message","agentmail_update_thread","agentphone_create_call","agentphone_create_contact","agentphone_create_number","agentphone_delete_contact","agentphone_get_call","agentphone_get_call_transcript","agentphone_get_contact","agentphone_get_conversation","agentphone_get_conversation_messages","agentphone_get_number_messages","agentphone_get_usage","agentphone_get_usage_daily","agentphone_get_usage_monthly","agentphone_list_calls","agentphone_list_contacts","agentphone_list_conversations","agentphone_list_numbers","agentphone_react_to_message","agentphone_release_number","agentphone_send_message","agentphone_update_contact","agentphone_update_conversation","agiloft_async_status","agiloft_attach_file","agiloft_attachment_info","agiloft_create_record","agiloft_delete_record","agiloft_get_choice_line_id","agiloft_list_tables","agiloft_lock_record","agiloft_nlp_search","agiloft_read_record","agiloft_remove_attachment","agiloft_retrieve_attachment","agiloft_run_action_button","agiloft_saved_search","agiloft_search_records","agiloft_select_records","agiloft_update_record","agiloft_upsert_record","ahrefs_anchors","ahrefs_backlinks","ahrefs_backlinks_stats","ahrefs_batch_analysis","ahrefs_broken_backlinks","ahrefs_domain_rating","ahrefs_domain_rating_history","ahrefs_keyword_overview","ahrefs_keywords_history","ahrefs_metrics","ahrefs_metrics_history","ahrefs_organic_competitors","ahrefs_organic_keywords","ahrefs_paid_pages","ahrefs_rank_tracker_competitors_overview","ahrefs_rank_tracker_competitors_stats","ahrefs_rank_tracker_overview","ahrefs_rank_tracker_serp_overview","ahrefs_refdomains_history","ahrefs_referring_domains","ahrefs_related_terms","ahrefs_site_audit_page_explorer","ahrefs_top_pages","airtable_create_records","airtable_delete_records","airtable_get_base_schema","airtable_get_record","airtable_list_bases","airtable_list_records","airtable_list_tables","airtable_update_multiple_records","airtable_update_record","airtable_upsert_records","airweave_search","algolia_add_record","algolia_batch_operations","algolia_browse_records","algolia_clear_records","algolia_copy_move_index","algolia_delete_by_filter","algolia_delete_index","algolia_delete_record","algolia_get_record","algolia_get_records","algolia_get_settings","algolia_get_task_status","algolia_list_indices","algolia_partial_update_record","algolia_search","algolia_update_settings","amplitude_event_segmentation","amplitude_funnels","amplitude_get_active_users","amplitude_get_revenue","amplitude_group_identify","amplitude_identify_user","amplitude_list_events","amplitude_realtime_active_users","amplitude_retention","amplitude_send_event","amplitude_user_activity","amplitude_user_profile","amplitude_user_search","apify_get_dataset_items","apify_get_run","apify_run_actor_async","apify_run_actor_sync","apify_run_task","apollo_account_bulk_create","apollo_account_bulk_update","apollo_account_create","apollo_account_search","apollo_account_update","apollo_contact_bulk_create","apollo_contact_bulk_update","apollo_contact_create","apollo_contact_search","apollo_contact_update","apollo_email_accounts","apollo_opportunity_create","apollo_opportunity_get","apollo_opportunity_search","apollo_opportunity_update","apollo_organization_bulk_enrich","apollo_organization_enrich","apollo_organization_search","apollo_people_bulk_enrich","apollo_people_enrich","apollo_people_search","apollo_sequence_add_contacts","apollo_sequence_search","apollo_task_create","apollo_task_search","appconfig_create_application","appconfig_create_configuration_profile","appconfig_create_environment","appconfig_create_hosted_configuration_version","appconfig_delete_application","appconfig_delete_configuration_profile","appconfig_delete_environment","appconfig_delete_hosted_configuration_version","appconfig_get_application","appconfig_get_configuration","appconfig_get_configuration_profile","appconfig_get_deployment","appconfig_get_environment","appconfig_get_hosted_configuration_version","appconfig_list_applications","appconfig_list_configuration_profiles","appconfig_list_deployment_strategies","appconfig_list_deployments","appconfig_list_environments","appconfig_list_hosted_configuration_versions","appconfig_start_deployment","appconfig_stop_deployment","appconfig_update_application","appconfig_update_configuration_profile","appconfig_update_environment","arxiv_get_author_papers","arxiv_get_paper","arxiv_search","asana_add_comment","asana_add_followers","asana_create_project","asana_create_section","asana_create_subtask","asana_create_task","asana_delete_task","asana_get_project","asana_get_projects","asana_get_task","asana_list_sections","asana_list_workspaces","asana_search_tasks","asana_update_task","ashby_add_candidate_tag","ashby_anonymize_candidate","ashby_change_application_source","ashby_change_application_stage","ashby_create_application","ashby_create_candidate","ashby_create_note","ashby_delete_application","ashby_get_application","ashby_get_candidate","ashby_get_job","ashby_get_job_posting","ashby_get_offer","ashby_get_opening","ashby_list_application_feedback","ashby_list_application_history","ashby_list_applications","ashby_list_archive_reasons","ashby_list_candidate_tags","ashby_list_candidates","ashby_list_custom_fields","ashby_list_departments","ashby_list_interview_plans","ashby_list_interview_stages","ashby_list_interviews","ashby_list_job_postings","ashby_list_jobs","ashby_list_locations","ashby_list_notes","ashby_list_offers","ashby_list_openings","ashby_list_sources","ashby_list_users","ashby_remove_candidate_tag","ashby_search_candidates","ashby_search_jobs","ashby_search_openings","ashby_search_users","ashby_set_custom_field_value","ashby_set_custom_field_values","ashby_transfer_application","ashby_update_candidate","ashby_upload_candidate_file","ashby_upload_resume","athena_batch_get_query_execution","athena_create_named_query","athena_delete_named_query","athena_get_named_query","athena_get_query_execution","athena_get_query_results","athena_list_databases","athena_list_named_queries","athena_list_query_executions","athena_list_table_metadata","athena_start_query","athena_stop_query","attio_assert_record","attio_create_attribute","attio_create_comment","attio_create_list","attio_create_list_entry","attio_create_note","attio_create_object","attio_create_record","attio_create_task","attio_create_webhook","attio_delete_comment","attio_delete_list_entry","attio_delete_note","attio_delete_record","attio_delete_task","attio_delete_webhook","attio_get_attribute","attio_get_comment","attio_get_list","attio_get_list_entry","attio_get_member","attio_get_note","attio_get_object","attio_get_record","attio_get_task","attio_get_thread","attio_get_webhook","attio_list_attributes","attio_list_lists","attio_list_members","attio_list_notes","attio_list_objects","attio_list_records","attio_list_tasks","attio_list_threads","attio_list_webhooks","attio_query_list_entries","attio_search_records","attio_update_attribute","attio_update_list","attio_update_list_entry","attio_update_object","attio_update_record","attio_update_task","attio_update_webhook","azure_data_explorer_create_table","azure_data_explorer_drop_table","azure_data_explorer_ingest_from_query","azure_data_explorer_ingest_inline","azure_data_explorer_list_databases","azure_data_explorer_list_functions","azure_data_explorer_list_tables","azure_data_explorer_management","azure_data_explorer_query","azure_data_explorer_show_database_schema","azure_data_explorer_show_ingestion_failures","azure_data_explorer_show_operations","azure_data_explorer_show_table_details","azure_data_explorer_show_table_schema","azure_devops_add_comment","azure_devops_create_work_item","azure_devops_get_build_log","azure_devops_get_build_timeline","azure_devops_get_comments","azure_devops_get_pipeline","azure_devops_get_pipeline_run","azure_devops_get_work_item","azure_devops_get_work_items_batch","azure_devops_get_work_items_between_builds","azure_devops_list_build_logs","azure_devops_list_builds","azure_devops_list_pipeline_runs","azure_devops_list_pipelines","azure_devops_query_work_items","azure_devops_update_work_item","bitbucket_approve_pull_request","bitbucket_create_branch","bitbucket_create_pull_request","bitbucket_create_pull_request_comment","bitbucket_decline_pull_request","bitbucket_delete_branch","bitbucket_get_commit","bitbucket_get_file","bitbucket_get_file_metadata","bitbucket_get_pipeline","bitbucket_get_pipeline_step_log","bitbucket_get_pull_request","bitbucket_get_pull_request_diff","bitbucket_get_pull_request_diffstat","bitbucket_get_pull_request_merge_task_status","bitbucket_get_repository","bitbucket_list_branches","bitbucket_list_commits","bitbucket_list_directory","bitbucket_list_pipeline_steps","bitbucket_list_pipelines","bitbucket_list_pull_request_comments","bitbucket_list_pull_request_commit_statuses","bitbucket_list_pull_requests","bitbucket_list_repositories","bitbucket_list_workspaces","bitbucket_merge_pull_request","bitbucket_request_pull_request_changes","bitbucket_stop_pipeline","bitbucket_trigger_pipeline","box_copy_file","box_create_folder","box_delete_file","box_delete_folder","box_download_file","box_get_file_info","box_list_folder_items","box_search","box_sign_cancel_request","box_sign_create_request","box_sign_get_request","box_sign_list_requests","box_sign_resend_request","box_update_file","box_upload_file","brandfetch_get_brand","brandfetch_search","brex_archive_budget","brex_create_budget","brex_create_spend_limit","brex_create_transfer","brex_create_vendor","brex_get_budget","brex_get_cash_account","brex_get_company","brex_get_current_user","brex_get_expense","brex_get_spend_limit","brex_get_transfer","brex_get_user","brex_get_vendor","brex_list_budgets","brex_list_card_accounts","brex_list_card_statements","brex_list_card_transactions","brex_list_cards","brex_list_cash_accounts","brex_list_cash_statements","brex_list_cash_transactions","brex_list_departments","brex_list_expenses","brex_list_locations","brex_list_spend_limits","brex_list_titles","brex_list_transfers","brex_list_users","brex_list_vendors","brex_match_receipt","brex_update_expense","brex_update_vendor","brex_upload_receipt","brightdata_cancel_snapshot","brightdata_discover","brightdata_download_snapshot","brightdata_scrape_dataset","brightdata_scrape_url","brightdata_serp_search","brightdata_snapshot_status","brightdata_sync_scrape","browser_use_run_task","buffer_create_idea","buffer_create_post","buffer_delete_post","buffer_edit_post","buffer_get_account","buffer_get_channels","buffer_get_idea_groups","buffer_get_ideas","buffer_get_post","buffer_get_posts","calcom_cancel_booking","calcom_confirm_booking","calcom_create_booking","calcom_create_event_type","calcom_create_schedule","calcom_decline_booking","calcom_delete_event_type","calcom_delete_schedule","calcom_get_booking","calcom_get_default_schedule","calcom_get_event_type","calcom_get_schedule","calcom_get_slots","calcom_list_bookings","calcom_list_event_types","calcom_list_schedules","calcom_reschedule_booking","calcom_update_event_type","calcom_update_schedule","calendly_cancel_event","calendly_create_event_invitee","calendly_create_invitee_no_show","calendly_create_scheduling_link","calendly_create_webhook","calendly_delete_invitee_no_show","calendly_delete_webhook","calendly_get_current_user","calendly_get_event_invitee","calendly_get_event_type","calendly_get_scheduled_event","calendly_get_user","calendly_list_event_invitees","calendly_list_event_type_available_times","calendly_list_event_types","calendly_list_organization_memberships","calendly_list_routing_form_submissions","calendly_list_routing_forms","calendly_list_scheduled_events","calendly_list_user_availability_schedules","calendly_list_user_busy_times","calendly_list_webhooks","cbinsights_chat","cbinsights_get_commercial_maturity_history","cbinsights_get_exit_probability_history","cbinsights_get_mosaic_history","cbinsights_get_org_business_relationships","cbinsights_get_org_funding_window","cbinsights_get_org_fundings","cbinsights_get_org_investments","cbinsights_get_org_management_and_board","cbinsights_get_org_outlook","cbinsights_get_org_portfolio_exits","cbinsights_get_org_revenue","cbinsights_get_scouting_report","cbinsights_get_strategy_map","cbinsights_list_business_relationships","cbinsights_list_funding_window","cbinsights_list_fundings","cbinsights_list_investments","cbinsights_list_management_and_board","cbinsights_list_outlook","cbinsights_list_portfolio_exits","cbinsights_list_revenue","cbinsights_lookup_organizations","cbinsights_rag","cbinsights_search_firmographics","circleback_add_tag_to_meetings","circleback_create_tag","circleback_delete_action_item","circleback_delete_meeting","circleback_delete_tag","circleback_get_company","circleback_get_meeting","circleback_get_person","circleback_get_transcript","circleback_list_action_items","circleback_list_calendar_events","circleback_list_companies","circleback_list_meetings","circleback_list_people","circleback_list_tags","circleback_remove_tag_from_meetings","circleback_search_meetings","circleback_update_action_item","circleback_update_meeting","circleback_update_tag","clay_populate","clerk_add_organization_member","clerk_ban_user","clerk_create_actor_token","clerk_create_allowlist_identifier","clerk_create_blocklist_identifier","clerk_create_organization","clerk_create_organization_invitation","clerk_create_user","clerk_delete_allowlist_identifier","clerk_delete_blocklist_identifier","clerk_delete_organization","clerk_delete_user","clerk_get_jwt_template","clerk_get_organization","clerk_get_session","clerk_get_user","clerk_get_user_oauth_token","clerk_list_allowlist_identifiers","clerk_list_blocklist_identifiers","clerk_list_jwt_templates","clerk_list_organization_invitations","clerk_list_organization_memberships","clerk_list_organizations","clerk_list_sessions","clerk_list_users","clerk_lock_user","clerk_remove_organization_member","clerk_revoke_actor_token","clerk_revoke_session","clerk_unban_user","clerk_unlock_user","clerk_update_organization","clerk_update_organization_membership","clerk_update_user","clickhouse_count_rows","clickhouse_create_database","clickhouse_create_table","clickhouse_delete","clickhouse_describe_table","clickhouse_drop_database","clickhouse_drop_partition","clickhouse_drop_table","clickhouse_execute","clickhouse_insert","clickhouse_insert_rows","clickhouse_introspect","clickhouse_kill_query","clickhouse_list_clusters","clickhouse_list_databases","clickhouse_list_mutations","clickhouse_list_partitions","clickhouse_list_running_queries","clickhouse_list_tables","clickhouse_optimize_table","clickhouse_query","clickhouse_rename_table","clickhouse_show_create_table","clickhouse_table_stats","clickhouse_truncate_table","clickhouse_update","clickup_add_tag_to_task","clickup_create_checklist","clickup_create_checklist_item","clickup_create_comment","clickup_create_folder","clickup_create_list","clickup_create_task","clickup_create_time_entry","clickup_delete_checklist","clickup_delete_checklist_item","clickup_delete_comment","clickup_delete_task","clickup_delete_time_entry","clickup_get_comments","clickup_get_custom_fields","clickup_get_folders","clickup_get_list_members","clickup_get_lists","clickup_get_running_timer","clickup_get_space_tags","clickup_get_spaces","clickup_get_task","clickup_get_task_members","clickup_get_tasks","clickup_get_time_entries","clickup_get_workspaces","clickup_remove_custom_field_value","clickup_remove_tag_from_task","clickup_search_tasks","clickup_set_custom_field_value","clickup_start_timer","clickup_stop_timer","clickup_update_checklist","clickup_update_checklist_item","clickup_update_comment","clickup_update_task","clickup_update_time_entry","clickup_upload_attachment","cloudflare_create_access_application","cloudflare_create_access_policy","cloudflare_create_access_service_token","cloudflare_create_dns_record","cloudflare_create_r2_bucket","cloudflare_create_rate_limit_rule","cloudflare_create_ruleset","cloudflare_create_ruleset_rule","cloudflare_create_zone","cloudflare_delete_access_application","cloudflare_delete_access_policy","cloudflare_delete_dns_record","cloudflare_delete_r2_bucket","cloudflare_delete_ruleset_rule","cloudflare_delete_zone","cloudflare_dns_analytics","cloudflare_get_access_application","cloudflare_get_r2_bucket","cloudflare_get_ruleset","cloudflare_get_ruleset_entrypoint","cloudflare_get_tunnel","cloudflare_get_tunnel_configuration","cloudflare_get_worker_script_settings","cloudflare_get_zone","cloudflare_get_zone_settings","cloudflare_list_access_applications","cloudflare_list_access_groups","cloudflare_list_access_identity_providers","cloudflare_list_access_policies","cloudflare_list_access_service_tokens","cloudflare_list_certificates","cloudflare_list_dns_records","cloudflare_list_managed_ruleset_overrides","cloudflare_list_r2_buckets","cloudflare_list_rate_limit_rules","cloudflare_list_rulesets","cloudflare_list_tunnels","cloudflare_list_worker_routes","cloudflare_list_worker_scripts","cloudflare_list_zones","cloudflare_purge_cache","cloudflare_revoke_access_service_token","cloudflare_update_access_application","cloudflare_update_access_policy","cloudflare_update_dns_record","cloudflare_update_rate_limit_rule","cloudflare_update_ruleset_rule","cloudflare_update_zone_setting","cloudformation_cancel_update_stack","cloudformation_create_change_set","cloudformation_create_stack","cloudformation_delete_stack","cloudformation_describe_change_set","cloudformation_describe_stack_drift_detection_status","cloudformation_describe_stack_events","cloudformation_describe_stacks","cloudformation_detect_stack_drift","cloudformation_execute_change_set","cloudformation_get_template","cloudformation_get_template_summary","cloudformation_list_stack_resources","cloudformation_update_stack","cloudformation_validate_template","cloudwatch_describe_alarm_history","cloudwatch_describe_alarms","cloudwatch_describe_log_groups","cloudwatch_describe_log_streams","cloudwatch_filter_log_events","cloudwatch_get_log_events","cloudwatch_get_metric_statistics","cloudwatch_list_metrics","cloudwatch_mute_alarm","cloudwatch_put_log_group_retention","cloudwatch_put_metric_data","cloudwatch_query_logs","cloudwatch_unmute_alarm","codepipeline_disable_stage_transition","codepipeline_enable_stage_transition","codepipeline_get_pipeline","codepipeline_get_pipeline_execution","codepipeline_get_pipeline_state","codepipeline_list_action_executions","codepipeline_list_pipeline_executions","codepipeline_list_pipelines","codepipeline_put_approval_result","codepipeline_retry_stage_execution","codepipeline_start_execution","codepipeline_stop_execution","confluence_add_label","confluence_create_blogpost","confluence_create_comment","confluence_create_page","confluence_create_page_property","confluence_create_space","confluence_create_space_property","confluence_delete_attachment","confluence_delete_blogpost","confluence_delete_comment","confluence_delete_label","confluence_delete_page","confluence_delete_page_property","confluence_delete_space","confluence_delete_space_property","confluence_get_blogpost","confluence_get_page_ancestors","confluence_get_page_children","confluence_get_page_descendants","confluence_get_page_version","confluence_get_pages_by_label","confluence_get_space","confluence_get_task","confluence_get_user","confluence_list_attachments","confluence_list_blogposts","confluence_list_blogposts_in_space","confluence_list_comments","confluence_list_labels","confluence_list_page_properties","confluence_list_page_versions","confluence_list_pages_in_space","confluence_list_space_labels","confluence_list_space_permissions","confluence_list_space_properties","confluence_list_spaces","confluence_list_tasks","confluence_retrieve","confluence_search","confluence_search_in_space","confluence_update","confluence_update_blogpost","confluence_update_comment","confluence_update_space","confluence_update_task","confluence_upload_attachment","context_dev_classify_naics","context_dev_classify_sic","context_dev_crawl","context_dev_extract","context_dev_extract_product","context_dev_extract_products","context_dev_get_brand","context_dev_get_brand_by_email","context_dev_get_brand_by_name","context_dev_get_brand_by_ticker","context_dev_identify_transaction","context_dev_map","context_dev_scrape_fonts","context_dev_scrape_html","context_dev_scrape_images","context_dev_scrape_markdown","context_dev_scrape_styleguide","context_dev_screenshot","context_dev_search","convex_action","convex_document_deltas","convex_list_documents","convex_list_tables","convex_mutation","convex_query","convex_run_function","crowdstrike_create_indicators","crowdstrike_delete_indicators","crowdstrike_delete_rtr_session","crowdstrike_execute_rtr_command","crowdstrike_get_alert_details","crowdstrike_get_case_details","crowdstrike_get_host_group_details","crowdstrike_get_indicator_details","crowdstrike_get_rtr_command_status","crowdstrike_get_sensor_aggregates","crowdstrike_get_sensor_details","crowdstrike_get_vulnerability_details","crowdstrike_init_rtr_session","crowdstrike_perform_host_action","crowdstrike_perform_host_group_action","crowdstrike_query_alerts","crowdstrike_query_cases","crowdstrike_query_host_groups","crowdstrike_query_indicators","crowdstrike_query_sensors","crowdstrike_query_vulnerabilities","crowdstrike_update_alerts","crowdstrike_update_indicators","crunchbase_autocomplete","crunchbase_get_acquisition","crunchbase_get_entity","crunchbase_get_entity_card","crunchbase_get_fields_metadata","crunchbase_get_funding_round","crunchbase_get_organization","crunchbase_get_person","crunchbase_list_deleted_entities","crunchbase_search_acquisitions","crunchbase_search_entities","crunchbase_search_funding_rounds","crunchbase_search_organizations","crunchbase_search_people","cursor_add_followup","cursor_add_followup_v2","cursor_delete_agent","cursor_delete_agent_v2","cursor_download_artifact","cursor_download_artifact_v2","cursor_get_agent","cursor_get_agent_v2","cursor_get_api_key_info","cursor_get_api_key_info_v2","cursor_get_conversation","cursor_get_conversation_v2","cursor_launch_agent","cursor_launch_agent_v2","cursor_list_agents","cursor_list_agents_v2","cursor_list_artifacts","cursor_list_artifacts_v2","cursor_list_models","cursor_list_models_v2","cursor_list_repositories","cursor_list_repositories_v2","cursor_stop_agent","cursor_stop_agent_v2","dagster_delete_run","dagster_get_asset","dagster_get_run","dagster_get_run_logs","dagster_launch_run","dagster_list_assets","dagster_list_jobs","dagster_list_runs","dagster_list_schedules","dagster_list_sensors","dagster_materialize_assets","dagster_reexecute_run","dagster_report_asset_materialization","dagster_start_schedule","dagster_start_sensor","dagster_stop_schedule","dagster_stop_sensor","dagster_terminate_run","dagster_wipe_asset","databricks_cancel_run","databricks_execute_sql","databricks_get_cluster","databricks_get_job","databricks_get_run","databricks_get_run_output","databricks_get_statement","databricks_list_clusters","databricks_list_jobs","databricks_list_runs","databricks_list_warehouses","databricks_run_job","datadog_add_incident_todo","datadog_cancel_downtime","datadog_create_dashboard","datadog_create_downtime","datadog_create_event","datadog_create_incident","datadog_create_monitor","datadog_create_slo","datadog_delete_dashboard","datadog_delete_slo","datadog_get_browser_synthetics_results","datadog_get_dashboard","datadog_get_incident","datadog_get_monitor","datadog_get_security_signal","datadog_get_slo","datadog_get_slo_history","datadog_get_synthetics_results","datadog_get_synthetics_test","datadog_list_dashboards","datadog_list_downtimes","datadog_list_incidents","datadog_list_monitors","datadog_list_security_rules","datadog_list_security_signals","datadog_list_services","datadog_list_slos","datadog_list_synthetics_tests","datadog_mute_monitor","datadog_query_logs","datadog_query_timeseries","datadog_search_spans","datadog_send_logs","datadog_submit_metrics","datadog_trigger_synthetics_tests","datadog_unmute_monitor","datadog_update_incident","datadog_update_security_signal_assignee","datadog_update_security_signal_state","datadog_update_slo","datadog_update_synthetics_status","datagma_enrich_company","datagma_enrich_person","datagma_find_email","datagma_find_phone","datagma_get_credits","daytona_create_sandbox","daytona_delete_sandbox","daytona_download_file","daytona_execute_command","daytona_get_sandbox","daytona_git_clone","daytona_list_files","daytona_list_sandboxes","daytona_run_code","daytona_start_sandbox","daytona_stop_sandbox","daytona_upload_file","deployed_block_executor","deployments_deploy","deployments_get_version","deployments_list_versions","deployments_promote","deployments_undeploy","devin_append_session_tags","devin_archive_session","devin_create_session","devin_get_session","devin_get_session_tags","devin_list_session_attachments","devin_list_session_messages","devin_list_sessions","devin_replace_session_tags","devin_send_message","devin_terminate_session","discord_add_reaction","discord_archive_thread","discord_assign_role","discord_ban_member","discord_bulk_delete_messages","discord_create_channel","discord_create_invite","discord_create_role","discord_create_thread","discord_create_webhook","discord_delete_channel","discord_delete_invite","discord_delete_message","discord_delete_role","discord_delete_webhook","discord_edit_message","discord_execute_webhook","discord_get_channel","discord_get_invite","discord_get_member","discord_get_messages","discord_get_pinned_messages","discord_get_server","discord_get_user","discord_get_webhook","discord_join_thread","discord_kick_member","discord_leave_thread","discord_list_channels","discord_list_roles","discord_pin_message","discord_remove_reaction","discord_remove_role","discord_send_message","discord_unban_member","discord_unpin_message","discord_update_channel","discord_update_member","discord_update_role","docusign_create_from_template","docusign_download_document","docusign_get_envelope","docusign_list_envelopes","docusign_list_recipients","docusign_list_templates","docusign_send_envelope","docusign_void_envelope","downdetector_get_company","downdetector_get_company_attribution","downdetector_get_company_baseline","downdetector_get_company_events","downdetector_get_company_incidents","downdetector_get_company_indicators","downdetector_get_company_last_15","downdetector_get_company_status","downdetector_get_provider","downdetector_get_reports","downdetector_get_site_companies","downdetector_list_categories","downdetector_list_incidents","downdetector_list_sites","downdetector_search_companies","dropbox_copy","dropbox_create_folder","dropbox_create_shared_link","dropbox_delete","dropbox_download","dropbox_get_metadata","dropbox_list_folder","dropbox_list_revisions","dropbox_list_shared_links","dropbox_move","dropbox_restore","dropbox_search","dropbox_upload","dropcontact_enrich_contact","dspy_chain_of_thought","dspy_predict","dspy_react","dub_bulk_create_links","dub_bulk_delete_links","dub_bulk_update_links","dub_create_link","dub_create_tag","dub_delete_link","dub_get_analytics","dub_get_events","dub_get_link","dub_get_links_count","dub_get_qr_code","dub_list_domains","dub_list_folders","dub_list_links","dub_list_tags","dub_update_link","dub_upsert_link","duckduckgo_search","dynamodb_delete","dynamodb_get","dynamodb_introspect","dynamodb_put","dynamodb_query","dynamodb_scan","dynamodb_update","dynatrace_add_problem_comment","dynatrace_add_tags","dynatrace_close_problem","dynatrace_create_settings_object","dynatrace_create_slo","dynatrace_delete_problem_comment","dynatrace_delete_settings_object","dynatrace_delete_slo","dynatrace_delete_tag","dynatrace_execute_synthetic_monitors","dynatrace_get_attack","dynatrace_get_audit_logs","dynatrace_get_entity","dynatrace_get_event","dynatrace_get_metric","dynatrace_get_problem","dynatrace_get_problem_comment","dynatrace_get_security_problem","dynatrace_get_settings_object","dynatrace_get_slo","dynatrace_get_synthetic_batch","dynatrace_ingest_event","dynatrace_ingest_logs","dynatrace_ingest_metrics","dynatrace_list_attacks","dynatrace_list_entities","dynatrace_list_entity_types","dynatrace_list_events","dynatrace_list_metrics","dynatrace_list_problem_comments","dynatrace_list_problems","dynatrace_list_remediation_items","dynatrace_list_security_problems","dynatrace_list_settings_objects","dynatrace_list_settings_schemas","dynatrace_list_slos","dynatrace_list_synthetic_monitors","dynatrace_list_tags","dynatrace_mute_security_problem","dynatrace_mute_security_problems","dynatrace_query_metrics","dynatrace_search_logs","dynatrace_unmute_security_problem","dynatrace_unmute_security_problems","dynatrace_update_problem_comment","dynatrace_update_settings_object","dynatrace_update_slo","elasticsearch_bulk","elasticsearch_cluster_health","elasticsearch_cluster_stats","elasticsearch_count","elasticsearch_create_index","elasticsearch_delete_document","elasticsearch_delete_index","elasticsearch_get_document","elasticsearch_get_index","elasticsearch_index_document","elasticsearch_list_indices","elasticsearch_search","elasticsearch_update_document","elevenlabs_audio_isolation","elevenlabs_edit_voice_settings","elevenlabs_get_user","elevenlabs_get_voice","elevenlabs_get_voice_settings","elevenlabs_list_models","elevenlabs_list_voices","elevenlabs_sound_effects","elevenlabs_speech_to_speech","elevenlabs_tts","emailbison_attach_leads_to_campaign","emailbison_attach_tags_to_leads","emailbison_create_campaign","emailbison_create_lead","emailbison_create_tag","emailbison_get_lead","emailbison_list_campaigns","emailbison_list_leads","emailbison_list_replies","emailbison_list_tags","emailbison_update_campaign","emailbison_update_campaign_status","emailbison_update_lead","embeddings_cohere","embeddings_gemini","embeddings_mistral","embeddings_openai","embeddings_openrouter","enrich_check_credits","enrich_company_funding","enrich_company_lookup","enrich_company_revenue","enrich_disposable_email_check","enrich_email_to_ip","enrich_email_to_person_lite","enrich_email_to_phone","enrich_email_to_profile","enrich_find_email","enrich_get_post_details","enrich_ip_to_company","enrich_linkedin_profile","enrich_linkedin_to_personal_email","enrich_linkedin_to_work_email","enrich_phone_finder","enrich_reverse_hash_lookup","enrich_sales_pointer_people","enrich_search_company","enrich_search_company_activities","enrich_search_company_employees","enrich_search_jobs","enrich_search_logo","enrich_search_people","enrich_search_people_activities","enrich_search_post_comments","enrich_search_post_comments_by_url","enrich_search_post_reactions","enrich_search_post_reactions_by_url","enrich_search_posts","enrich_search_similar_companies","enrich_verify_email","enrichment_run","enrow_find_email","enrow_verify_email","exa_agent","exa_answer","exa_find_similar_links","exa_get_contents","exa_search","extend_parser","extend_parser_v2","fathom_get_summary","fathom_get_transcript","fathom_list_meeting_types","fathom_list_meetings","fathom_list_team_members","fathom_list_teams","file_append","file_compress","file_create_folder","file_decompress","file_delete_folder","file_edit","file_fetch","file_get","file_get_content","file_list","file_manage_sharing","file_move","file_parser","file_parser_v2","file_parser_v3","file_read","file_restore_folder","file_search","file_update_folder","file_write","findymail_find_email_from_linkedin","findymail_find_email_from_name","findymail_find_emails_by_domain","findymail_find_employees","findymail_find_phone","findymail_get_company","findymail_get_credits","findymail_lookup_technologies","findymail_reverse_email_lookup","findymail_search_technologies","findymail_verify_email","firecrawl_agent","firecrawl_batch_scrape","firecrawl_batch_scrape_status","firecrawl_cancel_crawl","firecrawl_crawl","firecrawl_crawl_status","firecrawl_credit_usage","firecrawl_extract","firecrawl_extract_status","firecrawl_map","firecrawl_parse","firecrawl_scrape","firecrawl_search","fireflies_add_to_live_meeting","fireflies_create_bite","fireflies_delete_transcript","fireflies_get_transcript","fireflies_get_user","fireflies_list_bites","fireflies_list_contacts","fireflies_list_transcripts","fireflies_list_users","fireflies_upload_audio","flint_create_task","flint_generate_pages","flint_get_task","function_execute","gamma_check_status","gamma_generate","gamma_generate_from_template","gamma_list_folders","gamma_list_themes","github_add_assignees","github_add_assignees_v2","github_add_labels","github_add_labels_v2","github_cancel_workflow_run","github_cancel_workflow_run_v2","github_check_star","github_check_star_v2","github_close_issue","github_close_issue_v2","github_close_pr","github_close_pr_v2","github_comment","github_comment_v2","github_compare_commits","github_compare_commits_v2","github_create_branch","github_create_branch_v2","github_create_comment_reaction","github_create_comment_reaction_v2","github_create_file","github_create_file_v2","github_create_gist","github_create_gist_v2","github_create_issue","github_create_issue_reaction","github_create_issue_reaction_v2","github_create_issue_v2","github_create_milestone","github_create_milestone_v2","github_create_pr","github_create_pr_review","github_create_pr_review_v2","github_create_pr_v2","github_create_project","github_create_project_v2","github_create_release","github_create_release_v2","github_delete_branch","github_delete_branch_v2","github_delete_comment","github_delete_comment_reaction","github_delete_comment_reaction_v2","github_delete_comment_v2","github_delete_file","github_delete_file_v2","github_delete_gist","github_delete_gist_v2","github_delete_issue_reaction","github_delete_issue_reaction_v2","github_delete_milestone","github_delete_milestone_v2","github_delete_project","github_delete_project_v2","github_delete_release","github_delete_release_v2","github_fork_gist","github_fork_gist_v2","github_fork_repo","github_fork_repo_v2","github_get_branch","github_get_branch_protection","github_get_branch_protection_v2","github_get_branch_v2","github_get_commit","github_get_commit_v2","github_get_file_content","github_get_file_content_v2","github_get_gist","github_get_gist_v2","github_get_issue","github_get_issue_v2","github_get_latest_release","github_get_latest_release_v2","github_get_milestone","github_get_milestone_v2","github_get_pr_files","github_get_pr_files_v2","github_get_project","github_get_project_v2","github_get_readme","github_get_readme_v2","github_get_release","github_get_release_v2","github_get_tree","github_get_tree_v2","github_get_workflow","github_get_workflow_run","github_get_workflow_run_v2","github_get_workflow_v2","github_issue_comment","github_issue_comment_v2","github_job_logs","github_latest_commit","github_latest_commit_v2","github_list_branches","github_list_branches_v2","github_list_commits","github_list_commits_v2","github_list_forks","github_list_forks_v2","github_list_gists","github_list_gists_v2","github_list_issue_comments","github_list_issue_comments_v2","github_list_issues","github_list_issues_v2","github_list_milestones","github_list_milestones_v2","github_list_pr_comments","github_list_pr_comments_v2","github_list_projects","github_list_projects_v2","github_list_prs","github_list_prs_v2","github_list_releases","github_list_releases_v2","github_list_review_threads","github_list_stargazers","github_list_stargazers_v2","github_list_tags","github_list_tags_v2","github_list_workflow_runs","github_list_workflow_runs_v2","github_list_workflows","github_list_workflows_v2","github_merge_pr","github_merge_pr_v2","github_pr","github_pr_v2","github_remove_label","github_remove_label_v2","github_reply_review_thread","github_repo_info","github_repo_info_v2","github_request_reviewers","github_request_reviewers_v2","github_rerun_workflow","github_rerun_workflow_v2","github_resolve_review_thread","github_search_code","github_search_code_v2","github_search_commits","github_search_commits_v2","github_search_issues","github_search_issues_v2","github_search_repos","github_search_repos_v2","github_search_users","github_search_users_v2","github_star_gist","github_star_gist_v2","github_star_repo","github_star_repo_v2","github_status_check_rollup","github_trigger_workflow","github_trigger_workflow_v2","github_unstar_gist","github_unstar_gist_v2","github_unstar_repo","github_unstar_repo_v2","github_update_branch_protection","github_update_branch_protection_v2","github_update_comment","github_update_comment_v2","github_update_file","github_update_file_v2","github_update_gist","github_update_gist_v2","github_update_issue","github_update_issue_v2","github_update_milestone","github_update_milestone_v2","github_update_pr","github_update_pr_v2","github_update_project","github_update_project_v2","github_update_release","github_update_release_v2","gitlab_activate_user","gitlab_add_member","gitlab_add_saml_group_link","gitlab_approve_access_request","gitlab_approve_merge_request","gitlab_approve_user","gitlab_ban_user","gitlab_block_user","gitlab_cancel_pipeline","gitlab_compare_branches","gitlab_create_branch","gitlab_create_file","gitlab_create_issue","gitlab_create_issue_note","gitlab_create_merge_request","gitlab_create_merge_request_note","gitlab_create_pipeline","gitlab_create_release","gitlab_create_user","gitlab_deactivate_user","gitlab_delete_branch","gitlab_delete_issue","gitlab_delete_saml_group_link","gitlab_delete_user","gitlab_delete_user_identity","gitlab_deny_access_request","gitlab_get_file","gitlab_get_group","gitlab_get_issue","gitlab_get_job_log","gitlab_get_merge_request","gitlab_get_merge_request_changes","gitlab_get_pipeline","gitlab_get_project","gitlab_invite_member","gitlab_list_access_requests","gitlab_list_branches","gitlab_list_commits","gitlab_list_groups","gitlab_list_invitations","gitlab_list_issues","gitlab_list_members","gitlab_list_merge_requests","gitlab_list_pipeline_jobs","gitlab_list_pipelines","gitlab_list_projects","gitlab_list_releases","gitlab_list_repository_tree","gitlab_list_saml_group_links","gitlab_list_user_memberships","gitlab_merge_merge_request","gitlab_play_job","gitlab_reject_user","gitlab_remove_member","gitlab_retry_pipeline","gitlab_revoke_invitation","gitlab_search_users","gitlab_unban_user","gitlab_unblock_user","gitlab_update_file","gitlab_update_invitation","gitlab_update_issue","gitlab_update_member","gitlab_update_merge_request","gitlab_update_user","gmail_add_label","gmail_add_label_v2","gmail_archive","gmail_archive_v2","gmail_create_label_v2","gmail_delete","gmail_delete_draft_v2","gmail_delete_label_v2","gmail_delete_v2","gmail_draft","gmail_draft_v2","gmail_edit_draft_v2","gmail_get_draft_v2","gmail_get_thread_v2","gmail_list_drafts_v2","gmail_list_labels_v2","gmail_list_threads_v2","gmail_mark_read","gmail_mark_read_v2","gmail_mark_unread","gmail_mark_unread_v2","gmail_move","gmail_move_v2","gmail_read","gmail_read_v2","gmail_remove_label","gmail_remove_label_v2","gmail_search","gmail_search_v2","gmail_send","gmail_send_v2","gmail_trash_thread_v2","gmail_unarchive","gmail_unarchive_v2","gmail_untrash_thread_v2","gmail_update_label_v2","gong_aggregate_activity","gong_aggregate_by_period","gong_answered_scorecards","gong_ask_anything","gong_assign_flow_prospects","gong_create_call","gong_day_by_day_activity","gong_get_brief","gong_get_call","gong_get_call_transcript","gong_get_coaching","gong_get_extensive_calls","gong_get_folder_content","gong_get_logs","gong_get_prospect_flows","gong_get_user","gong_interaction_stats","gong_list_calls","gong_list_flows","gong_list_library_folders","gong_list_scorecards","gong_list_trackers","gong_list_users","gong_list_workspaces","gong_lookup_email","gong_lookup_phone","gong_purge_email_address","gong_purge_phone_number","gong_unassign_flow_prospects","google_ads_ad_performance","google_ads_campaign_performance","google_ads_list_ad_groups","google_ads_list_campaigns","google_ads_list_customers","google_ads_search","google_appsheet_add_rows","google_appsheet_delete_rows","google_appsheet_edit_rows","google_appsheet_find_rows","google_bigquery_create_dataset","google_bigquery_create_table","google_bigquery_delete_dataset","google_bigquery_delete_table","google_bigquery_get_query_results","google_bigquery_get_table","google_bigquery_insert_rows","google_bigquery_list_datasets","google_bigquery_list_table_data","google_bigquery_list_tables","google_bigquery_query","google_books_volume_details","google_books_volume_search","google_calendar_create","google_calendar_create_calendar","google_calendar_create_calendar_v2","google_calendar_create_v2","google_calendar_delete","google_calendar_delete_calendar","google_calendar_delete_calendar_v2","google_calendar_delete_v2","google_calendar_freebusy","google_calendar_freebusy_v2","google_calendar_get","google_calendar_get_v2","google_calendar_instances","google_calendar_instances_v2","google_calendar_invite","google_calendar_invite_v2","google_calendar_list","google_calendar_list_acl","google_calendar_list_acl_v2","google_calendar_list_calendars","google_calendar_list_calendars_v2","google_calendar_list_v2","google_calendar_move","google_calendar_move_v2","google_calendar_quick_add","google_calendar_quick_add_v2","google_calendar_share_calendar","google_calendar_share_calendar_v2","google_calendar_unshare_calendar","google_calendar_unshare_calendar_v2","google_calendar_update","google_calendar_update_acl","google_calendar_update_acl_v2","google_calendar_update_calendar","google_calendar_update_calendar_v2","google_calendar_update_v2","google_contacts_create","google_contacts_delete","google_contacts_get","google_contacts_list","google_contacts_search","google_contacts_update","google_docs_create","google_docs_create_named_range","google_docs_create_paragraph_bullets","google_docs_delete_content_range","google_docs_delete_named_range","google_docs_delete_paragraph_bullets","google_docs_insert_image","google_docs_insert_page_break","google_docs_insert_table","google_docs_insert_text","google_docs_read","google_docs_replace_text","google_docs_update_paragraph_style","google_docs_update_text_style","google_docs_write","google_drive_copy","google_drive_create_comment","google_drive_create_folder","google_drive_delete","google_drive_delete_comment","google_drive_download","google_drive_export","google_drive_get_about","google_drive_get_content","google_drive_get_file","google_drive_get_revision","google_drive_list","google_drive_list_comments","google_drive_list_permissions","google_drive_list_revisions","google_drive_move","google_drive_search","google_drive_share","google_drive_trash","google_drive_unshare","google_drive_untrash","google_drive_update","google_drive_upload","google_forms_batch_update","google_forms_create_form","google_forms_create_watch","google_forms_delete_watch","google_forms_get_form","google_forms_get_responses","google_forms_list_watches","google_forms_renew_watch","google_forms_set_publish_settings","google_groups_add_alias","google_groups_add_member","google_groups_create_group","google_groups_delete_group","google_groups_get_group","google_groups_get_member","google_groups_get_settings","google_groups_has_member","google_groups_list_aliases","google_groups_list_groups","google_groups_list_members","google_groups_remove_alias","google_groups_remove_member","google_groups_update_group","google_groups_update_member","google_groups_update_settings","google_maps_air_quality","google_maps_directions","google_maps_distance_matrix","google_maps_elevation","google_maps_geocode","google_maps_geolocate","google_maps_place_details","google_maps_places_nearby","google_maps_places_search","google_maps_pollen","google_maps_reverse_geocode","google_maps_snap_to_roads","google_maps_solar","google_maps_speed_limits","google_maps_timezone","google_maps_validate_address","google_meet_create_space","google_meet_end_conference","google_meet_get_conference_record","google_meet_get_space","google_meet_list_conference_records","google_meet_list_participants","google_pagespeed_analyze","google_search","google_sheets_append","google_sheets_append_v2","google_sheets_batch_clear_v2","google_sheets_batch_get_v2","google_sheets_batch_update_v2","google_sheets_clear_v2","google_sheets_copy_sheet_v2","google_sheets_create_spreadsheet_v2","google_sheets_delete_rows_v2","google_sheets_delete_sheet_v2","google_sheets_delete_spreadsheet_v2","google_sheets_get_spreadsheet_v2","google_sheets_read","google_sheets_read_v2","google_sheets_update","google_sheets_update_v2","google_sheets_write","google_sheets_write_v2","google_slides_add_image","google_slides_add_slide","google_slides_batch_update","google_slides_copy_presentation","google_slides_create","google_slides_create_line","google_slides_create_paragraph_bullets","google_slides_create_shape","google_slides_create_sheets_chart","google_slides_create_table","google_slides_create_video","google_slides_delete_object","google_slides_delete_paragraph_bullets","google_slides_delete_table_column","google_slides_delete_table_row","google_slides_delete_text","google_slides_duplicate_object","google_slides_export_presentation","google_slides_get_page","google_slides_get_thumbnail","google_slides_group_objects","google_slides_insert_table_columns","google_slides_insert_table_rows","google_slides_insert_text","google_slides_merge_table_cells","google_slides_read","google_slides_refresh_sheets_chart","google_slides_replace_all_shapes_with_image","google_slides_replace_all_shapes_with_sheets_chart","google_slides_replace_all_text","google_slides_replace_image","google_slides_reroute_line","google_slides_ungroup_objects","google_slides_unmerge_table_cells","google_slides_update_image_properties","google_slides_update_line_category","google_slides_update_line_properties","google_slides_update_page_element_alt_text","google_slides_update_page_element_transform","google_slides_update_page_elements_z_order","google_slides_update_page_properties","google_slides_update_paragraph_style","google_slides_update_shape_properties","google_slides_update_slide_properties","google_slides_update_slides_position","google_slides_update_table_border_properties","google_slides_update_table_cell_properties","google_slides_update_table_column_properties","google_slides_update_table_row_properties","google_slides_update_text_style","google_slides_update_video_properties","google_slides_write","google_tasks_create","google_tasks_delete","google_tasks_get","google_tasks_list","google_tasks_list_task_lists","google_tasks_update","google_translate_detect","google_translate_text","google_vault_add_held_accounts","google_vault_add_matters_permissions","google_vault_close_matters","google_vault_create_matters","google_vault_create_matters_export","google_vault_create_matters_holds","google_vault_create_saved_query","google_vault_delete_matters","google_vault_delete_matters_export","google_vault_delete_matters_holds","google_vault_delete_saved_query","google_vault_download_export_file","google_vault_list_matters","google_vault_list_matters_export","google_vault_list_matters_holds","google_vault_list_saved_queries","google_vault_remove_held_accounts","google_vault_remove_matters_permissions","google_vault_reopen_matters","google_vault_undelete_matters","google_vault_update_matters","google_vault_update_matters_holds","grafana_check_data_source_health","grafana_create_alert_rule","grafana_create_annotation","grafana_create_contact_point","grafana_create_dashboard","grafana_create_folder","grafana_delete_alert_rule","grafana_delete_annotation","grafana_delete_contact_point","grafana_delete_dashboard","grafana_delete_folder","grafana_get_alert_rule","grafana_get_alert_rule_group","grafana_get_dashboard","grafana_get_data_source","grafana_get_folder","grafana_get_health","grafana_list_alert_rules","grafana_list_annotations","grafana_list_contact_points","grafana_list_dashboards","grafana_list_data_sources","grafana_list_folders","grafana_move_folder","grafana_query_data_source","grafana_update_alert_rule","grafana_update_annotation","grafana_update_contact_point","grafana_update_dashboard","grafana_update_folder","grain_create_hook","grain_create_hook_v2","grain_delete_hook","grain_delete_hook_v2","grain_get_recording","grain_get_transcript","grain_list_hooks","grain_list_hooks_v2","grain_list_meeting_types","grain_list_recordings","grain_list_teams","grain_list_views","granola_create_webhook_endpoint","granola_delete_webhook_endpoint","granola_get_note","granola_get_transcript","granola_list_audit_events","granola_list_folders","granola_list_notes","granola_list_webhook_endpoints","granola_update_webhook_endpoint","greenhouse_get_application","greenhouse_get_candidate","greenhouse_get_job","greenhouse_get_user","greenhouse_list_applications","greenhouse_list_candidates","greenhouse_list_departments","greenhouse_list_job_stages","greenhouse_list_jobs","greenhouse_list_offices","greenhouse_list_users","greptile_index_repo","greptile_query","greptile_search","greptile_status","guardrails_validate","harmonic_batch_get_people","harmonic_clear_people_saved_search_net_new_results","harmonic_enrich_person","harmonic_get_company_employees","harmonic_get_email_enrichment_job","harmonic_get_email_enrichment_usage","harmonic_get_enrichment_status","harmonic_get_people_saved_search_net_new_results","harmonic_get_people_saved_search_results","harmonic_get_person","harmonic_list_people_saved_searches","harmonic_search_people_scout","harmonic_submit_email_enrichment_job","hex_cancel_run","hex_create_collection","hex_create_group","hex_deactivate_user","hex_delete_group","hex_get_collection","hex_get_data_connection","hex_get_group","hex_get_project","hex_get_project_runs","hex_get_queried_tables","hex_get_run_status","hex_list_collections","hex_list_data_connections","hex_list_groups","hex_list_projects","hex_list_users","hex_run_project","hex_update_collection","hex_update_group","hex_update_project","http_request","hubspot_add_list_memberships","hubspot_create_appointment","hubspot_create_association","hubspot_create_company","hubspot_create_contact","hubspot_create_deal","hubspot_create_email","hubspot_create_line_item","hubspot_create_list","hubspot_create_note","hubspot_create_ticket","hubspot_delete_association","hubspot_delete_company","hubspot_delete_contact","hubspot_delete_deal","hubspot_delete_line_item","hubspot_delete_ticket","hubspot_get_appointment","hubspot_get_association_labels","hubspot_get_cart","hubspot_get_company","hubspot_get_contact","hubspot_get_deal","hubspot_get_email","hubspot_get_line_item","hubspot_get_list","hubspot_get_list_memberships","hubspot_get_marketing_event","hubspot_get_note","hubspot_get_properties","hubspot_get_quote","hubspot_get_ticket","hubspot_get_users","hubspot_list_appointments","hubspot_list_associations","hubspot_list_carts","hubspot_list_companies","hubspot_list_contacts","hubspot_list_deals","hubspot_list_emails","hubspot_list_line_items","hubspot_list_lists","hubspot_list_marketing_events","hubspot_list_notes","hubspot_list_owners","hubspot_list_quotes","hubspot_list_tickets","hubspot_remove_list_memberships","hubspot_search_companies","hubspot_search_contacts","hubspot_search_deals","hubspot_search_emails","hubspot_search_line_items","hubspot_search_notes","hubspot_search_quotes","hubspot_search_tickets","hubspot_update_appointment","hubspot_update_company","hubspot_update_contact","hubspot_update_deal","hubspot_update_line_item","hubspot_update_ticket","huggingface_chat","hunter_companies_find","hunter_discover","hunter_domain_search","hunter_email_count","hunter_email_finder","hunter_email_verifier","iam_add_user_to_group","iam_attach_role_policy","iam_attach_user_policy","iam_create_access_key","iam_create_role","iam_create_user","iam_delete_access_key","iam_delete_role","iam_delete_user","iam_detach_role_policy","iam_detach_user_policy","iam_get_role","iam_get_user","iam_list_attached_role_policies","iam_list_attached_user_policies","iam_list_groups","iam_list_policies","iam_list_roles","iam_list_users","iam_remove_user_from_group","iam_simulate_principal_policy","icypeas_find_email","icypeas_verify_email","identity_center_check_assignment_deletion_status","identity_center_check_assignment_status","identity_center_create_account_assignment","identity_center_delete_account_assignment","identity_center_describe_account","identity_center_get_group","identity_center_get_user","identity_center_list_account_assignments","identity_center_list_accounts","identity_center_list_groups","identity_center_list_instances","identity_center_list_permission_sets","image_generate","incidentio_actions_create","incidentio_actions_list","incidentio_actions_show","incidentio_actions_update","incidentio_alert_events_create","incidentio_alerts_list","incidentio_alerts_resolve","incidentio_alerts_show","incidentio_catalog_entries_list","incidentio_catalog_types_list","incidentio_custom_fields_create","incidentio_custom_fields_delete","incidentio_custom_fields_list","incidentio_custom_fields_show","incidentio_custom_fields_update","incidentio_escalation_paths_create","incidentio_escalation_paths_delete","incidentio_escalation_paths_list","incidentio_escalation_paths_show","incidentio_escalation_paths_update","incidentio_escalations_cancel","incidentio_escalations_create","incidentio_escalations_list","incidentio_escalations_show","incidentio_follow_ups_create","incidentio_follow_ups_list","incidentio_follow_ups_show","incidentio_follow_ups_update","incidentio_incident_alerts_list","incidentio_incident_memberships_create","incidentio_incident_memberships_revoke","incidentio_incident_participants_list","incidentio_incident_roles_create","incidentio_incident_roles_delete","incidentio_incident_roles_list","incidentio_incident_roles_show","incidentio_incident_roles_update","incidentio_incident_statuses_list","incidentio_incident_timestamps_list","incidentio_incident_timestamps_show","incidentio_incident_types_list","incidentio_incident_updates_list","incidentio_incidents_create","incidentio_incidents_list","incidentio_incidents_show","incidentio_incidents_update","incidentio_on_call_now","incidentio_schedule_entries_list","incidentio_schedule_overrides_create","incidentio_schedule_overrides_list","incidentio_schedules_create","incidentio_schedules_delete","incidentio_schedules_list","incidentio_schedules_show","incidentio_schedules_update","incidentio_severities_list","incidentio_teams_list","incidentio_teams_show","incidentio_users_list","incidentio_users_show","incidentio_workflows_create","incidentio_workflows_delete","incidentio_workflows_list","incidentio_workflows_show","incidentio_workflows_update","infisical_create_secret","infisical_delete_secret","infisical_get_secret","infisical_list_secrets","infisical_update_secret","instagram_delete_comment","instagram_download_media","instagram_get_account_insights","instagram_get_container_status","instagram_get_conversation_messages","instagram_get_media","instagram_get_media_insights","instagram_get_message","instagram_get_profile","instagram_get_publishing_limit","instagram_hide_comment","instagram_list_comments","instagram_list_conversations","instagram_list_media","instagram_list_stories","instagram_private_reply","instagram_publish_carousel","instagram_publish_image","instagram_publish_reel","instagram_publish_story","instagram_publish_video","instagram_reply_to_comment","instagram_send_text_message","instagram_set_comments_enabled","instantly_activate_campaign","instantly_create_campaign","instantly_create_lead","instantly_create_lead_list","instantly_delete_campaign","instantly_delete_leads","instantly_get_lead","instantly_list_campaigns","instantly_list_emails","instantly_list_lead_lists","instantly_list_leads","instantly_patch_campaign","instantly_patch_lead","instantly_pause_campaign","instantly_reply_to_email","instantly_update_lead_interest_status","intercom_assign_conversation_v2","intercom_attach_contact_to_company_v2","intercom_close_conversation_v2","intercom_create_company","intercom_create_company_v2","intercom_create_contact","intercom_create_contact_v2","intercom_create_event_v2","intercom_create_message","intercom_create_message_v2","intercom_create_note_v2","intercom_create_tag_v2","intercom_create_ticket","intercom_create_ticket_v2","intercom_delete_contact","intercom_delete_contact_v2","intercom_detach_contact_from_company_v2","intercom_get_company","intercom_get_company_v2","intercom_get_contact","intercom_get_contact_v2","intercom_get_conversation","intercom_get_conversation_v2","intercom_get_ticket","intercom_get_ticket_v2","intercom_list_admins_v2","intercom_list_companies","intercom_list_companies_v2","intercom_list_contacts","intercom_list_contacts_v2","intercom_list_conversations","intercom_list_conversations_v2","intercom_list_tags_v2","intercom_open_conversation_v2","intercom_reply_conversation","intercom_reply_conversation_v2","intercom_search_contacts","intercom_search_contacts_v2","intercom_search_conversations","intercom_search_conversations_v2","intercom_snooze_conversation_v2","intercom_tag_contact_v2","intercom_tag_conversation_v2","intercom_untag_contact_v2","intercom_update_contact","intercom_update_contact_v2","intercom_update_ticket_v2","jina_read_url","jina_search","jira_add_attachment","jira_add_comment","jira_add_watcher","jira_add_worklog","jira_assign_issue","jira_bulk_read","jira_create_issue_link","jira_delete_attachment","jira_delete_comment","jira_delete_issue","jira_delete_issue_link","jira_delete_worklog","jira_get_attachments","jira_get_comments","jira_get_fields","jira_get_project","jira_get_transitions","jira_get_users","jira_get_worklogs","jira_list_issue_types","jira_list_projects","jira_remove_watcher","jira_retrieve","jira_search_issues","jira_search_users","jira_transition_issue","jira_update","jira_update_comment","jira_update_worklog","jira_write","jotform_add_label_resources","jotform_clone_form","jotform_create_form","jotform_create_label","jotform_create_question","jotform_create_questions","jotform_create_report","jotform_create_submission","jotform_create_submissions","jotform_create_webhook","jotform_delete_form","jotform_delete_label","jotform_delete_question","jotform_delete_report","jotform_delete_submission","jotform_delete_webhook","jotform_get_form","jotform_get_form_properties","jotform_get_history","jotform_get_label","jotform_get_question","jotform_get_report","jotform_get_settings","jotform_get_submission","jotform_get_usage","jotform_get_user","jotform_list_form_files","jotform_list_form_reports","jotform_list_form_submissions","jotform_list_forms","jotform_list_label_resources","jotform_list_labels","jotform_list_questions","jotform_list_reports","jotform_list_submissions","jotform_list_subusers","jotform_list_webhooks","jotform_remove_label_resources","jotform_update_form_properties","jotform_update_label","jotform_update_question","jotform_update_settings","jotform_update_submission","jsm_add_comment","jsm_add_customer","jsm_add_organization","jsm_add_participants","jsm_answer_approval","jsm_attach_form","jsm_copy_forms","jsm_create_object","jsm_create_organization","jsm_create_request","jsm_delete_form","jsm_delete_object","jsm_externalise_form","jsm_get_approvals","jsm_get_comments","jsm_get_customers","jsm_get_form","jsm_get_form_answers","jsm_get_form_structure","jsm_get_form_templates","jsm_get_issue_forms","jsm_get_object","jsm_get_object_schema","jsm_get_object_type_attributes","jsm_get_organizations","jsm_get_participants","jsm_get_queues","jsm_get_request","jsm_get_request_type_fields","jsm_get_request_types","jsm_get_requests","jsm_get_service_desks","jsm_get_sla","jsm_get_transitions","jsm_internalise_form","jsm_list_object_schemas","jsm_list_object_types","jsm_reopen_form","jsm_save_form_answers","jsm_search_objects_aql","jsm_submit_form","jsm_transition_request","jsm_update_object","jupyter_copy_content","jupyter_create_file","jupyter_create_session","jupyter_delete_content","jupyter_delete_session","jupyter_get_content","jupyter_interrupt_kernel","jupyter_list_contents","jupyter_list_kernels","jupyter_list_kernelspecs","jupyter_list_sessions","jupyter_rename_content","jupyter_restart_kernel","jupyter_start_kernel","jupyter_stop_kernel","jupyter_upload_file","kalshi_amend_order","kalshi_amend_order_v2","kalshi_cancel_order","kalshi_cancel_order_v2","kalshi_create_order","kalshi_create_order_v2","kalshi_get_balance","kalshi_get_balance_v2","kalshi_get_candlesticks","kalshi_get_candlesticks_v2","kalshi_get_event","kalshi_get_event_candlesticks","kalshi_get_event_candlesticks_v2","kalshi_get_event_v2","kalshi_get_events","kalshi_get_events_v2","kalshi_get_exchange_announcements","kalshi_get_exchange_announcements_v2","kalshi_get_exchange_schedule","kalshi_get_exchange_schedule_v2","kalshi_get_exchange_status","kalshi_get_exchange_status_v2","kalshi_get_fills","kalshi_get_fills_v2","kalshi_get_market","kalshi_get_market_v2","kalshi_get_markets","kalshi_get_markets_v2","kalshi_get_order","kalshi_get_order_v2","kalshi_get_orderbook","kalshi_get_orderbook_v2","kalshi_get_orders","kalshi_get_orders_v2","kalshi_get_positions","kalshi_get_positions_v2","kalshi_get_series_by_ticker","kalshi_get_series_by_ticker_v2","kalshi_get_series_list","kalshi_get_series_list_v2","kalshi_get_settlements","kalshi_get_settlements_v2","kalshi_get_trades","kalshi_get_trades_v2","ketch_get_consent","ketch_get_subscriptions","ketch_invoke_right","ketch_set_consent","ketch_set_subscriptions","knowledge_create_document","knowledge_delete_chunk","knowledge_delete_document","knowledge_get_connector","knowledge_get_document","knowledge_list_chunks","knowledge_list_connectors","knowledge_list_documents","knowledge_list_tags","knowledge_search","knowledge_trigger_sync","knowledge_update_chunk","knowledge_upload_chunk","knowledge_upsert_document","lambda_add_permission","lambda_create_alias","lambda_create_event_source_mapping","lambda_create_function","lambda_create_function_url_config","lambda_delete_alias","lambda_delete_event_source_mapping","lambda_delete_function","lambda_delete_function_concurrency","lambda_delete_function_event_invoke_config","lambda_delete_function_url_config","lambda_delete_provisioned_concurrency_config","lambda_get_account_settings","lambda_get_alias","lambda_get_event_source_mapping","lambda_get_function","lambda_get_function_concurrency","lambda_get_function_configuration","lambda_get_function_event_invoke_config","lambda_get_function_recursion_config","lambda_get_function_url_config","lambda_get_layer_version","lambda_get_policy","lambda_get_provisioned_concurrency_config","lambda_get_runtime_management_config","lambda_invoke","lambda_list_aliases","lambda_list_event_source_mappings","lambda_list_function_event_invoke_configs","lambda_list_function_url_configs","lambda_list_functions","lambda_list_layer_versions","lambda_list_layers","lambda_list_provisioned_concurrency_configs","lambda_list_tags","lambda_list_versions_by_function","lambda_publish_version","lambda_put_function_concurrency","lambda_put_function_event_invoke_config","lambda_put_function_recursion_config","lambda_put_provisioned_concurrency_config","lambda_put_runtime_management_config","lambda_remove_permission","lambda_tag_resource","lambda_untag_resource","lambda_update_alias","lambda_update_event_source_mapping","lambda_update_function_code","lambda_update_function_configuration","lambda_update_function_url_config","langsmith_create_feedback","langsmith_create_run","langsmith_create_runs_batch","langsmith_get_run","langsmith_update_run","latex_compile","latex_get_package","latex_list_fonts","latex_search_packages","launchdarkly_create_flag","launchdarkly_delete_flag","launchdarkly_get_audit_log","launchdarkly_get_flag","launchdarkly_get_flag_status","launchdarkly_list_environments","launchdarkly_list_flags","launchdarkly_list_members","launchdarkly_list_projects","launchdarkly_list_segments","launchdarkly_toggle_flag","launchdarkly_update_flag","leadmagic_company_search","leadmagic_email_to_profile","leadmagic_find_email","leadmagic_find_mobile","leadmagic_get_credits","leadmagic_profile_search","leadmagic_profile_to_email","leadmagic_role_finder","leadmagic_validate_email","lemlist_get_activities","lemlist_get_lead","lemlist_send_email","linear_add_label_to_issue","linear_add_label_to_project","linear_archive_issue","linear_archive_label","linear_archive_project","linear_create_attachment","linear_create_comment","linear_create_customer","linear_create_customer_request","linear_create_customer_status","linear_create_customer_tier","linear_create_cycle","linear_create_favorite","linear_create_issue","linear_create_issue_relation","linear_create_label","linear_create_project","linear_create_project_label","linear_create_project_milestone","linear_create_project_status","linear_create_project_update","linear_create_workflow_state","linear_delete_attachment","linear_delete_comment","linear_delete_customer","linear_delete_customer_status","linear_delete_customer_tier","linear_delete_issue","linear_delete_issue_relation","linear_delete_project","linear_delete_project_label","linear_delete_project_milestone","linear_delete_project_status","linear_get_active_cycle","linear_get_customer","linear_get_cycle","linear_get_issue","linear_get_project","linear_get_viewer","linear_list_attachments","linear_list_comments","linear_list_customer_requests","linear_list_customer_statuses","linear_list_customer_tiers","linear_list_customers","linear_list_cycles","linear_list_favorites","linear_list_issue_relations","linear_list_labels","linear_list_notifications","linear_list_project_labels","linear_list_project_milestones","linear_list_project_statuses","linear_list_project_updates","linear_list_projects","linear_list_teams","linear_list_users","linear_list_workflow_states","linear_merge_customers","linear_read_issues","linear_remove_label_from_issue","linear_remove_label_from_project","linear_search_issues","linear_unarchive_issue","linear_update_attachment","linear_update_comment","linear_update_customer","linear_update_customer_request","linear_update_customer_status","linear_update_customer_tier","linear_update_issue","linear_update_label","linear_update_notification","linear_update_project","linear_update_project_label","linear_update_project_milestone","linear_update_project_status","linear_update_workflow_state","linkedin_get_profile","linkedin_share_post","linkup_search","linq_add_participant","linq_check_imessage","linq_check_rcs","linq_create_attachment","linq_create_chat","linq_create_contact_card","linq_create_webhook_subscription","linq_delete_attachment","linq_delete_message","linq_delete_webhook_subscription","linq_edit_message","linq_get_attachment","linq_get_chat","linq_get_contact_card","linq_get_message","linq_get_webhook_subscription","linq_leave_chat","linq_list_chats","linq_list_messages","linq_list_phone_numbers","linq_list_thread","linq_list_webhook_events","linq_list_webhook_subscriptions","linq_mark_chat_read","linq_react_to_message","linq_remove_participant","linq_send_message","linq_send_voice_memo","linq_share_contact_card","linq_start_typing","linq_stop_typing","linq_update_chat","linq_update_contact_card","linq_update_webhook_subscription","llm_chat","logfire_get_token_info","logfire_get_trace","logfire_query","logfire_search_records","logrocket_create_release","logrocket_get_audit_logs","logrocket_get_highlights","logrocket_identify_user","logrocket_list_exported_sessions","logrocket_request_highlights","logs_get","logs_get_execution","logs_get_run_details","logs_query","logs_query_runs","loops_check_contact_suppression","loops_create_contact","loops_create_contact_property","loops_delete_contact","loops_find_contact","loops_get_transactional_email","loops_list_contact_properties","loops_list_mailing_lists","loops_list_transactional_emails","loops_remove_contact_suppression","loops_send_event","loops_send_transactional_email","loops_update_contact","luma_add_guests","luma_cancel_event","luma_create_event","luma_get_event","luma_get_guest","luma_get_guests","luma_list_events","luma_lookup_event","luma_send_invites","luma_update_event","luma_update_guest_status","mailchimp_add_member","mailchimp_add_member_tags","mailchimp_add_or_update_member","mailchimp_add_segment_member","mailchimp_add_subscriber_to_automation","mailchimp_archive_member","mailchimp_create_audience","mailchimp_create_batch_operation","mailchimp_create_campaign","mailchimp_create_interest","mailchimp_create_interest_category","mailchimp_create_landing_page","mailchimp_create_merge_field","mailchimp_create_segment","mailchimp_create_template","mailchimp_delete_audience","mailchimp_delete_batch_operation","mailchimp_delete_campaign","mailchimp_delete_interest","mailchimp_delete_interest_category","mailchimp_delete_landing_page","mailchimp_delete_member","mailchimp_delete_merge_field","mailchimp_delete_segment","mailchimp_delete_template","mailchimp_get_audience","mailchimp_get_audiences","mailchimp_get_automation","mailchimp_get_automations","mailchimp_get_batch_operation","mailchimp_get_batch_operations","mailchimp_get_campaign","mailchimp_get_campaign_content","mailchimp_get_campaign_report","mailchimp_get_campaign_reports","mailchimp_get_campaigns","mailchimp_get_interest","mailchimp_get_interest_categories","mailchimp_get_interest_category","mailchimp_get_interests","mailchimp_get_landing_page","mailchimp_get_landing_pages","mailchimp_get_member","mailchimp_get_member_tags","mailchimp_get_members","mailchimp_get_merge_field","mailchimp_get_merge_fields","mailchimp_get_segment","mailchimp_get_segment_members","mailchimp_get_segments","mailchimp_get_template","mailchimp_get_templates","mailchimp_pause_automation","mailchimp_publish_landing_page","mailchimp_remove_member_tags","mailchimp_remove_segment_member","mailchimp_replicate_campaign","mailchimp_schedule_campaign","mailchimp_send_campaign","mailchimp_set_campaign_content","mailchimp_start_automation","mailchimp_unarchive_member","mailchimp_unpublish_landing_page","mailchimp_unschedule_campaign","mailchimp_update_audience","mailchimp_update_campaign","mailchimp_update_interest","mailchimp_update_interest_category","mailchimp_update_landing_page","mailchimp_update_member","mailchimp_update_merge_field","mailchimp_update_segment","mailchimp_update_template","mailgun_add_list_member","mailgun_create_mailing_list","mailgun_get_domain","mailgun_get_mailing_list","mailgun_get_message","mailgun_list_domains","mailgun_list_messages","mailgun_send_message","managed_agent_archive_session","managed_agent_create_session","managed_agent_delete_session","managed_agent_get_session","managed_agent_interrupt_session","managed_agent_list_events","managed_agent_respond_custom_tool","managed_agent_respond_tool_confirmation","managed_agent_run_session","managed_agent_send_message","managed_agent_update_session","manageengine_sdp_add_change_note","manageengine_sdp_add_problem_note","manageengine_sdp_add_request_note","manageengine_sdp_create_asset","manageengine_sdp_create_change","manageengine_sdp_create_problem","manageengine_sdp_create_request","manageengine_sdp_create_solution","manageengine_sdp_delete_asset","manageengine_sdp_delete_change","manageengine_sdp_delete_problem","manageengine_sdp_delete_request","manageengine_sdp_delete_solution","manageengine_sdp_get_asset","manageengine_sdp_get_change","manageengine_sdp_get_problem","manageengine_sdp_get_request","manageengine_sdp_get_solution","manageengine_sdp_list_assets","manageengine_sdp_list_change_notes","manageengine_sdp_list_changes","manageengine_sdp_list_problem_notes","manageengine_sdp_list_problems","manageengine_sdp_list_request_notes","manageengine_sdp_list_requests","manageengine_sdp_list_solutions","manageengine_sdp_update_asset","manageengine_sdp_update_change","manageengine_sdp_update_problem","manageengine_sdp_update_request","manageengine_sdp_update_solution","mem0_add_memories","mem0_get_memories","mem0_search_memories","memory_add","memory_delete","memory_get","memory_get_all","microsoft_ad_add_directory_role_member","microsoft_ad_add_group_member","microsoft_ad_add_user_app_role_assignment","microsoft_ad_assign_license","microsoft_ad_create_group","microsoft_ad_create_user","microsoft_ad_delete_group","microsoft_ad_delete_user","microsoft_ad_get_conditional_access_policy","microsoft_ad_get_device","microsoft_ad_get_group","microsoft_ad_get_user","microsoft_ad_list_authentication_methods","microsoft_ad_list_conditional_access_policies","microsoft_ad_list_devices","microsoft_ad_list_directory_audits","microsoft_ad_list_directory_role_members","microsoft_ad_list_directory_roles","microsoft_ad_list_group_members","microsoft_ad_list_groups","microsoft_ad_list_service_principal_app_role_assignments","microsoft_ad_list_service_principals","microsoft_ad_list_sign_ins","microsoft_ad_list_subscribed_skus","microsoft_ad_list_user_app_role_assignments","microsoft_ad_list_user_devices","microsoft_ad_list_user_licenses","microsoft_ad_list_users","microsoft_ad_remove_directory_role_member","microsoft_ad_remove_group_member","microsoft_ad_remove_user_app_role_assignment","microsoft_ad_reset_password","microsoft_ad_revoke_sign_in_sessions","microsoft_ad_set_password","microsoft_ad_update_group","microsoft_ad_update_user","microsoft_dataverse_associate","microsoft_dataverse_create_multiple","microsoft_dataverse_create_record","microsoft_dataverse_delete_record","microsoft_dataverse_disassociate","microsoft_dataverse_download_file","microsoft_dataverse_execute_action","microsoft_dataverse_execute_function","microsoft_dataverse_fetchxml_query","microsoft_dataverse_get_entity_metadata","microsoft_dataverse_get_record","microsoft_dataverse_list_records","microsoft_dataverse_search","microsoft_dataverse_update_multiple","microsoft_dataverse_update_record","microsoft_dataverse_upload_file","microsoft_dataverse_upsert_record","microsoft_dataverse_whoami","microsoft_dynamics_365_close_case","microsoft_dynamics_365_close_opportunity","microsoft_dynamics_365_create_record","microsoft_dynamics_365_get_record","microsoft_dynamics_365_list_records","microsoft_dynamics_365_qualify_lead","microsoft_dynamics_365_search_records","microsoft_dynamics_365_update_record","microsoft_excel_clear_range","microsoft_excel_create_table","microsoft_excel_delete_worksheet","microsoft_excel_format_range","microsoft_excel_read","microsoft_excel_read_v2","microsoft_excel_sort_range","microsoft_excel_table_add","microsoft_excel_worksheet_add","microsoft_excel_write","microsoft_excel_write_v2","microsoft_planner_create_bucket","microsoft_planner_create_plan","microsoft_planner_create_task","microsoft_planner_delete_bucket","microsoft_planner_delete_plan","microsoft_planner_delete_task","microsoft_planner_get_plan_details","microsoft_planner_get_task_details","microsoft_planner_list_buckets","microsoft_planner_list_plans","microsoft_planner_read_bucket","microsoft_planner_read_plan","microsoft_planner_read_task","microsoft_planner_update_bucket","microsoft_planner_update_plan","microsoft_planner_update_plan_details","microsoft_planner_update_task","microsoft_planner_update_task_details","microsoft_teams_delete_channel_message","microsoft_teams_delete_chat_message","microsoft_teams_get_message","microsoft_teams_list_channel_members","microsoft_teams_list_channels","microsoft_teams_list_chat_members","microsoft_teams_list_chats","microsoft_teams_list_team_members","microsoft_teams_list_teams","microsoft_teams_read_channel","microsoft_teams_read_chat","microsoft_teams_reply_to_message","microsoft_teams_set_reaction","microsoft_teams_unset_reaction","microsoft_teams_update_channel_message","microsoft_teams_update_chat_message","microsoft_teams_write_channel","microsoft_teams_write_chat","microsoft_word_append","microsoft_word_create","microsoft_word_create_from_template","microsoft_word_export_pdf","microsoft_word_list","microsoft_word_read","microsoft_word_replace_text","microsoft_word_update","millionverifier_get_credits","millionverifier_verify_email","mintlify_create_agent_job","mintlify_create_assistant_message","mintlify_detect_ai_prose","mintlify_get_agent_job","mintlify_get_assistant_caller_stats","mintlify_get_assistant_conversations","mintlify_get_feedback","mintlify_get_feedback_by_page","mintlify_get_page_content","mintlify_get_searches","mintlify_get_update_status","mintlify_get_views","mintlify_get_visitors","mintlify_search","mintlify_send_agent_message","mintlify_trigger_automation","mintlify_trigger_preview","mintlify_trigger_update","mistral_parser","mistral_parser_v2","mistral_parser_v3","modal_call_function","modal_chat_completion","modal_list_models","monday_archive_item","monday_change_column_value","monday_create_board","monday_create_column","monday_create_group","monday_create_item","monday_create_subitem","monday_create_update","monday_delete_item","monday_duplicate_item","monday_get_board","monday_get_groups","monday_get_item","monday_get_items","monday_list_boards","monday_move_item_to_group","monday_search_items","monday_update_item","mongodb_delete","mongodb_execute","mongodb_insert","mongodb_introspect","mongodb_query","mongodb_update","mssql_delete","mssql_execute","mssql_insert","mssql_introspect","mssql_query","mssql_update","mysql_delete","mysql_execute","mysql_insert","mysql_introspect","mysql_query","mysql_update","neo4j_create","neo4j_delete","neo4j_execute","neo4j_introspect","neo4j_merge","neo4j_query","neo4j_update","netsuite_attach_record","netsuite_batch_create_records","netsuite_batch_delete_records","netsuite_batch_get_records","netsuite_batch_update_records","netsuite_batch_upsert_records","netsuite_create_record","netsuite_delete_record","netsuite_detach_record","netsuite_execute_action","netsuite_execute_dataset","netsuite_execute_suiteql","netsuite_get_async_result","netsuite_get_async_status","netsuite_get_governance_limits","netsuite_get_record","netsuite_get_record_form","netsuite_get_record_metadata","netsuite_get_select_options","netsuite_get_server_time","netsuite_get_subresource","netsuite_list_datasets","netsuite_list_record_types","netsuite_list_records","netsuite_transform_record","netsuite_update_record","netsuite_upsert_record","neverbounce_get_credits","neverbounce_verify_email","new_relic_create_deployment_event","new_relic_get_entity","new_relic_nrql_query","new_relic_search_entities","notion_add_database_row","notion_add_database_row_v2","notion_append_blocks","notion_append_blocks_v2","notion_create_comment","notion_create_comment_v2","notion_create_database","notion_create_database_v2","notion_create_page","notion_create_page_v2","notion_delete_block","notion_delete_block_v2","notion_list_comments","notion_list_comments_v2","notion_list_users","notion_list_users_v2","notion_query_database","notion_query_database_v2","notion_read","notion_read_database","notion_read_database_v2","notion_read_v2","notion_retrieve_block","notion_retrieve_block_children","notion_retrieve_block_children_v2","notion_retrieve_block_v2","notion_retrieve_user","notion_retrieve_user_v2","notion_search","notion_search_v2","notion_update_block","notion_update_block_v2","notion_update_page","notion_update_page_v2","notion_write","notion_write_v2","obsidian_append_active","obsidian_append_note","obsidian_append_periodic_note","obsidian_create_note","obsidian_delete_note","obsidian_execute_command","obsidian_get_active","obsidian_get_note","obsidian_get_periodic_note","obsidian_list_commands","obsidian_list_files","obsidian_open_file","obsidian_patch_active","obsidian_patch_note","obsidian_search","okta_activate_group_rule","okta_activate_user","okta_add_user_to_group","okta_assign_group_to_app","okta_assign_user_role","okta_assign_user_to_app","okta_clear_user_sessions","okta_create_group","okta_create_group_rule","okta_create_user","okta_deactivate_group_rule","okta_deactivate_user","okta_delete_group","okta_delete_group_rule","okta_delete_user","okta_enroll_factor","okta_get_app","okta_get_factor","okta_get_group","okta_get_group_rule","okta_get_logs","okta_get_session","okta_get_user","okta_list_app_groups","okta_list_app_users","okta_list_apps","okta_list_factors","okta_list_group_members","okta_list_group_rules","okta_list_groups","okta_list_user_roles","okta_list_users","okta_remove_group_from_app","okta_remove_user_from_app","okta_remove_user_from_group","okta_remove_user_role","okta_reset_all_factors","okta_reset_factor","okta_reset_password","okta_revoke_session","okta_suspend_user","okta_unsuspend_user","okta_update_group","okta_update_user","onedrive_copy","onedrive_create_folder","onedrive_create_share_link","onedrive_delete","onedrive_download","onedrive_get_drive_info","onedrive_get_item","onedrive_list","onedrive_move","onedrive_search","onedrive_upload","onepassword_create_item","onepassword_delete_item","onepassword_get_item","onepassword_get_item_file","onepassword_get_vault","onepassword_list_items","onepassword_list_vaults","onepassword_replace_item","onepassword_resolve_secret","onepassword_update_item","openai_embeddings","openai_image","outlook_calendar_create_event","outlook_calendar_delete_event","outlook_calendar_get_event","outlook_calendar_list_events","outlook_calendar_respond","outlook_calendar_update_event","outlook_copy","outlook_create_folder","outlook_delete","outlook_draft","outlook_forward","outlook_get_attachment","outlook_list_attachments","outlook_list_folders","outlook_mark_read","outlook_mark_unread","outlook_move","outlook_read","outlook_reply","outlook_reply_all","outlook_search","outlook_send","outlook_update_message","pagerduty_add_note","pagerduty_create_incident","pagerduty_get_incident","pagerduty_get_service","pagerduty_list_escalation_policies","pagerduty_list_incident_alerts","pagerduty_list_incidents","pagerduty_list_oncalls","pagerduty_list_schedules","pagerduty_list_services","pagerduty_list_users","pagerduty_merge_incidents","pagerduty_send_event","pagerduty_snooze_incident","pagerduty_update_incident","parallel_deep_research","parallel_extract","parallel_search","pdl_autocomplete","pdl_bulk_company_enrich","pdl_bulk_person_enrich","pdl_clean_company","pdl_clean_location","pdl_clean_school","pdl_company_enrich","pdl_company_search","pdl_person_enrich","pdl_person_identify","pdl_person_search","perplexity_chat","perplexity_search","persona_approve_inquiry","persona_create_account","persona_create_inquiry","persona_create_report","persona_decline_inquiry","persona_expire_inquiry","persona_generate_inquiry_link","persona_get_account","persona_get_case","persona_get_document","persona_get_inquiry","persona_get_report","persona_get_verification","persona_import_accounts","persona_list_accounts","persona_list_cases","persona_list_inquiries","persona_list_inquiry_templates","persona_list_reports","persona_mark_inquiry_for_review","persona_print_inquiry_pdf","persona_redact_account","persona_redact_inquiry","persona_resume_inquiry","persona_update_account","persona_update_inquiry","pinecone_delete_vectors","pinecone_describe_index","pinecone_describe_index_stats","pinecone_fetch","pinecone_generate_embeddings","pinecone_list_indexes","pinecone_list_vector_ids","pinecone_search_text","pinecone_search_vector","pinecone_update_vector","pinecone_upsert_text","pipedrive_create_activity","pipedrive_create_deal","pipedrive_create_lead","pipedrive_create_project","pipedrive_delete_lead","pipedrive_get_activities","pipedrive_get_all_deals","pipedrive_get_deal","pipedrive_get_files","pipedrive_get_leads","pipedrive_get_mail_messages","pipedrive_get_mail_thread","pipedrive_get_pipeline_deals","pipedrive_get_pipelines","pipedrive_get_projects","pipedrive_update_activity","pipedrive_update_deal","pipedrive_update_lead","pitchbook_company_active_investors","pitchbook_company_bio","pitchbook_company_deal_service_providers","pitchbook_company_deals","pitchbook_company_financials","pitchbook_company_general_service_providers","pitchbook_company_industries","pitchbook_company_investors","pitchbook_company_most_recent_debt_financing","pitchbook_company_most_recent_financials","pitchbook_company_most_recent_financing","pitchbook_company_search","pitchbook_company_similar_companies","pitchbook_company_social_analytics","pitchbook_company_updates","pitchbook_company_vc_exit_predictions","pitchbook_contracts_history","pitchbook_cost_of_calls","pitchbook_credit_history","pitchbook_credit_news","pitchbook_credit_news_bulk","pitchbook_credit_news_most_recent","pitchbook_credit_news_search","pitchbook_deal_bio","pitchbook_deal_cap_table_history","pitchbook_deal_debt_lenders","pitchbook_deal_detailed","pitchbook_deal_investors","pitchbook_deal_multiples","pitchbook_deal_search","pitchbook_deal_service_providers","pitchbook_deal_stock_info","pitchbook_deal_tranche_info","pitchbook_deal_updates","pitchbook_deal_valuation","pitchbook_entity_affiliates","pitchbook_entity_locations","pitchbook_entity_news","pitchbook_entity_people","pitchbook_entity_updates","pitchbook_fund_active_investments","pitchbook_fund_benchmark","pitchbook_fund_bio","pitchbook_fund_cash_flows","pitchbook_fund_commitments","pitchbook_fund_investment_preferences","pitchbook_fund_investments","pitchbook_fund_performance","pitchbook_fund_search","pitchbook_fund_team","pitchbook_fund_updates","pitchbook_investor_active_investments","pitchbook_investor_bio","pitchbook_investor_board_seats","pitchbook_investor_deal_service_providers","pitchbook_investor_funds","pitchbook_investor_general_service_providers","pitchbook_investor_investments","pitchbook_investor_last_closed_fund","pitchbook_investor_preferences","pitchbook_investor_search","pitchbook_investor_updates","pitchbook_limited_partner_actual_allocations","pitchbook_limited_partner_bio","pitchbook_limited_partner_commitment_aggregates","pitchbook_limited_partner_commitment_preferences","pitchbook_limited_partner_commitments_detailed","pitchbook_limited_partner_search","pitchbook_limited_partner_service_providers","pitchbook_limited_partner_target_allocations","pitchbook_limited_partner_updates","pitchbook_lookup_table_structure","pitchbook_lookup_tables","pitchbook_patent_detailed","pitchbook_patent_search","pitchbook_people_search","pitchbook_person_bio","pitchbook_person_contact","pitchbook_person_education_work","pitchbook_sandbox_entities","pitchbook_search","pitchbook_service_provider_bio","pitchbook_service_provider_search","pitchbook_service_provider_updates","pitchbook_serviced_companies","pitchbook_serviced_deals","pitchbook_serviced_funds","pitchbook_serviced_investors","pitchbook_serviced_limited_partners","pitchbook_shared_search","pitchbook_usage_report","polymarket_get_activity","polymarket_get_event","polymarket_get_events","polymarket_get_holders","polymarket_get_last_trade_price","polymarket_get_leaderboard","polymarket_get_market","polymarket_get_markets","polymarket_get_midpoint","polymarket_get_orderbook","polymarket_get_positions","polymarket_get_price","polymarket_get_price_history","polymarket_get_series","polymarket_get_series_by_id","polymarket_get_spread","polymarket_get_tags","polymarket_get_tick_size","polymarket_get_trades","polymarket_search","postgresql_delete","postgresql_execute","postgresql_insert","postgresql_introspect","postgresql_query","postgresql_update","posthog_batch_events","posthog_capture_event","posthog_create_annotation","posthog_create_cohort","posthog_create_dashboard","posthog_create_experiment","posthog_create_feature_flag","posthog_create_insight","posthog_create_survey","posthog_delete_feature_flag","posthog_delete_person","posthog_delete_survey","posthog_evaluate_flags","posthog_get_cohort","posthog_get_dashboard","posthog_get_event_definition","posthog_get_experiment","posthog_get_feature_flag","posthog_get_insight","posthog_get_organization","posthog_get_person","posthog_get_project","posthog_get_property_definition","posthog_get_session_recording","posthog_get_survey","posthog_list_actions","posthog_list_annotations","posthog_list_cohorts","posthog_list_dashboards","posthog_list_event_definitions","posthog_list_experiments","posthog_list_feature_flags","posthog_list_insights","posthog_list_organizations","posthog_list_persons","posthog_list_projects","posthog_list_property_definitions","posthog_list_recording_playlists","posthog_list_session_recordings","posthog_list_surveys","posthog_query","posthog_update_cohort","posthog_update_event_definition","posthog_update_experiment","posthog_update_feature_flag","posthog_update_insight","posthog_update_property_definition","posthog_update_survey","profound_bot_logs","profound_bots_report","profound_category_assets","profound_category_personas","profound_category_prompts","profound_category_tags","profound_category_topics","profound_citation_prompts","profound_citations_report","profound_list_assets","profound_list_categories","profound_list_domains","profound_list_models","profound_list_optimizations","profound_list_personas","profound_list_regions","profound_optimization_analysis","profound_prompt_answers","profound_prompt_volume","profound_query_fanouts","profound_raw_logs","profound_referrals_report","profound_sentiment_report","profound_visibility_report","prospeo_account_information","prospeo_bulk_enrich_company","prospeo_bulk_enrich_person","prospeo_enrich_company","prospeo_enrich_person","prospeo_search_company","prospeo_search_person","prospeo_search_suggestions","pulse_parser","pulse_parser_v2","qdrant_fetch_points","qdrant_search_vector","qdrant_upsert_points","quartr_get_audio","quartr_get_company","quartr_get_event","quartr_get_event_summary","quartr_get_report","quartr_get_slide_deck","quartr_get_transcript","quartr_list_audio","quartr_list_companies","quartr_list_document_types","quartr_list_documents","quartr_list_event_types","quartr_list_events","quartr_list_live_events","quartr_list_reports","quartr_list_slide_decks","quartr_list_transcripts","quiver_image_to_svg","quiver_list_models","quiver_text_to_svg","rabbitmq_create_binding","rabbitmq_create_exchange","rabbitmq_create_policy","rabbitmq_create_queue","rabbitmq_delete_binding","rabbitmq_delete_exchange","rabbitmq_delete_policy","rabbitmq_delete_queue","rabbitmq_get_exchange","rabbitmq_get_messages","rabbitmq_get_overview","rabbitmq_get_queue","rabbitmq_health_check","rabbitmq_list_bindings","rabbitmq_list_channels","rabbitmq_list_connections","rabbitmq_list_consumers","rabbitmq_list_exchange_bindings","rabbitmq_list_exchanges","rabbitmq_list_nodes","rabbitmq_list_policies","rabbitmq_list_queues","rabbitmq_list_vhosts","rabbitmq_publish_message","rabbitmq_purge_queue","railway_create_environment","railway_create_project","railway_create_service","railway_delete_environment","railway_delete_project","railway_delete_service","railway_delete_variable","railway_deploy_service","railway_get_deployment","railway_get_deployment_logs","railway_get_project","railway_list_deployments","railway_list_project_members","railway_list_projects","railway_list_variables","railway_restart_deployment","railway_rollback_deployment","railway_transfer_project","railway_update_project","railway_upsert_variable","rb2b_credit_check","rb2b_email_to_activity","rb2b_hem_to_best_linkedin","rb2b_hem_to_business_profile","rb2b_hem_to_linkedin","rb2b_hem_to_maid","rb2b_ip_to_company","rb2b_ip_to_hem","rb2b_ip_to_maid","rb2b_linkedin_slug_search","rb2b_linkedin_to_best_personal_email","rb2b_linkedin_to_business_profile","rb2b_linkedin_to_hashed_emails","rb2b_linkedin_to_mobile_phone","rb2b_linkedin_to_personal_email","rds_delete","rds_execute","rds_insert","rds_introspect","rds_query","rds_update","reddit_delete","reddit_edit","reddit_get_comments","reddit_get_controversial","reddit_get_info","reddit_get_me","reddit_get_messages","reddit_get_posts","reddit_get_saved","reddit_get_subreddit_info","reddit_get_subreddit_rules","reddit_get_user","reddit_get_user_comments","reddit_get_user_posts","reddit_hide","reddit_hot_posts","reddit_list_my_subreddits","reddit_lock","reddit_mark_all_read","reddit_mark_read","reddit_marknsfw","reddit_mod_approve","reddit_mod_distinguish","reddit_mod_remove","reddit_mod_sticky","reddit_reply","reddit_report","reddit_save","reddit_search","reddit_search_subreddits","reddit_send_message","reddit_submit_post","reddit_subscribe","reddit_unhide","reddit_unlock","reddit_unmarknsfw","reddit_unsave","reddit_vote","redis_command","redis_delete","redis_exists","redis_expire","redis_get","redis_hdel","redis_hget","redis_hgetall","redis_hset","redis_incr","redis_incrby","redis_keys","redis_llen","redis_lpop","redis_lpush","redis_lrange","redis_persist","redis_rpop","redis_rpush","redis_set","redis_setnx","redis_ttl","reducto_parser","reducto_parser_v2","resend_cancel_email","resend_create_audience","resend_create_broadcast","resend_create_contact","resend_delete_audience","resend_delete_contact","resend_get_audience","resend_get_broadcast","resend_get_contact","resend_get_email","resend_list_audiences","resend_list_contacts","resend_list_domains","resend_send","resend_send_broadcast","resend_update_contact","revenuecat_create_purchase","revenuecat_defer_google_subscription","revenuecat_delete_customer","revenuecat_get_customer","revenuecat_grant_entitlement","revenuecat_list_offerings","revenuecat_refund_google_subscription","revenuecat_revoke_entitlement","revenuecat_revoke_google_subscription","revenuecat_update_subscriber_attributes","rippling_bulk_create_custom_object_records","rippling_bulk_delete_custom_object_records","rippling_bulk_update_custom_object_records","rippling_create_business_partner","rippling_create_business_partner_group","rippling_create_custom_app","rippling_create_custom_object","rippling_create_custom_object_field","rippling_create_custom_object_record","rippling_create_custom_page","rippling_create_custom_setting","rippling_create_department","rippling_create_draft_hires","rippling_create_object_category","rippling_create_title","rippling_create_work_location","rippling_delete_business_partner","rippling_delete_business_partner_group","rippling_delete_custom_app","rippling_delete_custom_object","rippling_delete_custom_object_field","rippling_delete_custom_object_record","rippling_delete_custom_page","rippling_delete_custom_setting","rippling_delete_object_category","rippling_delete_title","rippling_delete_work_location","rippling_get_business_partner","rippling_get_business_partner_group","rippling_get_current_user","rippling_get_custom_app","rippling_get_custom_object","rippling_get_custom_object_field","rippling_get_custom_object_record","rippling_get_custom_object_record_by_external_id","rippling_get_custom_page","rippling_get_custom_setting","rippling_get_department","rippling_get_employment_type","rippling_get_job_function","rippling_get_object_category","rippling_get_report_run","rippling_get_supergroup","rippling_get_team","rippling_get_title","rippling_get_user","rippling_get_work_location","rippling_get_worker","rippling_list_business_partner_groups","rippling_list_business_partners","rippling_list_companies","rippling_list_custom_apps","rippling_list_custom_fields","rippling_list_custom_object_fields","rippling_list_custom_object_records","rippling_list_custom_objects","rippling_list_custom_pages","rippling_list_custom_settings","rippling_list_departments","rippling_list_employment_types","rippling_list_entitlements","rippling_list_job_functions","rippling_list_object_categories","rippling_list_supergroup_exclusion_members","rippling_list_supergroup_inclusion_members","rippling_list_supergroup_members","rippling_list_supergroups","rippling_list_teams","rippling_list_titles","rippling_list_users","rippling_list_work_locations","rippling_list_workers","rippling_query_custom_object_records","rippling_trigger_report_run","rippling_update_custom_app","rippling_update_custom_object","rippling_update_custom_object_field","rippling_update_custom_object_record","rippling_update_custom_page","rippling_update_custom_setting","rippling_update_department","rippling_update_object_category","rippling_update_supergroup_exclusion_members","rippling_update_supergroup_inclusion_members","rippling_update_title","rippling_update_work_location","rocketlane_add_field_option","rocketlane_add_project_members","rocketlane_add_task_assignees","rocketlane_add_task_dependencies","rocketlane_add_task_followers","rocketlane_archive_project","rocketlane_assign_placeholders","rocketlane_create_field","rocketlane_create_phase","rocketlane_create_project","rocketlane_create_space","rocketlane_create_space_document","rocketlane_create_task","rocketlane_create_time_entry","rocketlane_create_time_off","rocketlane_delete_field","rocketlane_delete_phase","rocketlane_delete_project","rocketlane_delete_space","rocketlane_delete_space_document","rocketlane_delete_task","rocketlane_delete_time_entry","rocketlane_delete_time_off","rocketlane_get_field","rocketlane_get_invoice","rocketlane_get_invoice_line_items","rocketlane_get_invoice_payments","rocketlane_get_phase","rocketlane_get_project","rocketlane_get_space","rocketlane_get_space_document","rocketlane_get_task","rocketlane_get_time_entry","rocketlane_get_time_off","rocketlane_get_user","rocketlane_import_template","rocketlane_list_fields","rocketlane_list_invoices","rocketlane_list_phases","rocketlane_list_placeholders","rocketlane_list_projects","rocketlane_list_resource_allocations","rocketlane_list_space_documents","rocketlane_list_spaces","rocketlane_list_tasks","rocketlane_list_time_entries","rocketlane_list_time_entry_categories","rocketlane_list_time_offs","rocketlane_list_users","rocketlane_move_task_to_phase","rocketlane_remove_project_members","rocketlane_remove_task_assignees","rocketlane_remove_task_dependencies","rocketlane_remove_task_followers","rocketlane_search_time_entries","rocketlane_unassign_placeholders","rocketlane_update_field","rocketlane_update_field_option","rocketlane_update_phase","rocketlane_update_project","rocketlane_update_space","rocketlane_update_space_document","rocketlane_update_task","rocketlane_update_time_entry","rootly_acknowledge_alert","rootly_add_incident_event","rootly_add_subscribers","rootly_assign_incident_role","rootly_create_action_item","rootly_create_alert","rootly_create_incident","rootly_create_status_page_event","rootly_delete_action_item","rootly_delete_incident","rootly_escalate_alert","rootly_get_alert","rootly_get_incident","rootly_list_action_items","rootly_list_alerts","rootly_list_causes","rootly_list_environments","rootly_list_escalation_policies","rootly_list_functionalities","rootly_list_incident_events","rootly_list_incident_roles","rootly_list_incident_types","rootly_list_incidents","rootly_list_on_calls","rootly_list_playbooks","rootly_list_retrospectives","rootly_list_schedules","rootly_list_services","rootly_list_severities","rootly_list_teams","rootly_list_users","rootly_mitigate_incident","rootly_remove_subscribers","rootly_resolve_alert","rootly_resolve_incident","rootly_run_workflow","rootly_snooze_alert","rootly_unassign_incident_role","rootly_update_action_item","rootly_update_alert","rootly_update_incident","s3_copy_object","s3_create_bucket","s3_delete_bucket","s3_delete_object","s3_delete_objects","s3_get_object","s3_head_object","s3_list_buckets","s3_list_objects","s3_presigned_url","s3_put_object","sailpoint_approve_access_request","sailpoint_cancel_access_request","sailpoint_decide_certification_review_items","sailpoint_get_access_profile","sailpoint_get_access_profile_entitlements","sailpoint_get_access_request_config","sailpoint_get_access_request_status","sailpoint_get_account","sailpoint_get_account_activity","sailpoint_get_account_entitlements","sailpoint_get_account_selections","sailpoint_get_campaign","sailpoint_get_certification","sailpoint_get_entitlement","sailpoint_get_entitlement_request_config","sailpoint_get_identity","sailpoint_get_role","sailpoint_get_role_entitlements","sailpoint_get_source","sailpoint_get_task_status","sailpoint_list_access_profiles","sailpoint_list_account_activities","sailpoint_list_accounts","sailpoint_list_campaigns","sailpoint_list_certification_review_items","sailpoint_list_certifications","sailpoint_list_entitlements","sailpoint_list_identities","sailpoint_list_identity_entitlements","sailpoint_list_pending_access_request_approvals","sailpoint_list_roles","sailpoint_list_sources","sailpoint_load_accounts","sailpoint_load_entitlements","sailpoint_reject_access_request","sailpoint_request_access","sailpoint_search","sailpoint_search_aggregate","sailpoint_search_count","sailpoint_sign_off_certification","salesforce_create_account","salesforce_create_case","salesforce_create_contact","salesforce_create_custom_field","salesforce_create_custom_object","salesforce_create_lead","salesforce_create_opportunity","salesforce_create_task","salesforce_delete_account","salesforce_delete_case","salesforce_delete_contact","salesforce_delete_custom_field","salesforce_delete_lead","salesforce_delete_opportunity","salesforce_delete_task","salesforce_describe_object","salesforce_get_accounts","salesforce_get_cases","salesforce_get_contacts","salesforce_get_dashboard","salesforce_get_leads","salesforce_get_opportunities","salesforce_get_report","salesforce_get_tasks","salesforce_list_dashboards","salesforce_list_objects","salesforce_list_report_types","salesforce_list_reports","salesforce_query","salesforce_query_more","salesforce_refresh_dashboard","salesforce_run_report","salesforce_tooling_query","salesforce_update_account","salesforce_update_case","salesforce_update_contact","salesforce_update_custom_field","salesforce_update_lead","salesforce_update_opportunity","salesforce_update_task","sap_concur_approve_expense_report","sap_concur_associate_attendees","sap_concur_create_cash_advance","sap_concur_create_expected_expense","sap_concur_create_expense_report","sap_concur_create_list_item","sap_concur_create_purchase_request","sap_concur_create_quick_expense","sap_concur_create_quick_expense_with_image","sap_concur_create_report_comment","sap_concur_create_travel_request","sap_concur_create_user","sap_concur_delete_expected_expense","sap_concur_delete_expense","sap_concur_delete_expense_report","sap_concur_delete_list_item","sap_concur_delete_travel_request","sap_concur_delete_user","sap_concur_get_allocation","sap_concur_get_budget","sap_concur_get_cash_advance","sap_concur_get_expected_expense","sap_concur_get_expense","sap_concur_get_expense_report","sap_concur_get_itemizations","sap_concur_get_itinerary","sap_concur_get_list","sap_concur_get_list_item","sap_concur_get_purchase_request","sap_concur_get_receipt","sap_concur_get_receipt_status","sap_concur_get_request_cash_advance","sap_concur_get_travel_profile","sap_concur_get_travel_request","sap_concur_get_user","sap_concur_issue_cash_advance","sap_concur_list_allocations","sap_concur_list_attendee_associations","sap_concur_list_budget_categories","sap_concur_list_budgets","sap_concur_list_exceptions","sap_concur_list_expected_expenses","sap_concur_list_expense_reports","sap_concur_list_expenses","sap_concur_list_itineraries","sap_concur_list_list_items","sap_concur_list_lists","sap_concur_list_receipts","sap_concur_list_report_comments","sap_concur_list_reports_to_approve","sap_concur_list_travel_profiles_summary","sap_concur_list_travel_request_comments","sap_concur_list_travel_requests","sap_concur_list_users","sap_concur_move_travel_request","sap_concur_recall_expense_report","sap_concur_remove_all_attendees","sap_concur_search_locations","sap_concur_search_users","sap_concur_send_back_expense_report","sap_concur_submit_expense_report","sap_concur_update_allocation","sap_concur_update_expected_expense","sap_concur_update_expense","sap_concur_update_expense_report","sap_concur_update_list_item","sap_concur_update_travel_request","sap_concur_update_user","sap_concur_upload_exchange_rates","sap_concur_upload_receipt_image","sap_s4hana_create_business_partner","sap_s4hana_create_purchase_order","sap_s4hana_create_purchase_requisition","sap_s4hana_create_sales_order","sap_s4hana_delete_sales_order","sap_s4hana_get_billing_document","sap_s4hana_get_business_partner","sap_s4hana_get_customer","sap_s4hana_get_inbound_delivery","sap_s4hana_get_material_document","sap_s4hana_get_outbound_delivery","sap_s4hana_get_product","sap_s4hana_get_purchase_order","sap_s4hana_get_purchase_requisition","sap_s4hana_get_sales_order","sap_s4hana_get_supplier","sap_s4hana_get_supplier_invoice","sap_s4hana_list_billing_documents","sap_s4hana_list_business_partners","sap_s4hana_list_customers","sap_s4hana_list_inbound_deliveries","sap_s4hana_list_material_documents","sap_s4hana_list_material_stock","sap_s4hana_list_outbound_deliveries","sap_s4hana_list_products","sap_s4hana_list_purchase_orders","sap_s4hana_list_purchase_requisitions","sap_s4hana_list_sales_orders","sap_s4hana_list_supplier_invoices","sap_s4hana_list_suppliers","sap_s4hana_odata_query","sap_s4hana_update_business_partner","sap_s4hana_update_customer","sap_s4hana_update_product","sap_s4hana_update_purchase_order","sap_s4hana_update_purchase_requisition","sap_s4hana_update_sales_order","sap_s4hana_update_supplier","search_tool","secrets_manager_create_secret","secrets_manager_delete_secret","secrets_manager_describe_secret","secrets_manager_get_secret","secrets_manager_list_secrets","secrets_manager_restore_secret","secrets_manager_rotate_secret","secrets_manager_tag_resource","secrets_manager_untag_resource","secrets_manager_update_secret","semrush_backlinks","semrush_backlinks_anchors","semrush_backlinks_competitors","semrush_backlinks_geo_distribution","semrush_backlinks_indexed_pages","semrush_backlinks_overview","semrush_backlinks_tld_distribution","semrush_batch_keyword_overview","semrush_broad_match_keywords","semrush_domain_ad_copies","semrush_domain_ad_history","semrush_domain_organic_competitors","semrush_domain_organic_keywords","semrush_domain_overview","semrush_domain_overview_all","semrush_domain_overview_history","semrush_domain_paid_competitors","semrush_domain_paid_keywords","semrush_domain_pla_copies","semrush_domain_pla_keywords","semrush_domain_vs_domain","semrush_keyword_ad_history","semrush_keyword_difficulty","semrush_keyword_overview","semrush_keyword_overview_all","semrush_keyword_questions","semrush_organic_results","semrush_paid_results","semrush_referring_domains","semrush_referring_ips","semrush_related_keywords","semrush_subdomain_ad_copies","semrush_subdomain_organic_keywords","semrush_subdomain_overview","semrush_subdomain_overview_all","semrush_subdomain_overview_history","semrush_subdomain_paid_keywords","semrush_top_domains","semrush_url_organic_keywords","semrush_url_overview","semrush_url_overview_all","semrush_url_overview_history","semrush_url_paid_keywords","semrush_winners_and_losers","sendblue_evaluate_service","sendblue_get_message","sendblue_send_group_message","sendblue_send_message","sendblue_send_typing_indicator","sendgrid_add_contact","sendgrid_add_contacts_to_list","sendgrid_create_list","sendgrid_create_template","sendgrid_create_template_version","sendgrid_delete_contacts","sendgrid_delete_list","sendgrid_delete_template","sendgrid_get_contact","sendgrid_get_list","sendgrid_get_template","sendgrid_list_all_lists","sendgrid_list_templates","sendgrid_remove_contacts_from_list","sendgrid_search_contacts","sendgrid_send_mail","sentry_events_get","sentry_events_list","sentry_issues_get","sentry_issues_list","sentry_issues_update","sentry_projects_create","sentry_projects_get","sentry_projects_list","sentry_projects_update","sentry_releases_create","sentry_releases_deploy","sentry_releases_list","sentry_teams_list","serper_search","servicenow_add_incident_comment","servicenow_aggregate","servicenow_close_incident","servicenow_create_change_request","servicenow_create_incident","servicenow_create_record","servicenow_delete_record","servicenow_download_attachment","servicenow_find_user","servicenow_get_change_next_states","servicenow_get_change_request","servicenow_get_ci","servicenow_get_incident","servicenow_get_knowledge_article","servicenow_get_requested_item","servicenow_list_approvals","servicenow_list_attachments","servicenow_list_catalog_items","servicenow_list_change_requests","servicenow_list_change_tasks","servicenow_list_ci_relationships","servicenow_list_group_members","servicenow_list_incidents","servicenow_list_requested_items","servicenow_order_catalog_item","servicenow_read_record","servicenow_resolve_incident","servicenow_search_cis","servicenow_search_knowledge","servicenow_update_approval","servicenow_update_change_request","servicenow_update_change_state","servicenow_update_incident","servicenow_update_record","servicenow_upload_attachment","ses_create_configuration_set","ses_create_email_identity","ses_create_template","ses_delete_email_identity","ses_delete_suppressed_destination","ses_delete_template","ses_get_account","ses_get_email_identity","ses_get_suppressed_destination","ses_get_template","ses_list_identities","ses_list_suppressed_destinations","ses_list_templates","ses_put_suppressed_destination","ses_send_bulk_email","ses_send_custom_verification_email","ses_send_email","ses_send_templated_email","ses_update_template","sftp_delete","sftp_download","sftp_list","sftp_mkdir","sftp_upload","sharepoint_add_list_items","sharepoint_create_list","sharepoint_create_page","sharepoint_delete_file","sharepoint_delete_list_item","sharepoint_delete_page","sharepoint_download_file","sharepoint_get_drive_item","sharepoint_get_list","sharepoint_get_list_item","sharepoint_list_sites","sharepoint_publish_page","sharepoint_read_page","sharepoint_update_list","sharepoint_update_page","sharepoint_upload_file","shopify_adjust_inventory","shopify_cancel_order","shopify_create_customer","shopify_create_fulfillment","shopify_create_product","shopify_delete_customer","shopify_delete_product","shopify_get_collection","shopify_get_customer","shopify_get_inventory_level","shopify_get_order","shopify_get_product","shopify_list_collections","shopify_list_customers","shopify_list_inventory_items","shopify_list_locations","shopify_list_orders","shopify_list_products","shopify_update_customer","shopify_update_order","shopify_update_product","similarweb_bounce_rate","similarweb_page_views","similarweb_pages_per_visit","similarweb_traffic_visits","similarweb_visit_duration","similarweb_website_overview","sixtyfour_enrich_company","sixtyfour_enrich_lead","sixtyfour_find_email","sixtyfour_find_phone","slack_add_reaction","slack_archive_conversation","slack_canvas","slack_create_channel_canvas","slack_create_conversation","slack_delete_canvas","slack_delete_message","slack_delete_scheduled_message","slack_download","slack_edit_canvas","slack_ephemeral_message","slack_get_canvas","slack_get_channel_history","slack_get_channel_info","slack_get_message","slack_get_permalink","slack_get_thread","slack_get_thread_replies","slack_get_user","slack_get_user_presence","slack_invite_to_conversation","slack_list_canvases","slack_list_channels","slack_list_members","slack_list_scheduled_messages","slack_list_users","slack_lookup_canvas_sections","slack_message","slack_message_reader","slack_open_view","slack_publish_view","slack_push_view","slack_remove_reaction","slack_rename_agent_session_v2","slack_rename_conversation","slack_schedule_message","slack_set_agent_session_status_v2","slack_set_conversation_purpose","slack_set_conversation_topic","slack_set_status","slack_set_suggested_prompts","slack_set_suggested_prompts_v2","slack_set_title","slack_update_message","slack_update_view","smartlead_add_email_accounts_to_campaign","smartlead_add_leads_to_campaign","smartlead_create_campaign","smartlead_create_lead_list","smartlead_delete_campaign","smartlead_delete_campaign_webhook","smartlead_delete_lead_from_campaign","smartlead_delete_lead_list","smartlead_duplicate_campaign","smartlead_export_campaign_leads","smartlead_get_campaign","smartlead_get_campaign_analytics","smartlead_get_campaign_analytics_by_date","smartlead_get_campaign_lead_statistics","smartlead_get_campaign_mailbox_statistics","smartlead_get_campaign_sequences","smartlead_get_campaign_statistics","smartlead_get_campaign_top_level_analytics_by_date","smartlead_get_campaign_webhook_summary","smartlead_get_lead_by_email","smartlead_get_lead_by_id","smartlead_get_lead_list","smartlead_get_lead_message_history","smartlead_list_campaign_email_accounts","smartlead_list_campaign_leads","smartlead_list_campaign_webhooks","smartlead_list_campaigns","smartlead_list_clients","smartlead_list_email_accounts","smartlead_list_inbox_replies","smartlead_list_lead_activities","smartlead_list_lead_categories","smartlead_list_lead_lists","smartlead_mark_lead_complete","smartlead_pause_lead","smartlead_remove_email_accounts_from_campaign","smartlead_resume_lead","smartlead_save_campaign_sequences","smartlead_unsubscribe_lead_from_campaign","smartlead_unsubscribe_lead_globally","smartlead_update_campaign_schedule","smartlead_update_campaign_settings","smartlead_update_campaign_status","smartlead_update_lead","smartlead_update_lead_category","smartlead_update_lead_list","smartlead_upsert_campaign_webhook","sms_send","smtp_send_mail","snowflake_alter_warehouse","snowflake_call_procedure","snowflake_cancel_statement","snowflake_cancel_task_run","snowflake_delete_rows","snowflake_execute_sql","snowflake_get_statement","snowflake_get_task","snowflake_get_task_run","snowflake_get_task_run_output","snowflake_get_warehouse","snowflake_insert_rows","snowflake_introspect_schema","snowflake_list_copy_history","snowflake_list_databases","snowflake_list_query_history","snowflake_list_schemas","snowflake_list_tables","snowflake_list_task_runs","snowflake_list_tasks","snowflake_list_warehouses","snowflake_load_data","snowflake_resume_task","snowflake_resume_warehouse","snowflake_run_task","snowflake_suspend_task","snowflake_suspend_warehouse","snowflake_unload_data","snowflake_update_rows","snowflake_upsert_rows","splunk_cancel_search_job","splunk_create_search_job","splunk_dispatch_saved_search","splunk_get_fired_alerts","splunk_get_saved_search","splunk_get_search_job","splunk_get_search_results","splunk_list_apps","splunk_list_fired_alerts","splunk_list_indexes","splunk_list_saved_searches","splunk_run_search","sportmonks_core_get_cities","sportmonks_core_get_city","sportmonks_core_get_continent","sportmonks_core_get_continents","sportmonks_core_get_countries","sportmonks_core_get_country","sportmonks_core_get_entity_filters","sportmonks_core_get_my_usage","sportmonks_core_get_region","sportmonks_core_get_regions","sportmonks_core_get_timezones","sportmonks_core_get_type","sportmonks_core_get_type_by_entity","sportmonks_core_get_types","sportmonks_core_search_cities","sportmonks_core_search_countries","sportmonks_core_search_regions","sportmonks_football_expected_by_player","sportmonks_football_expected_by_team","sportmonks_football_get_all_commentaries","sportmonks_football_get_all_fixtures","sportmonks_football_get_all_players","sportmonks_football_get_all_rivals","sportmonks_football_get_all_teams","sportmonks_football_get_all_transfer_rumours","sportmonks_football_get_all_transfers","sportmonks_football_get_brackets_by_season","sportmonks_football_get_coach","sportmonks_football_get_coaches","sportmonks_football_get_coaches_by_country","sportmonks_football_get_commentaries_by_fixture","sportmonks_football_get_current_leagues_by_team","sportmonks_football_get_expected_lineups_by_player","sportmonks_football_get_expected_lineups_by_team","sportmonks_football_get_extended_team_squad","sportmonks_football_get_fixture","sportmonks_football_get_fixtures_by_date","sportmonks_football_get_fixtures_by_date_range","sportmonks_football_get_fixtures_by_date_range_for_team","sportmonks_football_get_fixtures_by_ids","sportmonks_football_get_grouped_standings_by_round","sportmonks_football_get_head_to_head","sportmonks_football_get_inplay_livescores","sportmonks_football_get_latest_coaches","sportmonks_football_get_latest_fixtures","sportmonks_football_get_latest_livescores","sportmonks_football_get_latest_players","sportmonks_football_get_latest_totw","sportmonks_football_get_latest_transfers","sportmonks_football_get_league","sportmonks_football_get_leagues","sportmonks_football_get_leagues_by_country","sportmonks_football_get_leagues_by_date","sportmonks_football_get_leagues_by_team","sportmonks_football_get_live_leagues","sportmonks_football_get_live_probabilities","sportmonks_football_get_live_probabilities_by_fixture","sportmonks_football_get_live_standings_by_league","sportmonks_football_get_livescores","sportmonks_football_get_match_facts","sportmonks_football_get_match_facts_by_date_range","sportmonks_football_get_match_facts_by_fixture","sportmonks_football_get_match_facts_by_league","sportmonks_football_get_past_fixtures_by_tv_station","sportmonks_football_get_player","sportmonks_football_get_players_by_country","sportmonks_football_get_postmatch_news","sportmonks_football_get_postmatch_news_by_season","sportmonks_football_get_predictability_by_league","sportmonks_football_get_prematch_news","sportmonks_football_get_prematch_news_by_season","sportmonks_football_get_prematch_news_upcoming","sportmonks_football_get_probabilities","sportmonks_football_get_probabilities_by_fixture","sportmonks_football_get_referee","sportmonks_football_get_referees","sportmonks_football_get_referees_by_country","sportmonks_football_get_referees_by_season","sportmonks_football_get_rivals_by_team","sportmonks_football_get_round","sportmonks_football_get_round_statistics","sportmonks_football_get_rounds","sportmonks_football_get_rounds_by_season","sportmonks_football_get_schedules_by_season","sportmonks_football_get_schedules_by_season_and_team","sportmonks_football_get_schedules_by_team","sportmonks_football_get_season","sportmonks_football_get_seasons","sportmonks_football_get_seasons_by_team","sportmonks_football_get_stage","sportmonks_football_get_stage_statistics","sportmonks_football_get_stages","sportmonks_football_get_stages_by_season","sportmonks_football_get_standing_corrections_by_season","sportmonks_football_get_standings","sportmonks_football_get_standings_by_round","sportmonks_football_get_standings_by_season","sportmonks_football_get_state","sportmonks_football_get_states","sportmonks_football_get_team","sportmonks_football_get_team_rankings","sportmonks_football_get_team_rankings_by_date","sportmonks_football_get_team_rankings_by_team","sportmonks_football_get_team_squad","sportmonks_football_get_team_squad_by_season","sportmonks_football_get_teams_by_country","sportmonks_football_get_teams_by_season","sportmonks_football_get_topscorers_by_season","sportmonks_football_get_topscorers_by_stage","sportmonks_football_get_totw","sportmonks_football_get_totw_by_round","sportmonks_football_get_transfer","sportmonks_football_get_transfer_rumour","sportmonks_football_get_transfer_rumours_between_dates","sportmonks_football_get_transfer_rumours_by_player","sportmonks_football_get_transfer_rumours_by_team","sportmonks_football_get_transfers_between_dates","sportmonks_football_get_transfers_by_player","sportmonks_football_get_transfers_by_team","sportmonks_football_get_tv_station","sportmonks_football_get_tv_stations","sportmonks_football_get_tv_stations_by_fixture","sportmonks_football_get_upcoming_fixtures_by_market","sportmonks_football_get_upcoming_fixtures_by_tv_station","sportmonks_football_get_value_bets","sportmonks_football_get_value_bets_by_fixture","sportmonks_football_get_venue","sportmonks_football_get_venues","sportmonks_football_get_venues_by_season","sportmonks_football_search_coaches","sportmonks_football_search_fixtures","sportmonks_football_search_leagues","sportmonks_football_search_players","sportmonks_football_search_referees","sportmonks_football_search_rounds","sportmonks_football_search_seasons","sportmonks_football_search_stages","sportmonks_football_search_teams","sportmonks_football_search_venues","sportmonks_motorsport_get_all_fixtures","sportmonks_motorsport_get_current_leagues_by_team","sportmonks_motorsport_get_driver","sportmonks_motorsport_get_driver_standings","sportmonks_motorsport_get_driver_standings_by_season","sportmonks_motorsport_get_drivers","sportmonks_motorsport_get_drivers_by_country","sportmonks_motorsport_get_drivers_by_season","sportmonks_motorsport_get_fixture","sportmonks_motorsport_get_fixtures_by_date","sportmonks_motorsport_get_fixtures_by_date_range","sportmonks_motorsport_get_fixtures_by_ids","sportmonks_motorsport_get_laps_by_fixture","sportmonks_motorsport_get_laps_by_fixture_and_driver","sportmonks_motorsport_get_laps_by_fixture_and_lap","sportmonks_motorsport_get_latest_laps_by_fixture","sportmonks_motorsport_get_latest_pitstops_by_fixture","sportmonks_motorsport_get_latest_stints_by_fixture","sportmonks_motorsport_get_latest_updated_drivers","sportmonks_motorsport_get_latest_updated_fixtures","sportmonks_motorsport_get_league","sportmonks_motorsport_get_leagues","sportmonks_motorsport_get_leagues_by_country","sportmonks_motorsport_get_leagues_by_date","sportmonks_motorsport_get_leagues_by_live","sportmonks_motorsport_get_leagues_by_team","sportmonks_motorsport_get_livescores","sportmonks_motorsport_get_pitstops_by_fixture","sportmonks_motorsport_get_pitstops_by_fixture_and_driver","sportmonks_motorsport_get_pitstops_by_fixture_and_lap","sportmonks_motorsport_get_race_results_by_season_and_driver","sportmonks_motorsport_get_race_results_by_season_and_team","sportmonks_motorsport_get_schedules_by_season","sportmonks_motorsport_get_season","sportmonks_motorsport_get_seasons","sportmonks_motorsport_get_stage","sportmonks_motorsport_get_stages","sportmonks_motorsport_get_stages_by_season","sportmonks_motorsport_get_state","sportmonks_motorsport_get_states","sportmonks_motorsport_get_stints_by_fixture","sportmonks_motorsport_get_stints_by_fixture_and_driver","sportmonks_motorsport_get_stints_by_fixture_and_stint","sportmonks_motorsport_get_team","sportmonks_motorsport_get_team_standings","sportmonks_motorsport_get_team_standings_by_season","sportmonks_motorsport_get_teams","sportmonks_motorsport_get_teams_by_country","sportmonks_motorsport_get_teams_by_season","sportmonks_motorsport_get_venue","sportmonks_motorsport_get_venues","sportmonks_motorsport_get_venues_by_season","sportmonks_motorsport_search_drivers","sportmonks_motorsport_search_leagues","sportmonks_motorsport_search_stages","sportmonks_motorsport_search_teams","sportmonks_motorsport_search_venues","sportmonks_odds_get_all_historical_odds","sportmonks_odds_get_all_inplay_odds","sportmonks_odds_get_all_pre_match_odds","sportmonks_odds_get_all_premium_odds","sportmonks_odds_get_bookmaker","sportmonks_odds_get_bookmaker_event_ids_by_fixture","sportmonks_odds_get_bookmakers","sportmonks_odds_get_bookmakers_by_fixture","sportmonks_odds_get_inplay_odds_by_fixture","sportmonks_odds_get_inplay_odds_by_fixture_and_bookmaker","sportmonks_odds_get_inplay_odds_by_fixture_and_market","sportmonks_odds_get_last_updated_inplay_odds","sportmonks_odds_get_last_updated_pre_match_odds","sportmonks_odds_get_market","sportmonks_odds_get_markets","sportmonks_odds_get_pre_match_odds_by_fixture","sportmonks_odds_get_pre_match_odds_by_fixture_and_bookmaker","sportmonks_odds_get_pre_match_odds_by_fixture_and_market","sportmonks_odds_get_premium_odds_by_fixture","sportmonks_odds_get_premium_odds_by_fixture_and_bookmaker","sportmonks_odds_get_premium_odds_by_fixture_and_market","sportmonks_odds_get_updated_historical_odds_between","sportmonks_odds_get_updated_premium_odds_between","sportmonks_odds_search_bookmakers","sportmonks_odds_search_markets","spotify_add_playlist_cover","spotify_add_to_queue","spotify_add_tracks_to_playlist","spotify_check_following","spotify_check_playlist_followers","spotify_check_saved_albums","spotify_check_saved_audiobooks","spotify_check_saved_episodes","spotify_check_saved_shows","spotify_check_saved_tracks","spotify_create_playlist","spotify_follow_artists","spotify_follow_playlist","spotify_get_album","spotify_get_album_tracks","spotify_get_albums","spotify_get_artist","spotify_get_artist_albums","spotify_get_artist_top_tracks","spotify_get_artists","spotify_get_audiobook","spotify_get_audiobook_chapters","spotify_get_audiobooks","spotify_get_categories","spotify_get_current_user","spotify_get_currently_playing","spotify_get_devices","spotify_get_episode","spotify_get_episodes","spotify_get_followed_artists","spotify_get_markets","spotify_get_new_releases","spotify_get_playback_state","spotify_get_playlist","spotify_get_playlist_cover","spotify_get_playlist_tracks","spotify_get_queue","spotify_get_recently_played","spotify_get_saved_albums","spotify_get_saved_audiobooks","spotify_get_saved_episodes","spotify_get_saved_shows","spotify_get_saved_tracks","spotify_get_show","spotify_get_show_episodes","spotify_get_shows","spotify_get_top_artists","spotify_get_top_tracks","spotify_get_track","spotify_get_tracks","spotify_get_user_playlists","spotify_get_user_profile","spotify_pause","spotify_play","spotify_remove_saved_albums","spotify_remove_saved_audiobooks","spotify_remove_saved_episodes","spotify_remove_saved_shows","spotify_remove_saved_tracks","spotify_remove_tracks_from_playlist","spotify_reorder_playlist_items","spotify_replace_playlist_items","spotify_save_albums","spotify_save_audiobooks","spotify_save_episodes","spotify_save_shows","spotify_save_tracks","spotify_search","spotify_seek","spotify_set_repeat","spotify_set_shuffle","spotify_set_volume","spotify_skip_next","spotify_skip_previous","spotify_transfer_playback","spotify_unfollow_artists","spotify_unfollow_playlist","spotify_update_playlist","sqs_send","square_batch_retrieve_inventory_counts","square_cancel_invoice","square_cancel_payment","square_complete_payment","square_create_catalog_image","square_create_customer","square_create_invoice","square_create_order","square_create_payment","square_delete_catalog_object","square_delete_customer","square_delete_invoice","square_get_catalog_object","square_get_customer","square_get_invoice","square_get_location","square_get_order","square_get_payment","square_get_refund","square_list_catalog","square_list_customers","square_list_invoices","square_list_locations","square_list_payments","square_list_refunds","square_pay_order","square_publish_invoice","square_refund_payment","square_search_catalog_objects","square_search_customers","square_search_invoices","square_search_orders","square_update_customer","square_upsert_catalog_object","ssh_check_command_exists","ssh_check_file_exists","ssh_create_directory","ssh_delete_file","ssh_download_file","ssh_execute_command","ssh_execute_script","ssh_get_system_info","ssh_list_directory","ssh_move_rename","ssh_read_file_content","ssh_upload_file","ssh_write_file_content","stagehand_agent","stagehand_extract","stripe_cancel_payment_intent","stripe_cancel_subscription","stripe_capture_charge","stripe_capture_payment_intent","stripe_confirm_payment_intent","stripe_create_charge","stripe_create_customer","stripe_create_invoice","stripe_create_payment_intent","stripe_create_price","stripe_create_product","stripe_create_subscription","stripe_delete_customer","stripe_delete_invoice","stripe_delete_product","stripe_finalize_invoice","stripe_list_charges","stripe_list_customers","stripe_list_events","stripe_list_invoices","stripe_list_payment_intents","stripe_list_prices","stripe_list_products","stripe_list_subscriptions","stripe_pay_invoice","stripe_resume_subscription","stripe_retrieve_charge","stripe_retrieve_customer","stripe_retrieve_event","stripe_retrieve_invoice","stripe_retrieve_payment_intent","stripe_retrieve_price","stripe_retrieve_product","stripe_retrieve_subscription","stripe_search_charges","stripe_search_customers","stripe_search_invoices","stripe_search_payment_intents","stripe_search_prices","stripe_search_products","stripe_search_subscriptions","stripe_send_invoice","stripe_update_charge","stripe_update_customer","stripe_update_invoice","stripe_update_payment_intent","stripe_update_price","stripe_update_product","stripe_update_subscription","stripe_void_invoice","sts_assume_role","sts_assume_role_with_saml","sts_assume_role_with_web_identity","sts_get_access_key_info","sts_get_caller_identity","sts_get_session_token","stt_assemblyai","stt_assemblyai_v2","stt_deepgram","stt_deepgram_v2","stt_elevenlabs","stt_elevenlabs_v2","stt_gemini","stt_gemini_v2","stt_whisper","stt_whisper_v2","supabase_count","supabase_delete","supabase_get_row","supabase_insert","supabase_introspect","supabase_invoke_function","supabase_query","supabase_rpc","supabase_storage_copy","supabase_storage_create_bucket","supabase_storage_create_signed_upload_url","supabase_storage_create_signed_url","supabase_storage_delete","supabase_storage_delete_bucket","supabase_storage_download","supabase_storage_empty_bucket","supabase_storage_get_public_url","supabase_storage_list","supabase_storage_list_buckets","supabase_storage_move","supabase_storage_update_bucket","supabase_storage_upload","supabase_text_search","supabase_update","supabase_upsert","supabase_vector_search","table_batch_insert_rows","table_create","table_delete_row","table_delete_rows_by_filter","table_get_row","table_get_schema","table_insert_row","table_list","table_query_rows","table_query_rows_v2","table_update_row","table_update_rows_by_filter","table_upsert_row","tailscale_authorize_device","tailscale_create_auth_key","tailscale_delete_auth_key","tailscale_delete_device","tailscale_delete_user","tailscale_expire_device_key","tailscale_get_acl","tailscale_get_auth_key","tailscale_get_device","tailscale_get_device_routes","tailscale_get_dns_preferences","tailscale_get_dns_searchpaths","tailscale_list_auth_keys","tailscale_list_devices","tailscale_list_dns_nameservers","tailscale_list_users","tailscale_set_acl","tailscale_set_device_routes","tailscale_set_device_tags","tailscale_set_dns_nameservers","tailscale_set_dns_preferences","tailscale_set_dns_searchpaths","tailscale_suspend_user","tailscale_update_device_key","tavily_crawl","tavily_extract","tavily_map","tavily_search","telegram_copy_message","telegram_delete_message","telegram_edit_message_text","telegram_forward_message","telegram_get_chat","telegram_get_chat_member","telegram_message","telegram_pin_message","telegram_send_animation","telegram_send_audio","telegram_send_chat_action","telegram_send_contact","telegram_send_document","telegram_send_location","telegram_send_photo","telegram_send_poll","telegram_send_video","telegram_set_message_reaction","telegram_unpin_message","temporal_cancel_workflow","temporal_count_workflows","temporal_create_schedule","temporal_delete_schedule","temporal_describe_schedule","temporal_describe_task_queue","temporal_describe_workflow","temporal_get_workflow_history","temporal_list_schedules","temporal_list_workflows","temporal_pause_schedule","temporal_query_workflow","temporal_reset_workflow","temporal_signal_with_start","temporal_signal_workflow","temporal_start_workflow","temporal_terminate_workflow","temporal_trigger_schedule","temporal_unpause_schedule","temporal_update_workflow","textract_analyze_expense","textract_analyze_id","textract_parser","textract_parser_v2","thinking_tool","thrive_add_audience_managers","thrive_add_audience_members","thrive_add_user_tags","thrive_create_assignment","thrive_create_audience","thrive_create_completion","thrive_create_user","thrive_delete_assignment","thrive_delete_audience","thrive_delete_user","thrive_get_activity","thrive_get_assignment","thrive_get_audience","thrive_get_completion","thrive_get_content","thrive_get_cpd_category","thrive_get_cpd_entry","thrive_get_cpd_requirement","thrive_get_enrolment","thrive_get_skill_levels","thrive_get_tag","thrive_get_user_by_id","thrive_get_user_by_ref","thrive_list_assignments","thrive_list_audience_managers","thrive_list_audience_members","thrive_list_audiences","thrive_list_completions","thrive_list_enrolments","thrive_list_tags","thrive_query_activities","thrive_query_content","thrive_query_cpd_categories","thrive_query_cpd_entries","thrive_query_cpd_requirements","thrive_query_cpd_user_summaries","thrive_remove_audience_manager","thrive_remove_audience_member","thrive_remove_user_tags","thrive_replace_audience_managers","thrive_replace_audience_members","thrive_search_users","thrive_suspend_user","thrive_update_assignment","thrive_update_audience","thrive_update_user","thrive_update_user_skills","tiktok_get_post_status","tiktok_get_user","tiktok_list_videos","tiktok_query_videos","tiktok_upload_video_draft","tinybird_append_datasource","tinybird_delete_datasource_rows","tinybird_events","tinybird_get_job","tinybird_query","tinybird_query_pipe","tinybird_truncate_datasource","tinyfish_cancel_run","tinyfish_fetch","tinyfish_get_run","tinyfish_list_runs","tinyfish_list_vault_items","tinyfish_run","tinyfish_run_async","tinyfish_search","trello_add_checklist","trello_add_checklist_item","trello_add_comment","trello_add_label","trello_add_member","trello_create_board","trello_create_card","trello_create_list","trello_delete_card","trello_get_actions","trello_get_board","trello_get_card","trello_list_cards","trello_list_lists","trello_list_members","trello_remove_label","trello_remove_member","trello_search","trello_update_card","trello_update_checklist_item","trello_update_list","trigger_dev_activate_schedule","trigger_dev_add_run_tags","trigger_dev_batch_trigger_task","trigger_dev_cancel_run","trigger_dev_complete_waitpoint_token","trigger_dev_create_env_var","trigger_dev_create_schedule","trigger_dev_create_waitpoint_token","trigger_dev_deactivate_schedule","trigger_dev_delete_env_var","trigger_dev_delete_schedule","trigger_dev_execute_query","trigger_dev_get_batch","trigger_dev_get_batch_results","trigger_dev_get_deployment","trigger_dev_get_env_var","trigger_dev_get_latest_deployment","trigger_dev_get_query_schema","trigger_dev_get_queue","trigger_dev_get_run","trigger_dev_get_run_events","trigger_dev_get_run_result","trigger_dev_get_run_trace","trigger_dev_get_schedule","trigger_dev_get_waitpoint_token","trigger_dev_import_env_vars","trigger_dev_list_deployments","trigger_dev_list_env_vars","trigger_dev_list_queues","trigger_dev_list_runs","trigger_dev_list_schedules","trigger_dev_list_timezones","trigger_dev_list_waitpoint_tokens","trigger_dev_override_queue_concurrency","trigger_dev_pause_queue","trigger_dev_promote_deployment","trigger_dev_replay_run","trigger_dev_reschedule_run","trigger_dev_reset_queue_concurrency","trigger_dev_resume_queue","trigger_dev_trigger_task","trigger_dev_update_env_var","trigger_dev_update_run_metadata","trigger_dev_update_schedule","tts_azure","tts_cartesia","tts_deepgram","tts_elevenlabs","tts_google","tts_openai","tts_playht","twilio_send_sms","twilio_voice_get_recording","twilio_voice_list_calls","twilio_voice_make_call","typeform_create_form","typeform_delete_form","typeform_files","typeform_get_form","typeform_insights","typeform_list_forms","typeform_responses","typeform_update_form","upstash_redis_command","upstash_redis_delete","upstash_redis_exists","upstash_redis_expire","upstash_redis_get","upstash_redis_hget","upstash_redis_hgetall","upstash_redis_hset","upstash_redis_incr","upstash_redis_incrby","upstash_redis_keys","upstash_redis_lpush","upstash_redis_lrange","upstash_redis_set","upstash_redis_setnx","upstash_redis_ttl","uptimerobot_create_alert_contact","uptimerobot_create_maintenance_window","uptimerobot_create_monitor","uptimerobot_create_psp","uptimerobot_delete_alert_contact","uptimerobot_delete_maintenance_window","uptimerobot_delete_monitor","uptimerobot_delete_psp","uptimerobot_get_account","uptimerobot_get_alert_contact","uptimerobot_get_incident","uptimerobot_get_maintenance_window","uptimerobot_get_monitor","uptimerobot_get_psp","uptimerobot_list_alert_contacts","uptimerobot_list_incidents","uptimerobot_list_maintenance_windows","uptimerobot_list_monitors","uptimerobot_list_psps","uptimerobot_pause_monitor","uptimerobot_start_monitor","uptimerobot_update_maintenance_window","uptimerobot_update_monitor","uptimerobot_update_psp","vanta_download_document_file","vanta_get_control","vanta_get_document","vanta_get_framework","vanta_get_person","vanta_get_policy","vanta_get_risk_scenario","vanta_get_test","vanta_get_vendor","vanta_get_vulnerable_asset","vanta_list_control_documents","vanta_list_control_tests","vanta_list_controls","vanta_list_document_uploads","vanta_list_documents","vanta_list_framework_controls","vanta_list_frameworks","vanta_list_monitored_computers","vanta_list_people","vanta_list_policies","vanta_list_risk_scenarios","vanta_list_test_entities","vanta_list_tests","vanta_list_vendors","vanta_list_vulnerabilities","vanta_list_vulnerability_remediations","vanta_list_vulnerable_assets","vanta_submit_document","vanta_upload_document_file","vercel_add_domain","vercel_add_project_domain","vercel_cancel_deployment","vercel_create_alias","vercel_create_check","vercel_create_deployment","vercel_create_dns_record","vercel_create_edge_config","vercel_create_env_var","vercel_create_project","vercel_create_webhook","vercel_delete_alias","vercel_delete_deployment","vercel_delete_dns_record","vercel_delete_domain","vercel_delete_edge_config","vercel_delete_env_var","vercel_delete_project","vercel_delete_webhook","vercel_get_alias","vercel_get_check","vercel_get_deployment","vercel_get_deployment_events","vercel_get_domain","vercel_get_domain_config","vercel_get_edge_config","vercel_get_edge_config_items","vercel_get_env_vars","vercel_get_project","vercel_get_team","vercel_get_user","vercel_get_webhook","vercel_list_aliases","vercel_list_checks","vercel_list_deployment_files","vercel_list_deployments","vercel_list_dns_records","vercel_list_domains","vercel_list_edge_configs","vercel_list_project_domains","vercel_list_projects","vercel_list_team_members","vercel_list_teams","vercel_list_webhooks","vercel_pause_project","vercel_promote_deployment","vercel_remove_project_domain","vercel_rerequest_check","vercel_unpause_project","vercel_update_check","vercel_update_dns_record","vercel_update_edge_config_items","vercel_update_env_var","vercel_update_project","vercel_update_project_domain","vercel_verify_project_domain","video_falai","video_luma","video_minimax","video_runway","video_veo","vision_tool","vision_tool_v2","wealthbox_read_contact","wealthbox_read_note","wealthbox_read_task","wealthbox_write_contact","wealthbox_write_note","wealthbox_write_task","webflow_create_item","webflow_delete_item","webflow_get_item","webflow_list_items","webflow_update_item","webhook_request","whatsapp_get_media","whatsapp_mark_read","whatsapp_send_interactive","whatsapp_send_media","whatsapp_send_message","whatsapp_send_reaction","whatsapp_send_template","whatsapp_upload_media","wikipedia_content","wikipedia_random","wikipedia_search","wikipedia_summary","windchill_check_in_document","windchill_check_in_documents","windchill_check_out_document","windchill_check_out_documents","windchill_create_document","windchill_create_documents","windchill_delete_document","windchill_delete_documents","windchill_download_attachment","windchill_download_primary_content","windchill_get_document","windchill_get_document_structure","windchill_get_primary_content","windchill_get_valid_state_transitions","windchill_list_attachments","windchill_list_documents","windchill_revise_document","windchill_revise_documents","windchill_set_lifecycle_state","windchill_undo_check_out_document","windchill_undo_check_out_documents","windchill_update_common_properties","windchill_update_document","windchill_update_document_security_labels","windchill_update_documents","windchill_upload_attachments","windchill_upload_primary_content","wiza_company_enrichment","wiza_get_credits","wiza_individual_reveal","wiza_prospect_search","wordpress_create_category","wordpress_create_comment","wordpress_create_page","wordpress_create_post","wordpress_create_tag","wordpress_delete_category","wordpress_delete_comment","wordpress_delete_media","wordpress_delete_page","wordpress_delete_post","wordpress_delete_tag","wordpress_get_category","wordpress_get_current_user","wordpress_get_media","wordpress_get_page","wordpress_get_post","wordpress_get_tag","wordpress_get_user","wordpress_list_categories","wordpress_list_comments","wordpress_list_media","wordpress_list_pages","wordpress_list_posts","wordpress_list_tags","wordpress_list_users","wordpress_search_content","wordpress_update_category","wordpress_update_comment","wordpress_update_page","wordpress_update_post","wordpress_update_tag","wordpress_upload_media","workday_assign_onboarding","workday_change_job","workday_create_prehire","workday_get_compensation","workday_get_organizations","workday_get_worker","workday_hire_employee","workday_list_workers","workday_terminate_worker","workday_update_worker","workflow_executor","x_create_bookmark","x_create_tweet","x_delete_bookmark","x_delete_tweet","x_get_blocking","x_get_bookmarks","x_get_followers","x_get_following","x_get_liked_tweets","x_get_liking_users","x_get_me","x_get_personalized_trends","x_get_quote_tweets","x_get_retweeted_by","x_get_trends_by_woeid","x_get_tweets_by_ids","x_get_usage","x_get_user_mentions","x_get_user_timeline","x_get_user_tweets","x_hide_reply","x_manage_block","x_manage_follow","x_manage_like","x_manage_mute","x_manage_retweet","x_read","x_search","x_search_tweets","x_search_users","x_user","x_write","youtube_channel_info","youtube_channel_playlists","youtube_channel_videos","youtube_comments","youtube_playlist_items","youtube_search","youtube_trending","youtube_video_categories","youtube_video_details","zendesk_autocomplete_organizations","zendesk_create_organization","zendesk_create_organizations_bulk","zendesk_create_ticket","zendesk_create_tickets_bulk","zendesk_create_user","zendesk_create_users_bulk","zendesk_delete_organization","zendesk_delete_ticket","zendesk_delete_user","zendesk_get_current_user","zendesk_get_organization","zendesk_get_organizations","zendesk_get_ticket","zendesk_get_tickets","zendesk_get_user","zendesk_get_users","zendesk_merge_tickets","zendesk_search","zendesk_search_count","zendesk_search_users","zendesk_update_organization","zendesk_update_ticket","zendesk_update_tickets_bulk","zendesk_update_user","zendesk_update_users_bulk","zep_add_messages","zep_add_user","zep_create_thread","zep_delete_thread","zep_get_context","zep_get_messages","zep_get_threads","zep_get_user","zep_get_user_threads","zerobounce_get_credits","zerobounce_verify_email","zoho_desk_add_comment","zoho_desk_get_attachment","zoho_desk_get_contact","zoho_desk_get_thread","zoho_desk_get_ticket","zoho_desk_list_comments","zoho_desk_list_organizations","zoho_desk_list_threads","zoho_desk_list_tickets","zoho_desk_update_ticket","zoom_create_meeting","zoom_delete_meeting","zoom_delete_recording","zoom_get_meeting","zoom_get_meeting_invitation","zoom_get_meeting_recordings","zoom_list_meetings","zoom_list_past_participants","zoom_list_recordings","zoom_update_meeting","zoominfo_enrich_companies","zoominfo_enrich_contacts","zoominfo_search_companies","zoominfo_search_contacts","zoominfo_search_intent","zoominfo_search_news"]' + '["a2a_cancel_task","a2a_get_agent_card","a2a_get_task","a2a_send_message","affinity_batch_update_entity_fields","affinity_batch_update_list_entry_fields","affinity_create_list","affinity_create_list_field_dropdown_option","affinity_create_merge","affinity_create_note","affinity_create_reminder","affinity_delete_list_field_dropdown_option","affinity_delete_note","affinity_get_company","affinity_get_current_user","affinity_get_entity_field_value","affinity_get_list","affinity_get_list_entry","affinity_get_list_entry_field","affinity_get_list_field_dropdown_option","affinity_get_merge","affinity_get_merge_task","affinity_get_note","affinity_get_opportunity","affinity_get_person","affinity_get_saved_view","affinity_get_transcript","affinity_get_user","affinity_list_calls","affinity_list_chat_messages","affinity_list_companies","affinity_list_coworker_connections","affinity_list_emails","affinity_list_entity_field_values","affinity_list_entity_list_entries","affinity_list_entity_lists","affinity_list_entity_notes","affinity_list_entity_relationships","affinity_list_field_dropdown_options","affinity_list_field_metadata","affinity_list_field_value_changes","affinity_list_investor_executive_connections","affinity_list_list_entries","affinity_list_list_entry_field_value_changes","affinity_list_list_entry_fields","affinity_list_list_field_dropdown_options","affinity_list_list_fields","affinity_list_lists","affinity_list_meetings","affinity_list_merge_tasks","affinity_list_merges","affinity_list_note_attached_companies","affinity_list_note_attached_opportunities","affinity_list_note_attached_persons","affinity_list_note_replies","affinity_list_notes","affinity_list_opportunities","affinity_list_persons","affinity_list_reminders","affinity_list_saved_view_entries","affinity_list_saved_views","affinity_list_transcript_fragments","affinity_list_transcripts","affinity_list_users","affinity_search_companies","affinity_search_files","affinity_search_list_entries","affinity_search_notes","affinity_search_persons","affinity_semantic_search","affinity_update_entity_field_value","affinity_update_list_entry_field","affinity_update_list_field_dropdown_option","affinity_update_note","agentmail_create_draft","agentmail_create_inbox","agentmail_delete_draft","agentmail_delete_inbox","agentmail_delete_thread","agentmail_forward_message","agentmail_get_draft","agentmail_get_inbox","agentmail_get_message","agentmail_get_thread","agentmail_list_drafts","agentmail_list_inboxes","agentmail_list_messages","agentmail_list_threads","agentmail_reply_message","agentmail_send_draft","agentmail_send_message","agentmail_update_draft","agentmail_update_inbox","agentmail_update_message","agentmail_update_thread","agentphone_create_call","agentphone_create_contact","agentphone_create_number","agentphone_delete_contact","agentphone_get_call","agentphone_get_call_transcript","agentphone_get_contact","agentphone_get_conversation","agentphone_get_conversation_messages","agentphone_get_number_messages","agentphone_get_usage","agentphone_get_usage_daily","agentphone_get_usage_monthly","agentphone_list_calls","agentphone_list_contacts","agentphone_list_conversations","agentphone_list_numbers","agentphone_react_to_message","agentphone_release_number","agentphone_send_message","agentphone_update_contact","agentphone_update_conversation","agiloft_async_status","agiloft_attach_file","agiloft_attachment_info","agiloft_create_record","agiloft_delete_record","agiloft_get_choice_line_id","agiloft_list_tables","agiloft_lock_record","agiloft_nlp_search","agiloft_read_record","agiloft_remove_attachment","agiloft_retrieve_attachment","agiloft_run_action_button","agiloft_saved_search","agiloft_search_records","agiloft_select_records","agiloft_update_record","agiloft_upsert_record","ahrefs_anchors","ahrefs_backlinks","ahrefs_backlinks_stats","ahrefs_batch_analysis","ahrefs_broken_backlinks","ahrefs_domain_rating","ahrefs_domain_rating_history","ahrefs_keyword_overview","ahrefs_keywords_history","ahrefs_metrics","ahrefs_metrics_history","ahrefs_organic_competitors","ahrefs_organic_keywords","ahrefs_paid_pages","ahrefs_rank_tracker_competitors_overview","ahrefs_rank_tracker_competitors_stats","ahrefs_rank_tracker_overview","ahrefs_rank_tracker_serp_overview","ahrefs_refdomains_history","ahrefs_referring_domains","ahrefs_related_terms","ahrefs_site_audit_page_explorer","ahrefs_top_pages","airtable_create_records","airtable_delete_records","airtable_get_base_schema","airtable_get_record","airtable_list_bases","airtable_list_records","airtable_list_tables","airtable_update_multiple_records","airtable_update_record","airtable_upsert_records","airweave_search","algolia_add_record","algolia_batch_operations","algolia_browse_records","algolia_clear_records","algolia_copy_move_index","algolia_delete_by_filter","algolia_delete_index","algolia_delete_record","algolia_get_record","algolia_get_records","algolia_get_settings","algolia_get_task_status","algolia_list_indices","algolia_partial_update_record","algolia_search","algolia_update_settings","amplitude_event_segmentation","amplitude_funnels","amplitude_get_active_users","amplitude_get_revenue","amplitude_group_identify","amplitude_identify_user","amplitude_list_events","amplitude_realtime_active_users","amplitude_retention","amplitude_send_event","amplitude_user_activity","amplitude_user_profile","amplitude_user_search","apify_get_dataset_items","apify_get_run","apify_run_actor_async","apify_run_actor_sync","apify_run_task","apollo_account_bulk_create","apollo_account_bulk_update","apollo_account_create","apollo_account_search","apollo_account_update","apollo_contact_bulk_create","apollo_contact_bulk_update","apollo_contact_create","apollo_contact_search","apollo_contact_update","apollo_email_accounts","apollo_opportunity_create","apollo_opportunity_get","apollo_opportunity_search","apollo_opportunity_update","apollo_organization_bulk_enrich","apollo_organization_enrich","apollo_organization_search","apollo_people_bulk_enrich","apollo_people_enrich","apollo_people_search","apollo_sequence_add_contacts","apollo_sequence_search","apollo_task_create","apollo_task_search","appconfig_create_application","appconfig_create_configuration_profile","appconfig_create_environment","appconfig_create_hosted_configuration_version","appconfig_delete_application","appconfig_delete_configuration_profile","appconfig_delete_environment","appconfig_delete_hosted_configuration_version","appconfig_get_application","appconfig_get_configuration","appconfig_get_configuration_profile","appconfig_get_deployment","appconfig_get_environment","appconfig_get_hosted_configuration_version","appconfig_list_applications","appconfig_list_configuration_profiles","appconfig_list_deployment_strategies","appconfig_list_deployments","appconfig_list_environments","appconfig_list_hosted_configuration_versions","appconfig_start_deployment","appconfig_stop_deployment","appconfig_update_application","appconfig_update_configuration_profile","appconfig_update_environment","arxiv_get_author_papers","arxiv_get_paper","arxiv_search","asana_add_comment","asana_add_followers","asana_create_project","asana_create_section","asana_create_subtask","asana_create_task","asana_delete_task","asana_get_project","asana_get_projects","asana_get_task","asana_list_sections","asana_list_workspaces","asana_search_tasks","asana_update_task","ashby_add_candidate_tag","ashby_anonymize_candidate","ashby_change_application_source","ashby_change_application_stage","ashby_create_application","ashby_create_candidate","ashby_create_note","ashby_delete_application","ashby_get_application","ashby_get_candidate","ashby_get_job","ashby_get_job_posting","ashby_get_offer","ashby_get_opening","ashby_list_application_feedback","ashby_list_application_history","ashby_list_applications","ashby_list_archive_reasons","ashby_list_candidate_tags","ashby_list_candidates","ashby_list_custom_fields","ashby_list_departments","ashby_list_interview_plans","ashby_list_interview_stages","ashby_list_interviews","ashby_list_job_postings","ashby_list_jobs","ashby_list_locations","ashby_list_notes","ashby_list_offers","ashby_list_openings","ashby_list_sources","ashby_list_users","ashby_remove_candidate_tag","ashby_search_candidates","ashby_search_jobs","ashby_search_openings","ashby_search_users","ashby_set_custom_field_value","ashby_set_custom_field_values","ashby_transfer_application","ashby_update_candidate","ashby_upload_candidate_file","ashby_upload_resume","athena_batch_get_query_execution","athena_create_named_query","athena_delete_named_query","athena_get_named_query","athena_get_query_execution","athena_get_query_results","athena_list_databases","athena_list_named_queries","athena_list_query_executions","athena_list_table_metadata","athena_start_query","athena_stop_query","attio_assert_record","attio_create_attribute","attio_create_comment","attio_create_list","attio_create_list_entry","attio_create_note","attio_create_object","attio_create_record","attio_create_task","attio_create_webhook","attio_delete_comment","attio_delete_list_entry","attio_delete_note","attio_delete_record","attio_delete_task","attio_delete_webhook","attio_get_attribute","attio_get_comment","attio_get_list","attio_get_list_entry","attio_get_member","attio_get_note","attio_get_object","attio_get_record","attio_get_task","attio_get_thread","attio_get_webhook","attio_list_attributes","attio_list_lists","attio_list_members","attio_list_notes","attio_list_objects","attio_list_records","attio_list_tasks","attio_list_threads","attio_list_webhooks","attio_query_list_entries","attio_search_records","attio_update_attribute","attio_update_list","attio_update_list_entry","attio_update_object","attio_update_record","attio_update_task","attio_update_webhook","azure_data_explorer_create_table","azure_data_explorer_drop_table","azure_data_explorer_ingest_from_query","azure_data_explorer_ingest_inline","azure_data_explorer_list_databases","azure_data_explorer_list_functions","azure_data_explorer_list_tables","azure_data_explorer_management","azure_data_explorer_query","azure_data_explorer_show_database_schema","azure_data_explorer_show_ingestion_failures","azure_data_explorer_show_operations","azure_data_explorer_show_table_details","azure_data_explorer_show_table_schema","azure_devops_add_comment","azure_devops_create_work_item","azure_devops_get_build_log","azure_devops_get_build_timeline","azure_devops_get_comments","azure_devops_get_pipeline","azure_devops_get_pipeline_run","azure_devops_get_work_item","azure_devops_get_work_items_batch","azure_devops_get_work_items_between_builds","azure_devops_list_build_logs","azure_devops_list_builds","azure_devops_list_pipeline_runs","azure_devops_list_pipelines","azure_devops_query_work_items","azure_devops_update_work_item","bitbucket_approve_pull_request","bitbucket_create_branch","bitbucket_create_pull_request","bitbucket_create_pull_request_comment","bitbucket_decline_pull_request","bitbucket_delete_branch","bitbucket_get_commit","bitbucket_get_file","bitbucket_get_file_metadata","bitbucket_get_pipeline","bitbucket_get_pipeline_step_log","bitbucket_get_pull_request","bitbucket_get_pull_request_diff","bitbucket_get_pull_request_diffstat","bitbucket_get_pull_request_merge_task_status","bitbucket_get_repository","bitbucket_list_branches","bitbucket_list_commits","bitbucket_list_directory","bitbucket_list_pipeline_steps","bitbucket_list_pipelines","bitbucket_list_pull_request_comments","bitbucket_list_pull_request_commit_statuses","bitbucket_list_pull_requests","bitbucket_list_repositories","bitbucket_list_workspaces","bitbucket_merge_pull_request","bitbucket_request_pull_request_changes","bitbucket_stop_pipeline","bitbucket_trigger_pipeline","box_copy_file","box_create_folder","box_delete_file","box_delete_folder","box_download_file","box_get_file_info","box_list_folder_items","box_search","box_sign_cancel_request","box_sign_create_request","box_sign_get_request","box_sign_list_requests","box_sign_resend_request","box_update_file","box_upload_file","brandfetch_get_brand","brandfetch_search","brex_archive_budget","brex_create_budget","brex_create_spend_limit","brex_create_transfer","brex_create_vendor","brex_get_budget","brex_get_cash_account","brex_get_company","brex_get_current_user","brex_get_expense","brex_get_spend_limit","brex_get_transfer","brex_get_user","brex_get_vendor","brex_list_budgets","brex_list_card_accounts","brex_list_card_statements","brex_list_card_transactions","brex_list_cards","brex_list_cash_accounts","brex_list_cash_statements","brex_list_cash_transactions","brex_list_departments","brex_list_expenses","brex_list_locations","brex_list_spend_limits","brex_list_titles","brex_list_transfers","brex_list_users","brex_list_vendors","brex_match_receipt","brex_update_expense","brex_update_vendor","brex_upload_receipt","brightdata_cancel_snapshot","brightdata_discover","brightdata_download_snapshot","brightdata_scrape_dataset","brightdata_scrape_url","brightdata_serp_search","brightdata_snapshot_status","brightdata_sync_scrape","browser_use_run_task","buffer_create_idea","buffer_create_post","buffer_delete_post","buffer_edit_post","buffer_get_account","buffer_get_channels","buffer_get_idea_groups","buffer_get_ideas","buffer_get_post","buffer_get_posts","calcom_cancel_booking","calcom_confirm_booking","calcom_create_booking","calcom_create_event_type","calcom_create_schedule","calcom_decline_booking","calcom_delete_event_type","calcom_delete_schedule","calcom_get_booking","calcom_get_default_schedule","calcom_get_event_type","calcom_get_schedule","calcom_get_slots","calcom_list_bookings","calcom_list_event_types","calcom_list_schedules","calcom_reschedule_booking","calcom_update_event_type","calcom_update_schedule","calendly_cancel_event","calendly_create_event_invitee","calendly_create_invitee_no_show","calendly_create_scheduling_link","calendly_create_webhook","calendly_delete_invitee_no_show","calendly_delete_webhook","calendly_get_current_user","calendly_get_event_invitee","calendly_get_event_type","calendly_get_scheduled_event","calendly_get_user","calendly_list_event_invitees","calendly_list_event_type_available_times","calendly_list_event_types","calendly_list_organization_memberships","calendly_list_routing_form_submissions","calendly_list_routing_forms","calendly_list_scheduled_events","calendly_list_user_availability_schedules","calendly_list_user_busy_times","calendly_list_webhooks","cbinsights_chat","cbinsights_get_commercial_maturity_history","cbinsights_get_exit_probability_history","cbinsights_get_mosaic_history","cbinsights_get_org_business_relationships","cbinsights_get_org_funding_window","cbinsights_get_org_fundings","cbinsights_get_org_investments","cbinsights_get_org_management_and_board","cbinsights_get_org_outlook","cbinsights_get_org_portfolio_exits","cbinsights_get_org_revenue","cbinsights_get_scouting_report","cbinsights_get_strategy_map","cbinsights_list_business_relationships","cbinsights_list_funding_window","cbinsights_list_fundings","cbinsights_list_investments","cbinsights_list_management_and_board","cbinsights_list_outlook","cbinsights_list_portfolio_exits","cbinsights_list_revenue","cbinsights_lookup_organizations","cbinsights_rag","cbinsights_search_firmographics","circleback_add_tag_to_meetings","circleback_create_tag","circleback_delete_action_item","circleback_delete_meeting","circleback_delete_tag","circleback_get_company","circleback_get_meeting","circleback_get_person","circleback_get_transcript","circleback_list_action_items","circleback_list_calendar_events","circleback_list_companies","circleback_list_meetings","circleback_list_people","circleback_list_tags","circleback_remove_tag_from_meetings","circleback_search_meetings","circleback_update_action_item","circleback_update_meeting","circleback_update_tag","clay_populate","clerk_add_organization_member","clerk_ban_user","clerk_create_actor_token","clerk_create_allowlist_identifier","clerk_create_blocklist_identifier","clerk_create_organization","clerk_create_organization_invitation","clerk_create_user","clerk_delete_allowlist_identifier","clerk_delete_blocklist_identifier","clerk_delete_organization","clerk_delete_user","clerk_get_jwt_template","clerk_get_organization","clerk_get_session","clerk_get_user","clerk_get_user_oauth_token","clerk_list_allowlist_identifiers","clerk_list_blocklist_identifiers","clerk_list_jwt_templates","clerk_list_organization_invitations","clerk_list_organization_memberships","clerk_list_organizations","clerk_list_sessions","clerk_list_users","clerk_lock_user","clerk_remove_organization_member","clerk_revoke_actor_token","clerk_revoke_session","clerk_unban_user","clerk_unlock_user","clerk_update_organization","clerk_update_organization_membership","clerk_update_user","clickhouse_count_rows","clickhouse_create_database","clickhouse_create_table","clickhouse_delete","clickhouse_describe_table","clickhouse_drop_database","clickhouse_drop_partition","clickhouse_drop_table","clickhouse_execute","clickhouse_insert","clickhouse_insert_rows","clickhouse_introspect","clickhouse_kill_query","clickhouse_list_clusters","clickhouse_list_databases","clickhouse_list_mutations","clickhouse_list_partitions","clickhouse_list_running_queries","clickhouse_list_tables","clickhouse_optimize_table","clickhouse_query","clickhouse_rename_table","clickhouse_show_create_table","clickhouse_table_stats","clickhouse_truncate_table","clickhouse_update","clickup_add_tag_to_task","clickup_create_checklist","clickup_create_checklist_item","clickup_create_comment","clickup_create_folder","clickup_create_list","clickup_create_task","clickup_create_time_entry","clickup_delete_checklist","clickup_delete_checklist_item","clickup_delete_comment","clickup_delete_task","clickup_delete_time_entry","clickup_get_comments","clickup_get_custom_fields","clickup_get_folders","clickup_get_list_members","clickup_get_lists","clickup_get_running_timer","clickup_get_space_tags","clickup_get_spaces","clickup_get_task","clickup_get_task_members","clickup_get_tasks","clickup_get_time_entries","clickup_get_workspaces","clickup_remove_custom_field_value","clickup_remove_tag_from_task","clickup_search_tasks","clickup_set_custom_field_value","clickup_start_timer","clickup_stop_timer","clickup_update_checklist","clickup_update_checklist_item","clickup_update_comment","clickup_update_task","clickup_update_time_entry","clickup_upload_attachment","cloudflare_create_access_application","cloudflare_create_access_policy","cloudflare_create_access_service_token","cloudflare_create_dns_record","cloudflare_create_r2_bucket","cloudflare_create_rate_limit_rule","cloudflare_create_ruleset","cloudflare_create_ruleset_rule","cloudflare_create_zone","cloudflare_delete_access_application","cloudflare_delete_access_policy","cloudflare_delete_dns_record","cloudflare_delete_r2_bucket","cloudflare_delete_ruleset_rule","cloudflare_delete_zone","cloudflare_dns_analytics","cloudflare_get_access_application","cloudflare_get_r2_bucket","cloudflare_get_ruleset","cloudflare_get_ruleset_entrypoint","cloudflare_get_tunnel","cloudflare_get_tunnel_configuration","cloudflare_get_worker_script_settings","cloudflare_get_zone","cloudflare_get_zone_settings","cloudflare_list_access_applications","cloudflare_list_access_groups","cloudflare_list_access_identity_providers","cloudflare_list_access_policies","cloudflare_list_access_service_tokens","cloudflare_list_certificates","cloudflare_list_dns_records","cloudflare_list_managed_ruleset_overrides","cloudflare_list_r2_buckets","cloudflare_list_rate_limit_rules","cloudflare_list_rulesets","cloudflare_list_tunnels","cloudflare_list_worker_routes","cloudflare_list_worker_scripts","cloudflare_list_zones","cloudflare_purge_cache","cloudflare_revoke_access_service_token","cloudflare_update_access_application","cloudflare_update_access_policy","cloudflare_update_dns_record","cloudflare_update_rate_limit_rule","cloudflare_update_ruleset_rule","cloudflare_update_zone_setting","cloudformation_cancel_update_stack","cloudformation_create_change_set","cloudformation_create_stack","cloudformation_delete_stack","cloudformation_describe_change_set","cloudformation_describe_stack_drift_detection_status","cloudformation_describe_stack_events","cloudformation_describe_stacks","cloudformation_detect_stack_drift","cloudformation_execute_change_set","cloudformation_get_template","cloudformation_get_template_summary","cloudformation_list_stack_resources","cloudformation_update_stack","cloudformation_validate_template","cloudwatch_describe_alarm_history","cloudwatch_describe_alarms","cloudwatch_describe_log_groups","cloudwatch_describe_log_streams","cloudwatch_filter_log_events","cloudwatch_get_log_events","cloudwatch_get_metric_statistics","cloudwatch_list_metrics","cloudwatch_mute_alarm","cloudwatch_put_log_group_retention","cloudwatch_put_metric_data","cloudwatch_query_logs","cloudwatch_unmute_alarm","codepipeline_disable_stage_transition","codepipeline_enable_stage_transition","codepipeline_get_pipeline","codepipeline_get_pipeline_execution","codepipeline_get_pipeline_state","codepipeline_list_action_executions","codepipeline_list_pipeline_executions","codepipeline_list_pipelines","codepipeline_put_approval_result","codepipeline_retry_stage_execution","codepipeline_start_execution","codepipeline_stop_execution","confluence_add_label","confluence_create_blogpost","confluence_create_comment","confluence_create_page","confluence_create_page_property","confluence_create_space","confluence_create_space_property","confluence_delete_attachment","confluence_delete_blogpost","confluence_delete_comment","confluence_delete_label","confluence_delete_page","confluence_delete_page_property","confluence_delete_space","confluence_delete_space_property","confluence_get_blogpost","confluence_get_page_ancestors","confluence_get_page_children","confluence_get_page_descendants","confluence_get_page_version","confluence_get_pages_by_label","confluence_get_space","confluence_get_task","confluence_get_user","confluence_list_attachments","confluence_list_blogposts","confluence_list_blogposts_in_space","confluence_list_comments","confluence_list_labels","confluence_list_page_properties","confluence_list_page_versions","confluence_list_pages_in_space","confluence_list_space_labels","confluence_list_space_permissions","confluence_list_space_properties","confluence_list_spaces","confluence_list_tasks","confluence_retrieve","confluence_search","confluence_search_in_space","confluence_update","confluence_update_blogpost","confluence_update_comment","confluence_update_space","confluence_update_task","confluence_upload_attachment","context_dev_classify_naics","context_dev_classify_sic","context_dev_crawl","context_dev_extract","context_dev_extract_product","context_dev_extract_products","context_dev_get_brand","context_dev_get_brand_by_email","context_dev_get_brand_by_name","context_dev_get_brand_by_ticker","context_dev_identify_transaction","context_dev_map","context_dev_scrape_fonts","context_dev_scrape_html","context_dev_scrape_images","context_dev_scrape_markdown","context_dev_scrape_styleguide","context_dev_screenshot","context_dev_search","convex_action","convex_document_deltas","convex_list_documents","convex_list_tables","convex_mutation","convex_query","convex_run_function","crowdstrike_create_indicators","crowdstrike_delete_indicators","crowdstrike_delete_rtr_session","crowdstrike_execute_rtr_command","crowdstrike_get_alert_details","crowdstrike_get_case_details","crowdstrike_get_host_group_details","crowdstrike_get_indicator_details","crowdstrike_get_rtr_command_status","crowdstrike_get_sensor_aggregates","crowdstrike_get_sensor_details","crowdstrike_get_vulnerability_details","crowdstrike_init_rtr_session","crowdstrike_perform_host_action","crowdstrike_perform_host_group_action","crowdstrike_query_alerts","crowdstrike_query_cases","crowdstrike_query_host_groups","crowdstrike_query_indicators","crowdstrike_query_sensors","crowdstrike_query_vulnerabilities","crowdstrike_update_alerts","crowdstrike_update_indicators","crunchbase_autocomplete","crunchbase_get_acquisition","crunchbase_get_entity","crunchbase_get_entity_card","crunchbase_get_fields_metadata","crunchbase_get_funding_round","crunchbase_get_organization","crunchbase_get_person","crunchbase_list_deleted_entities","crunchbase_search_acquisitions","crunchbase_search_entities","crunchbase_search_funding_rounds","crunchbase_search_organizations","crunchbase_search_people","cursor_add_followup","cursor_add_followup_v2","cursor_delete_agent","cursor_delete_agent_v2","cursor_download_artifact","cursor_download_artifact_v2","cursor_get_agent","cursor_get_agent_v2","cursor_get_api_key_info","cursor_get_api_key_info_v2","cursor_get_conversation","cursor_get_conversation_v2","cursor_launch_agent","cursor_launch_agent_v2","cursor_list_agents","cursor_list_agents_v2","cursor_list_artifacts","cursor_list_artifacts_v2","cursor_list_models","cursor_list_models_v2","cursor_list_repositories","cursor_list_repositories_v2","cursor_stop_agent","cursor_stop_agent_v2","dagster_delete_run","dagster_get_asset","dagster_get_run","dagster_get_run_logs","dagster_launch_run","dagster_list_assets","dagster_list_jobs","dagster_list_runs","dagster_list_schedules","dagster_list_sensors","dagster_materialize_assets","dagster_reexecute_run","dagster_report_asset_materialization","dagster_start_schedule","dagster_start_sensor","dagster_stop_schedule","dagster_stop_sensor","dagster_terminate_run","dagster_wipe_asset","databricks_cancel_run","databricks_execute_sql","databricks_get_cluster","databricks_get_job","databricks_get_run","databricks_get_run_output","databricks_get_statement","databricks_list_clusters","databricks_list_jobs","databricks_list_runs","databricks_list_warehouses","databricks_run_job","datadog_add_incident_todo","datadog_cancel_downtime","datadog_create_dashboard","datadog_create_downtime","datadog_create_event","datadog_create_incident","datadog_create_monitor","datadog_create_slo","datadog_delete_dashboard","datadog_delete_slo","datadog_get_browser_synthetics_results","datadog_get_dashboard","datadog_get_incident","datadog_get_monitor","datadog_get_security_signal","datadog_get_slo","datadog_get_slo_history","datadog_get_synthetics_results","datadog_get_synthetics_test","datadog_list_dashboards","datadog_list_downtimes","datadog_list_incidents","datadog_list_monitors","datadog_list_security_rules","datadog_list_security_signals","datadog_list_services","datadog_list_slos","datadog_list_synthetics_tests","datadog_mute_monitor","datadog_query_logs","datadog_query_timeseries","datadog_search_spans","datadog_send_logs","datadog_submit_metrics","datadog_trigger_synthetics_tests","datadog_unmute_monitor","datadog_update_incident","datadog_update_security_signal_assignee","datadog_update_security_signal_state","datadog_update_slo","datadog_update_synthetics_status","datagma_enrich_company","datagma_enrich_person","datagma_find_email","datagma_find_phone","datagma_get_credits","daytona_create_sandbox","daytona_delete_sandbox","daytona_download_file","daytona_execute_command","daytona_get_sandbox","daytona_git_clone","daytona_list_files","daytona_list_sandboxes","daytona_run_code","daytona_start_sandbox","daytona_stop_sandbox","daytona_upload_file","deployed_block_executor","deployments_deploy","deployments_get_version","deployments_list_versions","deployments_promote","deployments_undeploy","devin_append_session_tags","devin_archive_session","devin_create_session","devin_get_session","devin_get_session_tags","devin_list_session_attachments","devin_list_session_messages","devin_list_sessions","devin_replace_session_tags","devin_send_message","devin_terminate_session","discord_add_reaction","discord_archive_thread","discord_assign_role","discord_ban_member","discord_bulk_delete_messages","discord_create_channel","discord_create_invite","discord_create_role","discord_create_thread","discord_create_webhook","discord_delete_channel","discord_delete_invite","discord_delete_message","discord_delete_role","discord_delete_webhook","discord_edit_message","discord_execute_webhook","discord_get_channel","discord_get_invite","discord_get_member","discord_get_messages","discord_get_pinned_messages","discord_get_server","discord_get_user","discord_get_webhook","discord_join_thread","discord_kick_member","discord_leave_thread","discord_list_channels","discord_list_roles","discord_pin_message","discord_remove_reaction","discord_remove_role","discord_send_message","discord_unban_member","discord_unpin_message","discord_update_channel","discord_update_member","discord_update_role","docusign_create_from_template","docusign_download_document","docusign_get_envelope","docusign_list_envelopes","docusign_list_recipients","docusign_list_templates","docusign_send_envelope","docusign_void_envelope","downdetector_get_company","downdetector_get_company_attribution","downdetector_get_company_baseline","downdetector_get_company_events","downdetector_get_company_incidents","downdetector_get_company_indicators","downdetector_get_company_last_15","downdetector_get_company_status","downdetector_get_provider","downdetector_get_reports","downdetector_get_site_companies","downdetector_list_categories","downdetector_list_incidents","downdetector_list_sites","downdetector_search_companies","dropbox_copy","dropbox_create_folder","dropbox_create_shared_link","dropbox_delete","dropbox_download","dropbox_get_metadata","dropbox_list_folder","dropbox_list_revisions","dropbox_list_shared_links","dropbox_move","dropbox_restore","dropbox_search","dropbox_upload","dropcontact_enrich_contact","dspy_chain_of_thought","dspy_predict","dspy_react","dub_bulk_create_links","dub_bulk_delete_links","dub_bulk_update_links","dub_create_link","dub_create_tag","dub_delete_link","dub_get_analytics","dub_get_events","dub_get_link","dub_get_links_count","dub_get_qr_code","dub_list_domains","dub_list_folders","dub_list_links","dub_list_tags","dub_update_link","dub_upsert_link","duckduckgo_search","dynamodb_delete","dynamodb_get","dynamodb_introspect","dynamodb_put","dynamodb_query","dynamodb_scan","dynamodb_update","dynatrace_add_problem_comment","dynatrace_add_tags","dynatrace_close_problem","dynatrace_create_settings_object","dynatrace_create_slo","dynatrace_delete_problem_comment","dynatrace_delete_settings_object","dynatrace_delete_slo","dynatrace_delete_tag","dynatrace_execute_synthetic_monitors","dynatrace_get_attack","dynatrace_get_audit_logs","dynatrace_get_entity","dynatrace_get_event","dynatrace_get_metric","dynatrace_get_problem","dynatrace_get_problem_comment","dynatrace_get_security_problem","dynatrace_get_settings_object","dynatrace_get_slo","dynatrace_get_synthetic_batch","dynatrace_ingest_event","dynatrace_ingest_logs","dynatrace_ingest_metrics","dynatrace_list_attacks","dynatrace_list_entities","dynatrace_list_entity_types","dynatrace_list_events","dynatrace_list_metrics","dynatrace_list_problem_comments","dynatrace_list_problems","dynatrace_list_remediation_items","dynatrace_list_security_problems","dynatrace_list_settings_objects","dynatrace_list_settings_schemas","dynatrace_list_slos","dynatrace_list_synthetic_monitors","dynatrace_list_tags","dynatrace_mute_security_problem","dynatrace_mute_security_problems","dynatrace_query_metrics","dynatrace_search_logs","dynatrace_unmute_security_problem","dynatrace_unmute_security_problems","dynatrace_update_problem_comment","dynatrace_update_settings_object","dynatrace_update_slo","elasticsearch_bulk","elasticsearch_cluster_health","elasticsearch_cluster_stats","elasticsearch_count","elasticsearch_create_index","elasticsearch_delete_document","elasticsearch_delete_index","elasticsearch_get_document","elasticsearch_get_index","elasticsearch_index_document","elasticsearch_list_indices","elasticsearch_search","elasticsearch_update_document","elevenlabs_audio_isolation","elevenlabs_edit_voice_settings","elevenlabs_get_user","elevenlabs_get_voice","elevenlabs_get_voice_settings","elevenlabs_list_models","elevenlabs_list_voices","elevenlabs_sound_effects","elevenlabs_speech_to_speech","elevenlabs_tts","emailbison_attach_leads_to_campaign","emailbison_attach_tags_to_leads","emailbison_create_campaign","emailbison_create_lead","emailbison_create_tag","emailbison_get_lead","emailbison_list_campaigns","emailbison_list_leads","emailbison_list_replies","emailbison_list_tags","emailbison_update_campaign","emailbison_update_campaign_status","emailbison_update_lead","embeddings_cohere","embeddings_gemini","embeddings_mistral","embeddings_openai","embeddings_openrouter","enrich_check_credits","enrich_company_funding","enrich_company_lookup","enrich_company_revenue","enrich_disposable_email_check","enrich_email_to_ip","enrich_email_to_person_lite","enrich_email_to_phone","enrich_email_to_profile","enrich_find_email","enrich_get_post_details","enrich_ip_to_company","enrich_linkedin_profile","enrich_linkedin_to_personal_email","enrich_linkedin_to_work_email","enrich_phone_finder","enrich_reverse_hash_lookup","enrich_sales_pointer_people","enrich_search_company","enrich_search_company_activities","enrich_search_company_employees","enrich_search_jobs","enrich_search_logo","enrich_search_people","enrich_search_people_activities","enrich_search_post_comments","enrich_search_post_comments_by_url","enrich_search_post_reactions","enrich_search_post_reactions_by_url","enrich_search_posts","enrich_search_similar_companies","enrich_verify_email","enrichment_run","enrow_find_email","enrow_verify_email","exa_agent","exa_answer","exa_find_similar_links","exa_get_contents","exa_search","extend_parser","extend_parser_v2","fathom_get_summary","fathom_get_transcript","fathom_list_meeting_types","fathom_list_meetings","fathom_list_team_members","fathom_list_teams","file_append","file_compress","file_create_folder","file_decompress","file_delete_folder","file_edit","file_fetch","file_get","file_get_content","file_list","file_manage_sharing","file_move","file_parser","file_parser_v2","file_parser_v3","file_read","file_restore_folder","file_search","file_update_folder","file_write","findymail_find_email_from_linkedin","findymail_find_email_from_name","findymail_find_emails_by_domain","findymail_find_employees","findymail_find_phone","findymail_get_company","findymail_get_credits","findymail_lookup_technologies","findymail_reverse_email_lookup","findymail_search_technologies","findymail_verify_email","firecrawl_agent","firecrawl_batch_scrape","firecrawl_batch_scrape_status","firecrawl_cancel_crawl","firecrawl_crawl","firecrawl_crawl_status","firecrawl_credit_usage","firecrawl_extract","firecrawl_extract_status","firecrawl_map","firecrawl_parse","firecrawl_scrape","firecrawl_search","fireflies_add_to_live_meeting","fireflies_create_bite","fireflies_delete_transcript","fireflies_get_transcript","fireflies_get_user","fireflies_list_bites","fireflies_list_contacts","fireflies_list_transcripts","fireflies_list_users","fireflies_upload_audio","flint_create_task","flint_generate_pages","flint_get_task","function_execute","gamma_check_status","gamma_generate","gamma_generate_from_template","gamma_list_folders","gamma_list_themes","github_add_assignees","github_add_assignees_v2","github_add_labels","github_add_labels_v2","github_cancel_workflow_run","github_cancel_workflow_run_v2","github_check_star","github_check_star_v2","github_close_issue","github_close_issue_v2","github_close_pr","github_close_pr_v2","github_comment","github_comment_v2","github_compare_commits","github_compare_commits_v2","github_create_branch","github_create_branch_v2","github_create_comment_reaction","github_create_comment_reaction_v2","github_create_file","github_create_file_v2","github_create_gist","github_create_gist_v2","github_create_issue","github_create_issue_reaction","github_create_issue_reaction_v2","github_create_issue_v2","github_create_milestone","github_create_milestone_v2","github_create_pr","github_create_pr_review","github_create_pr_review_v2","github_create_pr_v2","github_create_project","github_create_project_v2","github_create_release","github_create_release_v2","github_delete_branch","github_delete_branch_v2","github_delete_comment","github_delete_comment_reaction","github_delete_comment_reaction_v2","github_delete_comment_v2","github_delete_file","github_delete_file_v2","github_delete_gist","github_delete_gist_v2","github_delete_issue_reaction","github_delete_issue_reaction_v2","github_delete_milestone","github_delete_milestone_v2","github_delete_project","github_delete_project_v2","github_delete_release","github_delete_release_v2","github_fork_gist","github_fork_gist_v2","github_fork_repo","github_fork_repo_v2","github_get_branch","github_get_branch_protection","github_get_branch_protection_v2","github_get_branch_v2","github_get_commit","github_get_commit_v2","github_get_file_content","github_get_file_content_v2","github_get_gist","github_get_gist_v2","github_get_issue","github_get_issue_v2","github_get_latest_release","github_get_latest_release_v2","github_get_milestone","github_get_milestone_v2","github_get_pr_files","github_get_pr_files_v2","github_get_project","github_get_project_v2","github_get_readme","github_get_readme_v2","github_get_release","github_get_release_v2","github_get_tree","github_get_tree_v2","github_get_workflow","github_get_workflow_run","github_get_workflow_run_v2","github_get_workflow_v2","github_issue_comment","github_issue_comment_v2","github_job_logs","github_latest_commit","github_latest_commit_v2","github_list_branches","github_list_branches_v2","github_list_commits","github_list_commits_v2","github_list_forks","github_list_forks_v2","github_list_gists","github_list_gists_v2","github_list_issue_comments","github_list_issue_comments_v2","github_list_issues","github_list_issues_v2","github_list_milestones","github_list_milestones_v2","github_list_pr_comments","github_list_pr_comments_v2","github_list_projects","github_list_projects_v2","github_list_prs","github_list_prs_v2","github_list_releases","github_list_releases_v2","github_list_review_threads","github_list_stargazers","github_list_stargazers_v2","github_list_tags","github_list_tags_v2","github_list_workflow_runs","github_list_workflow_runs_v2","github_list_workflows","github_list_workflows_v2","github_merge_pr","github_merge_pr_v2","github_pr","github_pr_v2","github_remove_label","github_remove_label_v2","github_reply_review_thread","github_repo_info","github_repo_info_v2","github_request_reviewers","github_request_reviewers_v2","github_rerun_workflow","github_rerun_workflow_v2","github_resolve_review_thread","github_search_code","github_search_code_v2","github_search_commits","github_search_commits_v2","github_search_issues","github_search_issues_v2","github_search_repos","github_search_repos_v2","github_search_users","github_search_users_v2","github_star_gist","github_star_gist_v2","github_star_repo","github_star_repo_v2","github_status_check_rollup","github_trigger_workflow","github_trigger_workflow_v2","github_unstar_gist","github_unstar_gist_v2","github_unstar_repo","github_unstar_repo_v2","github_update_branch_protection","github_update_branch_protection_v2","github_update_comment","github_update_comment_v2","github_update_file","github_update_file_v2","github_update_gist","github_update_gist_v2","github_update_issue","github_update_issue_v2","github_update_milestone","github_update_milestone_v2","github_update_pr","github_update_pr_v2","github_update_project","github_update_project_v2","github_update_release","github_update_release_v2","gitlab_activate_user","gitlab_add_member","gitlab_add_saml_group_link","gitlab_approve_access_request","gitlab_approve_merge_request","gitlab_approve_user","gitlab_ban_user","gitlab_block_user","gitlab_cancel_pipeline","gitlab_compare_branches","gitlab_create_branch","gitlab_create_file","gitlab_create_issue","gitlab_create_issue_note","gitlab_create_merge_request","gitlab_create_merge_request_note","gitlab_create_pipeline","gitlab_create_release","gitlab_create_user","gitlab_deactivate_user","gitlab_delete_branch","gitlab_delete_issue","gitlab_delete_saml_group_link","gitlab_delete_user","gitlab_delete_user_identity","gitlab_deny_access_request","gitlab_get_file","gitlab_get_group","gitlab_get_issue","gitlab_get_job_log","gitlab_get_merge_request","gitlab_get_merge_request_changes","gitlab_get_pipeline","gitlab_get_project","gitlab_invite_member","gitlab_list_access_requests","gitlab_list_branches","gitlab_list_commits","gitlab_list_groups","gitlab_list_invitations","gitlab_list_issues","gitlab_list_members","gitlab_list_merge_requests","gitlab_list_pipeline_jobs","gitlab_list_pipelines","gitlab_list_projects","gitlab_list_releases","gitlab_list_repository_tree","gitlab_list_saml_group_links","gitlab_list_user_memberships","gitlab_merge_merge_request","gitlab_play_job","gitlab_reject_user","gitlab_remove_member","gitlab_retry_pipeline","gitlab_revoke_invitation","gitlab_search_users","gitlab_unban_user","gitlab_unblock_user","gitlab_update_file","gitlab_update_invitation","gitlab_update_issue","gitlab_update_member","gitlab_update_merge_request","gitlab_update_user","gmail_add_label","gmail_add_label_v2","gmail_archive","gmail_archive_v2","gmail_create_label_v2","gmail_delete","gmail_delete_draft_v2","gmail_delete_label_v2","gmail_delete_v2","gmail_draft","gmail_draft_v2","gmail_edit_draft_v2","gmail_get_draft_v2","gmail_get_thread_v2","gmail_list_drafts_v2","gmail_list_labels_v2","gmail_list_threads_v2","gmail_mark_read","gmail_mark_read_v2","gmail_mark_unread","gmail_mark_unread_v2","gmail_move","gmail_move_v2","gmail_read","gmail_read_v2","gmail_remove_label","gmail_remove_label_v2","gmail_search","gmail_search_v2","gmail_send","gmail_send_v2","gmail_trash_thread_v2","gmail_unarchive","gmail_unarchive_v2","gmail_untrash_thread_v2","gmail_update_label_v2","gong_aggregate_activity","gong_aggregate_by_period","gong_answered_scorecards","gong_ask_anything","gong_assign_flow_prospects","gong_create_call","gong_day_by_day_activity","gong_get_brief","gong_get_call","gong_get_call_transcript","gong_get_coaching","gong_get_extensive_calls","gong_get_folder_content","gong_get_logs","gong_get_prospect_flows","gong_get_user","gong_interaction_stats","gong_list_calls","gong_list_flows","gong_list_library_folders","gong_list_scorecards","gong_list_trackers","gong_list_users","gong_list_workspaces","gong_lookup_email","gong_lookup_phone","gong_purge_email_address","gong_purge_phone_number","gong_unassign_flow_prospects","google_ads_ad_performance","google_ads_campaign_performance","google_ads_list_ad_groups","google_ads_list_campaigns","google_ads_list_customers","google_ads_search","google_appsheet_add_rows","google_appsheet_delete_rows","google_appsheet_edit_rows","google_appsheet_find_rows","google_bigquery_create_dataset","google_bigquery_create_table","google_bigquery_delete_dataset","google_bigquery_delete_table","google_bigquery_get_query_results","google_bigquery_get_table","google_bigquery_insert_rows","google_bigquery_list_datasets","google_bigquery_list_table_data","google_bigquery_list_tables","google_bigquery_query","google_books_volume_details","google_books_volume_search","google_calendar_create","google_calendar_create_calendar","google_calendar_create_calendar_v2","google_calendar_create_v2","google_calendar_delete","google_calendar_delete_calendar","google_calendar_delete_calendar_v2","google_calendar_delete_v2","google_calendar_freebusy","google_calendar_freebusy_v2","google_calendar_get","google_calendar_get_v2","google_calendar_instances","google_calendar_instances_v2","google_calendar_invite","google_calendar_invite_v2","google_calendar_list","google_calendar_list_acl","google_calendar_list_acl_v2","google_calendar_list_calendars","google_calendar_list_calendars_v2","google_calendar_list_v2","google_calendar_move","google_calendar_move_v2","google_calendar_quick_add","google_calendar_quick_add_v2","google_calendar_share_calendar","google_calendar_share_calendar_v2","google_calendar_unshare_calendar","google_calendar_unshare_calendar_v2","google_calendar_update","google_calendar_update_acl","google_calendar_update_acl_v2","google_calendar_update_calendar","google_calendar_update_calendar_v2","google_calendar_update_v2","google_contacts_create","google_contacts_delete","google_contacts_get","google_contacts_list","google_contacts_search","google_contacts_update","google_docs_create","google_docs_create_named_range","google_docs_create_paragraph_bullets","google_docs_delete_content_range","google_docs_delete_named_range","google_docs_delete_paragraph_bullets","google_docs_insert_image","google_docs_insert_page_break","google_docs_insert_table","google_docs_insert_text","google_docs_read","google_docs_replace_text","google_docs_update_paragraph_style","google_docs_update_text_style","google_docs_write","google_drive_copy","google_drive_create_comment","google_drive_create_folder","google_drive_delete","google_drive_delete_comment","google_drive_download","google_drive_export","google_drive_get_about","google_drive_get_content","google_drive_get_file","google_drive_get_revision","google_drive_list","google_drive_list_comments","google_drive_list_permissions","google_drive_list_revisions","google_drive_move","google_drive_search","google_drive_share","google_drive_trash","google_drive_unshare","google_drive_untrash","google_drive_update","google_drive_upload","google_forms_batch_update","google_forms_create_form","google_forms_create_watch","google_forms_delete_watch","google_forms_get_form","google_forms_get_responses","google_forms_list_watches","google_forms_renew_watch","google_forms_set_publish_settings","google_groups_add_alias","google_groups_add_member","google_groups_create_group","google_groups_delete_group","google_groups_get_group","google_groups_get_member","google_groups_get_settings","google_groups_has_member","google_groups_list_aliases","google_groups_list_groups","google_groups_list_members","google_groups_remove_alias","google_groups_remove_member","google_groups_update_group","google_groups_update_member","google_groups_update_settings","google_maps_air_quality","google_maps_directions","google_maps_distance_matrix","google_maps_elevation","google_maps_geocode","google_maps_geolocate","google_maps_place_details","google_maps_places_nearby","google_maps_places_search","google_maps_pollen","google_maps_reverse_geocode","google_maps_snap_to_roads","google_maps_solar","google_maps_speed_limits","google_maps_timezone","google_maps_validate_address","google_meet_create_space","google_meet_end_conference","google_meet_get_conference_record","google_meet_get_space","google_meet_list_conference_records","google_meet_list_participants","google_pagespeed_analyze","google_search","google_sheets_append","google_sheets_append_v2","google_sheets_batch_clear_v2","google_sheets_batch_get_v2","google_sheets_batch_update_v2","google_sheets_clear_v2","google_sheets_copy_sheet_v2","google_sheets_create_spreadsheet_v2","google_sheets_delete_rows_v2","google_sheets_delete_sheet_v2","google_sheets_delete_spreadsheet_v2","google_sheets_get_spreadsheet_v2","google_sheets_read","google_sheets_read_v2","google_sheets_update","google_sheets_update_v2","google_sheets_write","google_sheets_write_v2","google_slides_add_image","google_slides_add_slide","google_slides_batch_update","google_slides_copy_presentation","google_slides_create","google_slides_create_line","google_slides_create_paragraph_bullets","google_slides_create_shape","google_slides_create_sheets_chart","google_slides_create_table","google_slides_create_video","google_slides_delete_object","google_slides_delete_paragraph_bullets","google_slides_delete_table_column","google_slides_delete_table_row","google_slides_delete_text","google_slides_duplicate_object","google_slides_export_presentation","google_slides_get_page","google_slides_get_thumbnail","google_slides_group_objects","google_slides_insert_table_columns","google_slides_insert_table_rows","google_slides_insert_text","google_slides_merge_table_cells","google_slides_read","google_slides_refresh_sheets_chart","google_slides_replace_all_shapes_with_image","google_slides_replace_all_shapes_with_sheets_chart","google_slides_replace_all_text","google_slides_replace_image","google_slides_reroute_line","google_slides_ungroup_objects","google_slides_unmerge_table_cells","google_slides_update_image_properties","google_slides_update_line_category","google_slides_update_line_properties","google_slides_update_page_element_alt_text","google_slides_update_page_element_transform","google_slides_update_page_elements_z_order","google_slides_update_page_properties","google_slides_update_paragraph_style","google_slides_update_shape_properties","google_slides_update_slide_properties","google_slides_update_slides_position","google_slides_update_table_border_properties","google_slides_update_table_cell_properties","google_slides_update_table_column_properties","google_slides_update_table_row_properties","google_slides_update_text_style","google_slides_update_video_properties","google_slides_write","google_tasks_create","google_tasks_delete","google_tasks_get","google_tasks_list","google_tasks_list_task_lists","google_tasks_update","google_translate_detect","google_translate_text","google_vault_add_held_accounts","google_vault_add_matters_permissions","google_vault_close_matters","google_vault_create_matters","google_vault_create_matters_export","google_vault_create_matters_holds","google_vault_create_saved_query","google_vault_delete_matters","google_vault_delete_matters_export","google_vault_delete_matters_holds","google_vault_delete_saved_query","google_vault_download_export_file","google_vault_list_matters","google_vault_list_matters_export","google_vault_list_matters_holds","google_vault_list_saved_queries","google_vault_remove_held_accounts","google_vault_remove_matters_permissions","google_vault_reopen_matters","google_vault_undelete_matters","google_vault_update_matters","google_vault_update_matters_holds","grafana_check_data_source_health","grafana_create_alert_rule","grafana_create_annotation","grafana_create_contact_point","grafana_create_dashboard","grafana_create_folder","grafana_delete_alert_rule","grafana_delete_annotation","grafana_delete_contact_point","grafana_delete_dashboard","grafana_delete_folder","grafana_get_alert_rule","grafana_get_alert_rule_group","grafana_get_dashboard","grafana_get_data_source","grafana_get_folder","grafana_get_health","grafana_list_alert_rules","grafana_list_annotations","grafana_list_contact_points","grafana_list_dashboards","grafana_list_data_sources","grafana_list_folders","grafana_move_folder","grafana_query_data_source","grafana_update_alert_rule","grafana_update_annotation","grafana_update_contact_point","grafana_update_dashboard","grafana_update_folder","grain_create_hook","grain_create_hook_v2","grain_delete_hook","grain_delete_hook_v2","grain_get_recording","grain_get_transcript","grain_list_hooks","grain_list_hooks_v2","grain_list_meeting_types","grain_list_recordings","grain_list_teams","grain_list_views","granola_create_webhook_endpoint","granola_delete_webhook_endpoint","granola_get_note","granola_get_transcript","granola_list_audit_events","granola_list_folders","granola_list_notes","granola_list_webhook_endpoints","granola_update_webhook_endpoint","greenhouse_get_application","greenhouse_get_candidate","greenhouse_get_job","greenhouse_get_user","greenhouse_list_applications","greenhouse_list_candidates","greenhouse_list_departments","greenhouse_list_job_stages","greenhouse_list_jobs","greenhouse_list_offices","greenhouse_list_users","greptile_index_repo","greptile_query","greptile_search","greptile_status","guardrails_validate","harmonic_batch_get_people","harmonic_clear_people_saved_search_net_new_results","harmonic_enrich_person","harmonic_get_company_employees","harmonic_get_email_enrichment_job","harmonic_get_email_enrichment_usage","harmonic_get_enrichment_status","harmonic_get_people_saved_search_net_new_results","harmonic_get_people_saved_search_results","harmonic_get_person","harmonic_list_people_saved_searches","harmonic_search_people_scout","harmonic_submit_email_enrichment_job","hex_cancel_run","hex_create_collection","hex_create_group","hex_deactivate_user","hex_delete_group","hex_get_collection","hex_get_data_connection","hex_get_group","hex_get_project","hex_get_project_runs","hex_get_queried_tables","hex_get_run_status","hex_list_collections","hex_list_data_connections","hex_list_groups","hex_list_projects","hex_list_users","hex_run_project","hex_update_collection","hex_update_group","hex_update_project","http_request","hubspot_add_list_memberships","hubspot_create_appointment","hubspot_create_association","hubspot_create_company","hubspot_create_contact","hubspot_create_deal","hubspot_create_email","hubspot_create_line_item","hubspot_create_list","hubspot_create_note","hubspot_create_ticket","hubspot_delete_association","hubspot_delete_company","hubspot_delete_contact","hubspot_delete_deal","hubspot_delete_line_item","hubspot_delete_ticket","hubspot_get_appointment","hubspot_get_association_labels","hubspot_get_cart","hubspot_get_company","hubspot_get_contact","hubspot_get_deal","hubspot_get_email","hubspot_get_line_item","hubspot_get_list","hubspot_get_list_memberships","hubspot_get_marketing_event","hubspot_get_note","hubspot_get_properties","hubspot_get_quote","hubspot_get_ticket","hubspot_get_users","hubspot_list_appointments","hubspot_list_associations","hubspot_list_carts","hubspot_list_companies","hubspot_list_contacts","hubspot_list_deals","hubspot_list_emails","hubspot_list_line_items","hubspot_list_lists","hubspot_list_marketing_events","hubspot_list_notes","hubspot_list_owners","hubspot_list_quotes","hubspot_list_tickets","hubspot_remove_list_memberships","hubspot_search_companies","hubspot_search_contacts","hubspot_search_deals","hubspot_search_emails","hubspot_search_line_items","hubspot_search_notes","hubspot_search_quotes","hubspot_search_tickets","hubspot_update_appointment","hubspot_update_company","hubspot_update_contact","hubspot_update_deal","hubspot_update_line_item","hubspot_update_ticket","huggingface_chat","hunter_companies_find","hunter_discover","hunter_domain_search","hunter_email_count","hunter_email_finder","hunter_email_verifier","iam_add_user_to_group","iam_attach_role_policy","iam_attach_user_policy","iam_create_access_key","iam_create_role","iam_create_user","iam_delete_access_key","iam_delete_role","iam_delete_user","iam_detach_role_policy","iam_detach_user_policy","iam_get_role","iam_get_user","iam_list_attached_role_policies","iam_list_attached_user_policies","iam_list_groups","iam_list_policies","iam_list_roles","iam_list_users","iam_remove_user_from_group","iam_simulate_principal_policy","icypeas_find_email","icypeas_verify_email","identity_center_check_assignment_deletion_status","identity_center_check_assignment_status","identity_center_create_account_assignment","identity_center_delete_account_assignment","identity_center_describe_account","identity_center_get_group","identity_center_get_user","identity_center_list_account_assignments","identity_center_list_accounts","identity_center_list_groups","identity_center_list_instances","identity_center_list_permission_sets","image_generate","incidentio_actions_create","incidentio_actions_list","incidentio_actions_show","incidentio_actions_update","incidentio_alert_events_create","incidentio_alerts_list","incidentio_alerts_resolve","incidentio_alerts_show","incidentio_catalog_entries_list","incidentio_catalog_types_list","incidentio_custom_fields_create","incidentio_custom_fields_delete","incidentio_custom_fields_list","incidentio_custom_fields_show","incidentio_custom_fields_update","incidentio_escalation_paths_create","incidentio_escalation_paths_delete","incidentio_escalation_paths_list","incidentio_escalation_paths_show","incidentio_escalation_paths_update","incidentio_escalations_cancel","incidentio_escalations_create","incidentio_escalations_list","incidentio_escalations_show","incidentio_follow_ups_create","incidentio_follow_ups_list","incidentio_follow_ups_show","incidentio_follow_ups_update","incidentio_incident_alerts_list","incidentio_incident_memberships_create","incidentio_incident_memberships_revoke","incidentio_incident_participants_list","incidentio_incident_roles_create","incidentio_incident_roles_delete","incidentio_incident_roles_list","incidentio_incident_roles_show","incidentio_incident_roles_update","incidentio_incident_statuses_list","incidentio_incident_timestamps_list","incidentio_incident_timestamps_show","incidentio_incident_types_list","incidentio_incident_updates_list","incidentio_incidents_create","incidentio_incidents_list","incidentio_incidents_show","incidentio_incidents_update","incidentio_on_call_now","incidentio_schedule_entries_list","incidentio_schedule_overrides_create","incidentio_schedule_overrides_list","incidentio_schedules_create","incidentio_schedules_delete","incidentio_schedules_list","incidentio_schedules_show","incidentio_schedules_update","incidentio_severities_list","incidentio_teams_list","incidentio_teams_show","incidentio_users_list","incidentio_users_show","incidentio_workflows_create","incidentio_workflows_delete","incidentio_workflows_list","incidentio_workflows_show","incidentio_workflows_update","infisical_create_secret","infisical_delete_secret","infisical_get_secret","infisical_list_secrets","infisical_update_secret","instagram_delete_comment","instagram_download_media","instagram_get_account_insights","instagram_get_container_status","instagram_get_conversation_messages","instagram_get_media","instagram_get_media_insights","instagram_get_message","instagram_get_profile","instagram_get_publishing_limit","instagram_hide_comment","instagram_list_comments","instagram_list_conversations","instagram_list_media","instagram_list_stories","instagram_private_reply","instagram_publish_carousel","instagram_publish_image","instagram_publish_reel","instagram_publish_story","instagram_publish_video","instagram_reply_to_comment","instagram_send_text_message","instagram_set_comments_enabled","instantly_activate_campaign","instantly_create_campaign","instantly_create_lead","instantly_create_lead_list","instantly_delete_campaign","instantly_delete_leads","instantly_get_lead","instantly_list_campaigns","instantly_list_emails","instantly_list_lead_lists","instantly_list_leads","instantly_patch_campaign","instantly_patch_lead","instantly_pause_campaign","instantly_reply_to_email","instantly_update_lead_interest_status","intercom_assign_conversation_v2","intercom_attach_contact_to_company_v2","intercom_close_conversation_v2","intercom_create_company","intercom_create_company_v2","intercom_create_contact","intercom_create_contact_v2","intercom_create_event_v2","intercom_create_message","intercom_create_message_v2","intercom_create_note_v2","intercom_create_tag_v2","intercom_create_ticket","intercom_create_ticket_v2","intercom_delete_contact","intercom_delete_contact_v2","intercom_detach_contact_from_company_v2","intercom_get_company","intercom_get_company_v2","intercom_get_contact","intercom_get_contact_v2","intercom_get_conversation","intercom_get_conversation_v2","intercom_get_ticket","intercom_get_ticket_v2","intercom_list_admins_v2","intercom_list_companies","intercom_list_companies_v2","intercom_list_contacts","intercom_list_contacts_v2","intercom_list_conversations","intercom_list_conversations_v2","intercom_list_tags_v2","intercom_open_conversation_v2","intercom_reply_conversation","intercom_reply_conversation_v2","intercom_search_contacts","intercom_search_contacts_v2","intercom_search_conversations","intercom_search_conversations_v2","intercom_snooze_conversation_v2","intercom_tag_contact_v2","intercom_tag_conversation_v2","intercom_untag_contact_v2","intercom_update_contact","intercom_update_contact_v2","intercom_update_ticket_v2","jina_read_url","jina_search","jira_add_attachment","jira_add_comment","jira_add_watcher","jira_add_worklog","jira_assign_issue","jira_bulk_read","jira_create_issue_link","jira_delete_attachment","jira_delete_comment","jira_delete_issue","jira_delete_issue_link","jira_delete_worklog","jira_get_attachments","jira_get_comments","jira_get_fields","jira_get_project","jira_get_transitions","jira_get_users","jira_get_worklogs","jira_list_issue_types","jira_list_projects","jira_remove_watcher","jira_retrieve","jira_search_issues","jira_search_users","jira_transition_issue","jira_update","jira_update_comment","jira_update_worklog","jira_write","jotform_add_label_resources","jotform_clone_form","jotform_create_form","jotform_create_label","jotform_create_question","jotform_create_questions","jotform_create_report","jotform_create_submission","jotform_create_submissions","jotform_create_webhook","jotform_delete_form","jotform_delete_label","jotform_delete_question","jotform_delete_report","jotform_delete_submission","jotform_delete_webhook","jotform_get_form","jotform_get_form_properties","jotform_get_history","jotform_get_label","jotform_get_question","jotform_get_report","jotform_get_settings","jotform_get_submission","jotform_get_usage","jotform_get_user","jotform_list_form_files","jotform_list_form_reports","jotform_list_form_submissions","jotform_list_forms","jotform_list_label_resources","jotform_list_labels","jotform_list_questions","jotform_list_reports","jotform_list_submissions","jotform_list_subusers","jotform_list_webhooks","jotform_remove_label_resources","jotform_update_form_properties","jotform_update_label","jotform_update_question","jotform_update_settings","jotform_update_submission","jsm_add_comment","jsm_add_customer","jsm_add_organization","jsm_add_participants","jsm_answer_approval","jsm_attach_form","jsm_copy_forms","jsm_create_object","jsm_create_organization","jsm_create_request","jsm_delete_form","jsm_delete_object","jsm_externalise_form","jsm_get_approvals","jsm_get_comments","jsm_get_customers","jsm_get_form","jsm_get_form_answers","jsm_get_form_structure","jsm_get_form_templates","jsm_get_issue_forms","jsm_get_object","jsm_get_object_schema","jsm_get_object_type_attributes","jsm_get_organizations","jsm_get_participants","jsm_get_queues","jsm_get_request","jsm_get_request_type_fields","jsm_get_request_types","jsm_get_requests","jsm_get_service_desks","jsm_get_sla","jsm_get_transitions","jsm_internalise_form","jsm_list_object_schemas","jsm_list_object_types","jsm_reopen_form","jsm_save_form_answers","jsm_search_objects_aql","jsm_submit_form","jsm_transition_request","jsm_update_object","jupyter_copy_content","jupyter_create_file","jupyter_create_session","jupyter_delete_content","jupyter_delete_session","jupyter_get_content","jupyter_interrupt_kernel","jupyter_list_contents","jupyter_list_kernels","jupyter_list_kernelspecs","jupyter_list_sessions","jupyter_rename_content","jupyter_restart_kernel","jupyter_start_kernel","jupyter_stop_kernel","jupyter_upload_file","kalshi_amend_order","kalshi_amend_order_v2","kalshi_cancel_order","kalshi_cancel_order_v2","kalshi_create_order","kalshi_create_order_v2","kalshi_get_balance","kalshi_get_balance_v2","kalshi_get_candlesticks","kalshi_get_candlesticks_v2","kalshi_get_event","kalshi_get_event_candlesticks","kalshi_get_event_candlesticks_v2","kalshi_get_event_v2","kalshi_get_events","kalshi_get_events_v2","kalshi_get_exchange_announcements","kalshi_get_exchange_announcements_v2","kalshi_get_exchange_schedule","kalshi_get_exchange_schedule_v2","kalshi_get_exchange_status","kalshi_get_exchange_status_v2","kalshi_get_fills","kalshi_get_fills_v2","kalshi_get_market","kalshi_get_market_v2","kalshi_get_markets","kalshi_get_markets_v2","kalshi_get_order","kalshi_get_order_v2","kalshi_get_orderbook","kalshi_get_orderbook_v2","kalshi_get_orders","kalshi_get_orders_v2","kalshi_get_positions","kalshi_get_positions_v2","kalshi_get_series_by_ticker","kalshi_get_series_by_ticker_v2","kalshi_get_series_list","kalshi_get_series_list_v2","kalshi_get_settlements","kalshi_get_settlements_v2","kalshi_get_trades","kalshi_get_trades_v2","ketch_get_consent","ketch_get_subscriptions","ketch_invoke_right","ketch_set_consent","ketch_set_subscriptions","knowledge_create_document","knowledge_delete_chunk","knowledge_delete_document","knowledge_get_connector","knowledge_get_document","knowledge_list_chunks","knowledge_list_connectors","knowledge_list_documents","knowledge_list_tags","knowledge_search","knowledge_trigger_sync","knowledge_update_chunk","knowledge_upload_chunk","knowledge_upsert_document","lambda_add_permission","lambda_create_alias","lambda_create_event_source_mapping","lambda_create_function","lambda_create_function_url_config","lambda_delete_alias","lambda_delete_event_source_mapping","lambda_delete_function","lambda_delete_function_concurrency","lambda_delete_function_event_invoke_config","lambda_delete_function_url_config","lambda_delete_provisioned_concurrency_config","lambda_get_account_settings","lambda_get_alias","lambda_get_event_source_mapping","lambda_get_function","lambda_get_function_concurrency","lambda_get_function_configuration","lambda_get_function_event_invoke_config","lambda_get_function_recursion_config","lambda_get_function_url_config","lambda_get_layer_version","lambda_get_policy","lambda_get_provisioned_concurrency_config","lambda_get_runtime_management_config","lambda_invoke","lambda_list_aliases","lambda_list_event_source_mappings","lambda_list_function_event_invoke_configs","lambda_list_function_url_configs","lambda_list_functions","lambda_list_layer_versions","lambda_list_layers","lambda_list_provisioned_concurrency_configs","lambda_list_tags","lambda_list_versions_by_function","lambda_publish_version","lambda_put_function_concurrency","lambda_put_function_event_invoke_config","lambda_put_function_recursion_config","lambda_put_provisioned_concurrency_config","lambda_put_runtime_management_config","lambda_remove_permission","lambda_tag_resource","lambda_untag_resource","lambda_update_alias","lambda_update_event_source_mapping","lambda_update_function_code","lambda_update_function_configuration","lambda_update_function_url_config","langsmith_create_feedback","langsmith_create_run","langsmith_create_runs_batch","langsmith_get_run","langsmith_update_run","latex_compile","latex_get_package","latex_list_fonts","latex_search_packages","launchdarkly_create_flag","launchdarkly_delete_flag","launchdarkly_get_audit_log","launchdarkly_get_flag","launchdarkly_get_flag_status","launchdarkly_list_environments","launchdarkly_list_flags","launchdarkly_list_members","launchdarkly_list_projects","launchdarkly_list_segments","launchdarkly_toggle_flag","launchdarkly_update_flag","leadmagic_company_search","leadmagic_email_to_profile","leadmagic_find_email","leadmagic_find_mobile","leadmagic_get_credits","leadmagic_profile_search","leadmagic_profile_to_email","leadmagic_role_finder","leadmagic_validate_email","lemlist_get_activities","lemlist_get_lead","lemlist_send_email","linear_add_label_to_issue","linear_add_label_to_project","linear_archive_issue","linear_archive_label","linear_archive_project","linear_create_attachment","linear_create_comment","linear_create_customer","linear_create_customer_request","linear_create_customer_status","linear_create_customer_tier","linear_create_cycle","linear_create_favorite","linear_create_issue","linear_create_issue_relation","linear_create_label","linear_create_project","linear_create_project_label","linear_create_project_milestone","linear_create_project_status","linear_create_project_update","linear_create_workflow_state","linear_delete_attachment","linear_delete_comment","linear_delete_customer","linear_delete_customer_status","linear_delete_customer_tier","linear_delete_issue","linear_delete_issue_relation","linear_delete_project","linear_delete_project_label","linear_delete_project_milestone","linear_delete_project_status","linear_get_active_cycle","linear_get_customer","linear_get_cycle","linear_get_issue","linear_get_project","linear_get_viewer","linear_list_attachments","linear_list_comments","linear_list_customer_requests","linear_list_customer_statuses","linear_list_customer_tiers","linear_list_customers","linear_list_cycles","linear_list_favorites","linear_list_issue_relations","linear_list_labels","linear_list_notifications","linear_list_project_labels","linear_list_project_milestones","linear_list_project_statuses","linear_list_project_updates","linear_list_projects","linear_list_teams","linear_list_users","linear_list_workflow_states","linear_merge_customers","linear_read_issues","linear_remove_label_from_issue","linear_remove_label_from_project","linear_search_issues","linear_unarchive_issue","linear_update_attachment","linear_update_comment","linear_update_customer","linear_update_customer_request","linear_update_customer_status","linear_update_customer_tier","linear_update_issue","linear_update_label","linear_update_notification","linear_update_project","linear_update_project_label","linear_update_project_milestone","linear_update_project_status","linear_update_workflow_state","linkedin_get_profile","linkedin_share_post","linkup_search","linq_add_participant","linq_check_imessage","linq_check_rcs","linq_create_attachment","linq_create_chat","linq_create_contact_card","linq_create_webhook_subscription","linq_delete_attachment","linq_delete_message","linq_delete_webhook_subscription","linq_edit_message","linq_get_attachment","linq_get_chat","linq_get_contact_card","linq_get_message","linq_get_webhook_subscription","linq_leave_chat","linq_list_chats","linq_list_messages","linq_list_phone_numbers","linq_list_thread","linq_list_webhook_events","linq_list_webhook_subscriptions","linq_mark_chat_read","linq_react_to_message","linq_remove_participant","linq_send_message","linq_send_voice_memo","linq_share_contact_card","linq_start_typing","linq_stop_typing","linq_update_chat","linq_update_contact_card","linq_update_webhook_subscription","llm_chat","logfire_get_token_info","logfire_get_trace","logfire_query","logfire_search_records","logrocket_create_release","logrocket_get_audit_logs","logrocket_get_highlights","logrocket_identify_user","logrocket_list_exported_sessions","logrocket_request_highlights","logs_get","logs_get_execution","logs_get_run_details","logs_query","logs_query_runs","loops_check_contact_suppression","loops_create_contact","loops_create_contact_property","loops_delete_contact","loops_find_contact","loops_get_transactional_email","loops_list_contact_properties","loops_list_mailing_lists","loops_list_transactional_emails","loops_remove_contact_suppression","loops_send_event","loops_send_transactional_email","loops_update_contact","luma_add_guests","luma_cancel_event","luma_create_event","luma_get_event","luma_get_guest","luma_get_guests","luma_list_events","luma_lookup_event","luma_send_invites","luma_update_event","luma_update_guest_status","mailchimp_add_member","mailchimp_add_member_tags","mailchimp_add_or_update_member","mailchimp_add_segment_member","mailchimp_add_subscriber_to_automation","mailchimp_archive_member","mailchimp_create_audience","mailchimp_create_batch_operation","mailchimp_create_campaign","mailchimp_create_interest","mailchimp_create_interest_category","mailchimp_create_landing_page","mailchimp_create_merge_field","mailchimp_create_segment","mailchimp_create_template","mailchimp_delete_audience","mailchimp_delete_batch_operation","mailchimp_delete_campaign","mailchimp_delete_interest","mailchimp_delete_interest_category","mailchimp_delete_landing_page","mailchimp_delete_member","mailchimp_delete_merge_field","mailchimp_delete_segment","mailchimp_delete_template","mailchimp_get_audience","mailchimp_get_audiences","mailchimp_get_automation","mailchimp_get_automations","mailchimp_get_batch_operation","mailchimp_get_batch_operations","mailchimp_get_campaign","mailchimp_get_campaign_content","mailchimp_get_campaign_report","mailchimp_get_campaign_reports","mailchimp_get_campaigns","mailchimp_get_interest","mailchimp_get_interest_categories","mailchimp_get_interest_category","mailchimp_get_interests","mailchimp_get_landing_page","mailchimp_get_landing_pages","mailchimp_get_member","mailchimp_get_member_tags","mailchimp_get_members","mailchimp_get_merge_field","mailchimp_get_merge_fields","mailchimp_get_segment","mailchimp_get_segment_members","mailchimp_get_segments","mailchimp_get_template","mailchimp_get_templates","mailchimp_pause_automation","mailchimp_publish_landing_page","mailchimp_remove_member_tags","mailchimp_remove_segment_member","mailchimp_replicate_campaign","mailchimp_schedule_campaign","mailchimp_send_campaign","mailchimp_set_campaign_content","mailchimp_start_automation","mailchimp_unarchive_member","mailchimp_unpublish_landing_page","mailchimp_unschedule_campaign","mailchimp_update_audience","mailchimp_update_campaign","mailchimp_update_interest","mailchimp_update_interest_category","mailchimp_update_landing_page","mailchimp_update_member","mailchimp_update_merge_field","mailchimp_update_segment","mailchimp_update_template","mailgun_add_list_member","mailgun_create_mailing_list","mailgun_get_domain","mailgun_get_mailing_list","mailgun_get_message","mailgun_list_domains","mailgun_list_messages","mailgun_send_message","managed_agent_archive_session","managed_agent_create_session","managed_agent_delete_session","managed_agent_get_session","managed_agent_interrupt_session","managed_agent_list_events","managed_agent_respond_custom_tool","managed_agent_respond_tool_confirmation","managed_agent_run_session","managed_agent_send_message","managed_agent_update_session","manageengine_sdp_add_change_note","manageengine_sdp_add_problem_note","manageengine_sdp_add_request_note","manageengine_sdp_create_asset","manageengine_sdp_create_change","manageengine_sdp_create_problem","manageengine_sdp_create_request","manageengine_sdp_create_solution","manageengine_sdp_delete_asset","manageengine_sdp_delete_change","manageengine_sdp_delete_problem","manageengine_sdp_delete_request","manageengine_sdp_delete_solution","manageengine_sdp_get_asset","manageengine_sdp_get_change","manageengine_sdp_get_problem","manageengine_sdp_get_request","manageengine_sdp_get_solution","manageengine_sdp_list_assets","manageengine_sdp_list_change_notes","manageengine_sdp_list_changes","manageengine_sdp_list_problem_notes","manageengine_sdp_list_problems","manageengine_sdp_list_request_notes","manageengine_sdp_list_requests","manageengine_sdp_list_solutions","manageengine_sdp_update_asset","manageengine_sdp_update_change","manageengine_sdp_update_problem","manageengine_sdp_update_request","manageengine_sdp_update_solution","mem0_add_memories","mem0_get_memories","mem0_search_memories","memory_add","memory_delete","memory_get","memory_get_all","microsoft_ad_add_directory_role_member","microsoft_ad_add_group_member","microsoft_ad_add_user_app_role_assignment","microsoft_ad_assign_license","microsoft_ad_create_group","microsoft_ad_create_user","microsoft_ad_delete_group","microsoft_ad_delete_user","microsoft_ad_get_conditional_access_policy","microsoft_ad_get_device","microsoft_ad_get_group","microsoft_ad_get_user","microsoft_ad_list_authentication_methods","microsoft_ad_list_conditional_access_policies","microsoft_ad_list_devices","microsoft_ad_list_directory_audits","microsoft_ad_list_directory_role_members","microsoft_ad_list_directory_roles","microsoft_ad_list_group_members","microsoft_ad_list_groups","microsoft_ad_list_service_principal_app_role_assignments","microsoft_ad_list_service_principals","microsoft_ad_list_sign_ins","microsoft_ad_list_subscribed_skus","microsoft_ad_list_user_app_role_assignments","microsoft_ad_list_user_devices","microsoft_ad_list_user_licenses","microsoft_ad_list_users","microsoft_ad_remove_directory_role_member","microsoft_ad_remove_group_member","microsoft_ad_remove_user_app_role_assignment","microsoft_ad_reset_password","microsoft_ad_revoke_sign_in_sessions","microsoft_ad_set_password","microsoft_ad_update_group","microsoft_ad_update_user","microsoft_dataverse_associate","microsoft_dataverse_create_multiple","microsoft_dataverse_create_record","microsoft_dataverse_delete_record","microsoft_dataverse_disassociate","microsoft_dataverse_download_file","microsoft_dataverse_execute_action","microsoft_dataverse_execute_function","microsoft_dataverse_fetchxml_query","microsoft_dataverse_get_entity_metadata","microsoft_dataverse_get_record","microsoft_dataverse_list_records","microsoft_dataverse_search","microsoft_dataverse_update_multiple","microsoft_dataverse_update_record","microsoft_dataverse_upload_file","microsoft_dataverse_upsert_record","microsoft_dataverse_whoami","microsoft_dynamics_365_close_case","microsoft_dynamics_365_close_opportunity","microsoft_dynamics_365_create_record","microsoft_dynamics_365_get_record","microsoft_dynamics_365_list_records","microsoft_dynamics_365_qualify_lead","microsoft_dynamics_365_search_records","microsoft_dynamics_365_update_record","microsoft_excel_clear_range","microsoft_excel_create_table","microsoft_excel_delete_worksheet","microsoft_excel_format_range","microsoft_excel_read","microsoft_excel_read_v2","microsoft_excel_sort_range","microsoft_excel_table_add","microsoft_excel_worksheet_add","microsoft_excel_write","microsoft_excel_write_v2","microsoft_planner_create_bucket","microsoft_planner_create_plan","microsoft_planner_create_task","microsoft_planner_delete_bucket","microsoft_planner_delete_plan","microsoft_planner_delete_task","microsoft_planner_get_plan_details","microsoft_planner_get_task_details","microsoft_planner_list_buckets","microsoft_planner_list_plans","microsoft_planner_read_bucket","microsoft_planner_read_plan","microsoft_planner_read_task","microsoft_planner_update_bucket","microsoft_planner_update_plan","microsoft_planner_update_plan_details","microsoft_planner_update_task","microsoft_planner_update_task_details","microsoft_teams_delete_channel_message","microsoft_teams_delete_chat_message","microsoft_teams_get_message","microsoft_teams_list_channel_members","microsoft_teams_list_channels","microsoft_teams_list_chat_members","microsoft_teams_list_chats","microsoft_teams_list_team_members","microsoft_teams_list_teams","microsoft_teams_read_channel","microsoft_teams_read_chat","microsoft_teams_reply_to_message","microsoft_teams_set_reaction","microsoft_teams_unset_reaction","microsoft_teams_update_channel_message","microsoft_teams_update_chat_message","microsoft_teams_write_channel","microsoft_teams_write_chat","microsoft_word_append","microsoft_word_create","microsoft_word_create_from_template","microsoft_word_export_pdf","microsoft_word_list","microsoft_word_read","microsoft_word_replace_text","microsoft_word_update","millionverifier_get_credits","millionverifier_verify_email","mintlify_create_agent_job","mintlify_create_assistant_message","mintlify_detect_ai_prose","mintlify_get_agent_job","mintlify_get_assistant_caller_stats","mintlify_get_assistant_conversations","mintlify_get_feedback","mintlify_get_feedback_by_page","mintlify_get_page_content","mintlify_get_searches","mintlify_get_update_status","mintlify_get_views","mintlify_get_visitors","mintlify_search","mintlify_send_agent_message","mintlify_trigger_automation","mintlify_trigger_preview","mintlify_trigger_update","mistral_parser","mistral_parser_v2","mistral_parser_v3","modal_call_function","modal_chat_completion","modal_list_models","monday_archive_item","monday_change_column_value","monday_create_board","monday_create_column","monday_create_group","monday_create_item","monday_create_subitem","monday_create_update","monday_delete_item","monday_duplicate_item","monday_get_board","monday_get_groups","monday_get_item","monday_get_items","monday_list_boards","monday_move_item_to_group","monday_search_items","monday_update_item","mongodb_delete","mongodb_execute","mongodb_insert","mongodb_introspect","mongodb_query","mongodb_update","mssql_delete","mssql_execute","mssql_insert","mssql_introspect","mssql_query","mssql_update","mysql_delete","mysql_execute","mysql_insert","mysql_introspect","mysql_query","mysql_update","neo4j_create","neo4j_delete","neo4j_execute","neo4j_introspect","neo4j_merge","neo4j_query","neo4j_update","netsuite_attach_record","netsuite_batch_create_records","netsuite_batch_delete_records","netsuite_batch_get_records","netsuite_batch_update_records","netsuite_batch_upsert_records","netsuite_create_record","netsuite_delete_record","netsuite_detach_record","netsuite_execute_action","netsuite_execute_dataset","netsuite_execute_suiteql","netsuite_get_async_result","netsuite_get_async_status","netsuite_get_governance_limits","netsuite_get_record","netsuite_get_record_form","netsuite_get_record_metadata","netsuite_get_select_options","netsuite_get_server_time","netsuite_get_subresource","netsuite_list_datasets","netsuite_list_record_types","netsuite_list_records","netsuite_transform_record","netsuite_update_record","netsuite_upsert_record","neverbounce_get_credits","neverbounce_verify_email","new_relic_create_deployment_event","new_relic_get_entity","new_relic_nrql_query","new_relic_search_entities","notion_add_database_row","notion_add_database_row_v2","notion_append_blocks","notion_append_blocks_v2","notion_create_comment","notion_create_comment_v2","notion_create_database","notion_create_database_v2","notion_create_page","notion_create_page_v2","notion_delete_block","notion_delete_block_v2","notion_list_comments","notion_list_comments_v2","notion_list_users","notion_list_users_v2","notion_query_database","notion_query_database_v2","notion_read","notion_read_database","notion_read_database_v2","notion_read_v2","notion_retrieve_block","notion_retrieve_block_children","notion_retrieve_block_children_v2","notion_retrieve_block_v2","notion_retrieve_user","notion_retrieve_user_v2","notion_search","notion_search_v2","notion_update_block","notion_update_block_v2","notion_update_page","notion_update_page_v2","notion_write","notion_write_v2","obsidian_append_active","obsidian_append_note","obsidian_append_periodic_note","obsidian_create_note","obsidian_delete_note","obsidian_execute_command","obsidian_get_active","obsidian_get_note","obsidian_get_periodic_note","obsidian_list_commands","obsidian_list_files","obsidian_open_file","obsidian_patch_active","obsidian_patch_note","obsidian_search","okta_activate_group_rule","okta_activate_user","okta_add_user_to_group","okta_assign_group_to_app","okta_assign_user_role","okta_assign_user_to_app","okta_clear_user_sessions","okta_create_group","okta_create_group_rule","okta_create_user","okta_deactivate_group_rule","okta_deactivate_user","okta_delete_group","okta_delete_group_rule","okta_delete_user","okta_enroll_factor","okta_get_app","okta_get_factor","okta_get_group","okta_get_group_rule","okta_get_logs","okta_get_session","okta_get_user","okta_list_app_groups","okta_list_app_users","okta_list_apps","okta_list_factors","okta_list_group_members","okta_list_group_rules","okta_list_groups","okta_list_user_roles","okta_list_users","okta_remove_group_from_app","okta_remove_user_from_app","okta_remove_user_from_group","okta_remove_user_role","okta_reset_all_factors","okta_reset_factor","okta_reset_password","okta_revoke_session","okta_suspend_user","okta_unsuspend_user","okta_update_group","okta_update_user","onedrive_copy","onedrive_create_folder","onedrive_create_share_link","onedrive_delete","onedrive_download","onedrive_get_drive_info","onedrive_get_item","onedrive_list","onedrive_move","onedrive_search","onedrive_upload","onepassword_create_item","onepassword_delete_item","onepassword_get_item","onepassword_get_item_file","onepassword_get_vault","onepassword_list_items","onepassword_list_vaults","onepassword_replace_item","onepassword_resolve_secret","onepassword_update_item","openai_embeddings","openai_image","oracle_epm_edm_assign_request","oracle_epm_edm_browse_hierarchy","oracle_epm_edm_create_request","oracle_epm_edm_delete_request","oracle_epm_edm_export_dimension","oracle_epm_edm_export_mappings","oracle_epm_edm_extract_dimension_viewpoint","oracle_epm_edm_generate_request_attachment","oracle_epm_edm_get_job_result","oracle_epm_edm_get_job_status","oracle_epm_edm_get_mapping_keys","oracle_epm_edm_get_node","oracle_epm_edm_get_node_at_location","oracle_epm_edm_get_node_type","oracle_epm_edm_get_request","oracle_epm_edm_get_request_lineage","oracle_epm_edm_import_dimension","oracle_epm_edm_import_request_attachment","oracle_epm_edm_incremental_export_dimension","oracle_epm_edm_list_applications","oracle_epm_edm_list_dimensions","oracle_epm_edm_list_node_types","oracle_epm_edm_list_nodes","oracle_epm_edm_list_viewpoints","oracle_epm_edm_list_views","oracle_epm_edm_load_viewpoint","oracle_epm_edm_query_requests","oracle_epm_edm_transition_request","oracle_epm_edm_upload_request_attachment","oracle_epm_edm_validate_viewpoint","outlook_calendar_create_event","outlook_calendar_delete_event","outlook_calendar_get_event","outlook_calendar_list_events","outlook_calendar_respond","outlook_calendar_update_event","outlook_copy","outlook_create_folder","outlook_delete","outlook_draft","outlook_forward","outlook_get_attachment","outlook_list_attachments","outlook_list_folders","outlook_mark_read","outlook_mark_unread","outlook_move","outlook_read","outlook_reply","outlook_reply_all","outlook_search","outlook_send","outlook_update_message","pagerduty_add_note","pagerduty_create_incident","pagerduty_get_incident","pagerduty_get_service","pagerduty_list_escalation_policies","pagerduty_list_incident_alerts","pagerduty_list_incidents","pagerduty_list_oncalls","pagerduty_list_schedules","pagerduty_list_services","pagerduty_list_users","pagerduty_merge_incidents","pagerduty_send_event","pagerduty_snooze_incident","pagerduty_update_incident","parallel_deep_research","parallel_extract","parallel_search","pdl_autocomplete","pdl_bulk_company_enrich","pdl_bulk_person_enrich","pdl_clean_company","pdl_clean_location","pdl_clean_school","pdl_company_enrich","pdl_company_search","pdl_person_enrich","pdl_person_identify","pdl_person_search","perplexity_chat","perplexity_search","persona_approve_inquiry","persona_create_account","persona_create_inquiry","persona_create_report","persona_decline_inquiry","persona_expire_inquiry","persona_generate_inquiry_link","persona_get_account","persona_get_case","persona_get_document","persona_get_inquiry","persona_get_report","persona_get_verification","persona_import_accounts","persona_list_accounts","persona_list_cases","persona_list_inquiries","persona_list_inquiry_templates","persona_list_reports","persona_mark_inquiry_for_review","persona_print_inquiry_pdf","persona_redact_account","persona_redact_inquiry","persona_resume_inquiry","persona_update_account","persona_update_inquiry","pinecone_delete_vectors","pinecone_describe_index","pinecone_describe_index_stats","pinecone_fetch","pinecone_generate_embeddings","pinecone_list_indexes","pinecone_list_vector_ids","pinecone_search_text","pinecone_search_vector","pinecone_update_vector","pinecone_upsert_text","pipedrive_create_activity","pipedrive_create_deal","pipedrive_create_lead","pipedrive_create_project","pipedrive_delete_lead","pipedrive_get_activities","pipedrive_get_all_deals","pipedrive_get_deal","pipedrive_get_files","pipedrive_get_leads","pipedrive_get_mail_messages","pipedrive_get_mail_thread","pipedrive_get_pipeline_deals","pipedrive_get_pipelines","pipedrive_get_projects","pipedrive_update_activity","pipedrive_update_deal","pipedrive_update_lead","pitchbook_company_active_investors","pitchbook_company_bio","pitchbook_company_deal_service_providers","pitchbook_company_deals","pitchbook_company_financials","pitchbook_company_general_service_providers","pitchbook_company_industries","pitchbook_company_investors","pitchbook_company_most_recent_debt_financing","pitchbook_company_most_recent_financials","pitchbook_company_most_recent_financing","pitchbook_company_search","pitchbook_company_similar_companies","pitchbook_company_social_analytics","pitchbook_company_updates","pitchbook_company_vc_exit_predictions","pitchbook_contracts_history","pitchbook_cost_of_calls","pitchbook_credit_history","pitchbook_credit_news","pitchbook_credit_news_bulk","pitchbook_credit_news_most_recent","pitchbook_credit_news_search","pitchbook_deal_bio","pitchbook_deal_cap_table_history","pitchbook_deal_debt_lenders","pitchbook_deal_detailed","pitchbook_deal_investors","pitchbook_deal_multiples","pitchbook_deal_search","pitchbook_deal_service_providers","pitchbook_deal_stock_info","pitchbook_deal_tranche_info","pitchbook_deal_updates","pitchbook_deal_valuation","pitchbook_entity_affiliates","pitchbook_entity_locations","pitchbook_entity_news","pitchbook_entity_people","pitchbook_entity_updates","pitchbook_fund_active_investments","pitchbook_fund_benchmark","pitchbook_fund_bio","pitchbook_fund_cash_flows","pitchbook_fund_commitments","pitchbook_fund_investment_preferences","pitchbook_fund_investments","pitchbook_fund_performance","pitchbook_fund_search","pitchbook_fund_team","pitchbook_fund_updates","pitchbook_investor_active_investments","pitchbook_investor_bio","pitchbook_investor_board_seats","pitchbook_investor_deal_service_providers","pitchbook_investor_funds","pitchbook_investor_general_service_providers","pitchbook_investor_investments","pitchbook_investor_last_closed_fund","pitchbook_investor_preferences","pitchbook_investor_search","pitchbook_investor_updates","pitchbook_limited_partner_actual_allocations","pitchbook_limited_partner_bio","pitchbook_limited_partner_commitment_aggregates","pitchbook_limited_partner_commitment_preferences","pitchbook_limited_partner_commitments_detailed","pitchbook_limited_partner_search","pitchbook_limited_partner_service_providers","pitchbook_limited_partner_target_allocations","pitchbook_limited_partner_updates","pitchbook_lookup_table_structure","pitchbook_lookup_tables","pitchbook_patent_detailed","pitchbook_patent_search","pitchbook_people_search","pitchbook_person_bio","pitchbook_person_contact","pitchbook_person_education_work","pitchbook_sandbox_entities","pitchbook_search","pitchbook_service_provider_bio","pitchbook_service_provider_search","pitchbook_service_provider_updates","pitchbook_serviced_companies","pitchbook_serviced_deals","pitchbook_serviced_funds","pitchbook_serviced_investors","pitchbook_serviced_limited_partners","pitchbook_shared_search","pitchbook_usage_report","polymarket_get_activity","polymarket_get_event","polymarket_get_events","polymarket_get_holders","polymarket_get_last_trade_price","polymarket_get_leaderboard","polymarket_get_market","polymarket_get_markets","polymarket_get_midpoint","polymarket_get_orderbook","polymarket_get_positions","polymarket_get_price","polymarket_get_price_history","polymarket_get_series","polymarket_get_series_by_id","polymarket_get_spread","polymarket_get_tags","polymarket_get_tick_size","polymarket_get_trades","polymarket_search","postgresql_delete","postgresql_execute","postgresql_insert","postgresql_introspect","postgresql_query","postgresql_update","posthog_batch_events","posthog_capture_event","posthog_create_annotation","posthog_create_cohort","posthog_create_dashboard","posthog_create_experiment","posthog_create_feature_flag","posthog_create_insight","posthog_create_survey","posthog_delete_feature_flag","posthog_delete_person","posthog_delete_survey","posthog_evaluate_flags","posthog_get_cohort","posthog_get_dashboard","posthog_get_event_definition","posthog_get_experiment","posthog_get_feature_flag","posthog_get_insight","posthog_get_organization","posthog_get_person","posthog_get_project","posthog_get_property_definition","posthog_get_session_recording","posthog_get_survey","posthog_list_actions","posthog_list_annotations","posthog_list_cohorts","posthog_list_dashboards","posthog_list_event_definitions","posthog_list_experiments","posthog_list_feature_flags","posthog_list_insights","posthog_list_organizations","posthog_list_persons","posthog_list_projects","posthog_list_property_definitions","posthog_list_recording_playlists","posthog_list_session_recordings","posthog_list_surveys","posthog_query","posthog_update_cohort","posthog_update_event_definition","posthog_update_experiment","posthog_update_feature_flag","posthog_update_insight","posthog_update_property_definition","posthog_update_survey","profound_bot_logs","profound_bots_report","profound_category_assets","profound_category_personas","profound_category_prompts","profound_category_tags","profound_category_topics","profound_citation_prompts","profound_citations_report","profound_list_assets","profound_list_categories","profound_list_domains","profound_list_models","profound_list_optimizations","profound_list_personas","profound_list_regions","profound_optimization_analysis","profound_prompt_answers","profound_prompt_volume","profound_query_fanouts","profound_raw_logs","profound_referrals_report","profound_sentiment_report","profound_visibility_report","prospeo_account_information","prospeo_bulk_enrich_company","prospeo_bulk_enrich_person","prospeo_enrich_company","prospeo_enrich_person","prospeo_search_company","prospeo_search_person","prospeo_search_suggestions","pulse_parser","pulse_parser_v2","qdrant_fetch_points","qdrant_search_vector","qdrant_upsert_points","quartr_get_audio","quartr_get_company","quartr_get_event","quartr_get_event_summary","quartr_get_report","quartr_get_slide_deck","quartr_get_transcript","quartr_list_audio","quartr_list_companies","quartr_list_document_types","quartr_list_documents","quartr_list_event_types","quartr_list_events","quartr_list_live_events","quartr_list_reports","quartr_list_slide_decks","quartr_list_transcripts","quiver_image_to_svg","quiver_list_models","quiver_text_to_svg","rabbitmq_create_binding","rabbitmq_create_exchange","rabbitmq_create_policy","rabbitmq_create_queue","rabbitmq_delete_binding","rabbitmq_delete_exchange","rabbitmq_delete_policy","rabbitmq_delete_queue","rabbitmq_get_exchange","rabbitmq_get_messages","rabbitmq_get_overview","rabbitmq_get_queue","rabbitmq_health_check","rabbitmq_list_bindings","rabbitmq_list_channels","rabbitmq_list_connections","rabbitmq_list_consumers","rabbitmq_list_exchange_bindings","rabbitmq_list_exchanges","rabbitmq_list_nodes","rabbitmq_list_policies","rabbitmq_list_queues","rabbitmq_list_vhosts","rabbitmq_publish_message","rabbitmq_purge_queue","railway_create_environment","railway_create_project","railway_create_service","railway_delete_environment","railway_delete_project","railway_delete_service","railway_delete_variable","railway_deploy_service","railway_get_deployment","railway_get_deployment_logs","railway_get_project","railway_list_deployments","railway_list_project_members","railway_list_projects","railway_list_variables","railway_restart_deployment","railway_rollback_deployment","railway_transfer_project","railway_update_project","railway_upsert_variable","rb2b_credit_check","rb2b_email_to_activity","rb2b_hem_to_best_linkedin","rb2b_hem_to_business_profile","rb2b_hem_to_linkedin","rb2b_hem_to_maid","rb2b_ip_to_company","rb2b_ip_to_hem","rb2b_ip_to_maid","rb2b_linkedin_slug_search","rb2b_linkedin_to_best_personal_email","rb2b_linkedin_to_business_profile","rb2b_linkedin_to_hashed_emails","rb2b_linkedin_to_mobile_phone","rb2b_linkedin_to_personal_email","rds_delete","rds_execute","rds_insert","rds_introspect","rds_query","rds_update","reddit_delete","reddit_edit","reddit_get_comments","reddit_get_controversial","reddit_get_info","reddit_get_me","reddit_get_messages","reddit_get_posts","reddit_get_saved","reddit_get_subreddit_info","reddit_get_subreddit_rules","reddit_get_user","reddit_get_user_comments","reddit_get_user_posts","reddit_hide","reddit_hot_posts","reddit_list_my_subreddits","reddit_lock","reddit_mark_all_read","reddit_mark_read","reddit_marknsfw","reddit_mod_approve","reddit_mod_distinguish","reddit_mod_remove","reddit_mod_sticky","reddit_reply","reddit_report","reddit_save","reddit_search","reddit_search_subreddits","reddit_send_message","reddit_submit_post","reddit_subscribe","reddit_unhide","reddit_unlock","reddit_unmarknsfw","reddit_unsave","reddit_vote","redis_command","redis_delete","redis_exists","redis_expire","redis_get","redis_hdel","redis_hget","redis_hgetall","redis_hset","redis_incr","redis_incrby","redis_keys","redis_llen","redis_lpop","redis_lpush","redis_lrange","redis_persist","redis_rpop","redis_rpush","redis_set","redis_setnx","redis_ttl","reducto_parser","reducto_parser_v2","resend_cancel_email","resend_create_audience","resend_create_broadcast","resend_create_contact","resend_delete_audience","resend_delete_contact","resend_get_audience","resend_get_broadcast","resend_get_contact","resend_get_email","resend_list_audiences","resend_list_contacts","resend_list_domains","resend_send","resend_send_broadcast","resend_update_contact","revenuecat_create_purchase","revenuecat_defer_google_subscription","revenuecat_delete_customer","revenuecat_get_customer","revenuecat_grant_entitlement","revenuecat_list_offerings","revenuecat_refund_google_subscription","revenuecat_revoke_entitlement","revenuecat_revoke_google_subscription","revenuecat_update_subscriber_attributes","rippling_bulk_create_custom_object_records","rippling_bulk_delete_custom_object_records","rippling_bulk_update_custom_object_records","rippling_create_business_partner","rippling_create_business_partner_group","rippling_create_custom_app","rippling_create_custom_object","rippling_create_custom_object_field","rippling_create_custom_object_record","rippling_create_custom_page","rippling_create_custom_setting","rippling_create_department","rippling_create_draft_hires","rippling_create_object_category","rippling_create_title","rippling_create_work_location","rippling_delete_business_partner","rippling_delete_business_partner_group","rippling_delete_custom_app","rippling_delete_custom_object","rippling_delete_custom_object_field","rippling_delete_custom_object_record","rippling_delete_custom_page","rippling_delete_custom_setting","rippling_delete_object_category","rippling_delete_title","rippling_delete_work_location","rippling_get_business_partner","rippling_get_business_partner_group","rippling_get_current_user","rippling_get_custom_app","rippling_get_custom_object","rippling_get_custom_object_field","rippling_get_custom_object_record","rippling_get_custom_object_record_by_external_id","rippling_get_custom_page","rippling_get_custom_setting","rippling_get_department","rippling_get_employment_type","rippling_get_job_function","rippling_get_object_category","rippling_get_report_run","rippling_get_supergroup","rippling_get_team","rippling_get_title","rippling_get_user","rippling_get_work_location","rippling_get_worker","rippling_list_business_partner_groups","rippling_list_business_partners","rippling_list_companies","rippling_list_custom_apps","rippling_list_custom_fields","rippling_list_custom_object_fields","rippling_list_custom_object_records","rippling_list_custom_objects","rippling_list_custom_pages","rippling_list_custom_settings","rippling_list_departments","rippling_list_employment_types","rippling_list_entitlements","rippling_list_job_functions","rippling_list_object_categories","rippling_list_supergroup_exclusion_members","rippling_list_supergroup_inclusion_members","rippling_list_supergroup_members","rippling_list_supergroups","rippling_list_teams","rippling_list_titles","rippling_list_users","rippling_list_work_locations","rippling_list_workers","rippling_query_custom_object_records","rippling_trigger_report_run","rippling_update_custom_app","rippling_update_custom_object","rippling_update_custom_object_field","rippling_update_custom_object_record","rippling_update_custom_page","rippling_update_custom_setting","rippling_update_department","rippling_update_object_category","rippling_update_supergroup_exclusion_members","rippling_update_supergroup_inclusion_members","rippling_update_title","rippling_update_work_location","rocketlane_add_field_option","rocketlane_add_project_members","rocketlane_add_task_assignees","rocketlane_add_task_dependencies","rocketlane_add_task_followers","rocketlane_archive_project","rocketlane_assign_placeholders","rocketlane_create_field","rocketlane_create_phase","rocketlane_create_project","rocketlane_create_space","rocketlane_create_space_document","rocketlane_create_task","rocketlane_create_time_entry","rocketlane_create_time_off","rocketlane_delete_field","rocketlane_delete_phase","rocketlane_delete_project","rocketlane_delete_space","rocketlane_delete_space_document","rocketlane_delete_task","rocketlane_delete_time_entry","rocketlane_delete_time_off","rocketlane_get_field","rocketlane_get_invoice","rocketlane_get_invoice_line_items","rocketlane_get_invoice_payments","rocketlane_get_phase","rocketlane_get_project","rocketlane_get_space","rocketlane_get_space_document","rocketlane_get_task","rocketlane_get_time_entry","rocketlane_get_time_off","rocketlane_get_user","rocketlane_import_template","rocketlane_list_fields","rocketlane_list_invoices","rocketlane_list_phases","rocketlane_list_placeholders","rocketlane_list_projects","rocketlane_list_resource_allocations","rocketlane_list_space_documents","rocketlane_list_spaces","rocketlane_list_tasks","rocketlane_list_time_entries","rocketlane_list_time_entry_categories","rocketlane_list_time_offs","rocketlane_list_users","rocketlane_move_task_to_phase","rocketlane_remove_project_members","rocketlane_remove_task_assignees","rocketlane_remove_task_dependencies","rocketlane_remove_task_followers","rocketlane_search_time_entries","rocketlane_unassign_placeholders","rocketlane_update_field","rocketlane_update_field_option","rocketlane_update_phase","rocketlane_update_project","rocketlane_update_space","rocketlane_update_space_document","rocketlane_update_task","rocketlane_update_time_entry","rootly_acknowledge_alert","rootly_add_incident_event","rootly_add_subscribers","rootly_assign_incident_role","rootly_create_action_item","rootly_create_alert","rootly_create_incident","rootly_create_status_page_event","rootly_delete_action_item","rootly_delete_incident","rootly_escalate_alert","rootly_get_alert","rootly_get_incident","rootly_list_action_items","rootly_list_alerts","rootly_list_causes","rootly_list_environments","rootly_list_escalation_policies","rootly_list_functionalities","rootly_list_incident_events","rootly_list_incident_roles","rootly_list_incident_types","rootly_list_incidents","rootly_list_on_calls","rootly_list_playbooks","rootly_list_retrospectives","rootly_list_schedules","rootly_list_services","rootly_list_severities","rootly_list_teams","rootly_list_users","rootly_mitigate_incident","rootly_remove_subscribers","rootly_resolve_alert","rootly_resolve_incident","rootly_run_workflow","rootly_snooze_alert","rootly_unassign_incident_role","rootly_update_action_item","rootly_update_alert","rootly_update_incident","s3_copy_object","s3_create_bucket","s3_delete_bucket","s3_delete_object","s3_delete_objects","s3_get_object","s3_head_object","s3_list_buckets","s3_list_objects","s3_presigned_url","s3_put_object","sailpoint_approve_access_request","sailpoint_cancel_access_request","sailpoint_decide_certification_review_items","sailpoint_get_access_profile","sailpoint_get_access_profile_entitlements","sailpoint_get_access_request_config","sailpoint_get_access_request_status","sailpoint_get_account","sailpoint_get_account_activity","sailpoint_get_account_entitlements","sailpoint_get_account_selections","sailpoint_get_campaign","sailpoint_get_certification","sailpoint_get_entitlement","sailpoint_get_entitlement_request_config","sailpoint_get_identity","sailpoint_get_role","sailpoint_get_role_entitlements","sailpoint_get_source","sailpoint_get_task_status","sailpoint_list_access_profiles","sailpoint_list_account_activities","sailpoint_list_accounts","sailpoint_list_campaigns","sailpoint_list_certification_review_items","sailpoint_list_certifications","sailpoint_list_entitlements","sailpoint_list_identities","sailpoint_list_identity_entitlements","sailpoint_list_pending_access_request_approvals","sailpoint_list_roles","sailpoint_list_sources","sailpoint_load_accounts","sailpoint_load_entitlements","sailpoint_reject_access_request","sailpoint_request_access","sailpoint_search","sailpoint_search_aggregate","sailpoint_search_count","sailpoint_sign_off_certification","salesforce_create_account","salesforce_create_case","salesforce_create_contact","salesforce_create_custom_field","salesforce_create_custom_object","salesforce_create_lead","salesforce_create_opportunity","salesforce_create_task","salesforce_delete_account","salesforce_delete_case","salesforce_delete_contact","salesforce_delete_custom_field","salesforce_delete_lead","salesforce_delete_opportunity","salesforce_delete_task","salesforce_describe_object","salesforce_get_accounts","salesforce_get_cases","salesforce_get_contacts","salesforce_get_dashboard","salesforce_get_leads","salesforce_get_opportunities","salesforce_get_report","salesforce_get_tasks","salesforce_list_dashboards","salesforce_list_objects","salesforce_list_report_types","salesforce_list_reports","salesforce_query","salesforce_query_more","salesforce_refresh_dashboard","salesforce_run_report","salesforce_tooling_query","salesforce_update_account","salesforce_update_case","salesforce_update_contact","salesforce_update_custom_field","salesforce_update_lead","salesforce_update_opportunity","salesforce_update_task","sap_concur_approve_expense_report","sap_concur_associate_attendees","sap_concur_create_cash_advance","sap_concur_create_expected_expense","sap_concur_create_expense_report","sap_concur_create_list_item","sap_concur_create_purchase_request","sap_concur_create_quick_expense","sap_concur_create_quick_expense_with_image","sap_concur_create_report_comment","sap_concur_create_travel_request","sap_concur_create_user","sap_concur_delete_expected_expense","sap_concur_delete_expense","sap_concur_delete_expense_report","sap_concur_delete_list_item","sap_concur_delete_travel_request","sap_concur_delete_user","sap_concur_get_allocation","sap_concur_get_budget","sap_concur_get_cash_advance","sap_concur_get_expected_expense","sap_concur_get_expense","sap_concur_get_expense_report","sap_concur_get_itemizations","sap_concur_get_itinerary","sap_concur_get_list","sap_concur_get_list_item","sap_concur_get_purchase_request","sap_concur_get_receipt","sap_concur_get_receipt_status","sap_concur_get_request_cash_advance","sap_concur_get_travel_profile","sap_concur_get_travel_request","sap_concur_get_user","sap_concur_issue_cash_advance","sap_concur_list_allocations","sap_concur_list_attendee_associations","sap_concur_list_budget_categories","sap_concur_list_budgets","sap_concur_list_exceptions","sap_concur_list_expected_expenses","sap_concur_list_expense_reports","sap_concur_list_expenses","sap_concur_list_itineraries","sap_concur_list_list_items","sap_concur_list_lists","sap_concur_list_receipts","sap_concur_list_report_comments","sap_concur_list_reports_to_approve","sap_concur_list_travel_profiles_summary","sap_concur_list_travel_request_comments","sap_concur_list_travel_requests","sap_concur_list_users","sap_concur_move_travel_request","sap_concur_recall_expense_report","sap_concur_remove_all_attendees","sap_concur_search_locations","sap_concur_search_users","sap_concur_send_back_expense_report","sap_concur_submit_expense_report","sap_concur_update_allocation","sap_concur_update_expected_expense","sap_concur_update_expense","sap_concur_update_expense_report","sap_concur_update_list_item","sap_concur_update_travel_request","sap_concur_update_user","sap_concur_upload_exchange_rates","sap_concur_upload_receipt_image","sap_s4hana_create_business_partner","sap_s4hana_create_purchase_order","sap_s4hana_create_purchase_requisition","sap_s4hana_create_sales_order","sap_s4hana_delete_sales_order","sap_s4hana_get_billing_document","sap_s4hana_get_business_partner","sap_s4hana_get_customer","sap_s4hana_get_inbound_delivery","sap_s4hana_get_material_document","sap_s4hana_get_outbound_delivery","sap_s4hana_get_product","sap_s4hana_get_purchase_order","sap_s4hana_get_purchase_requisition","sap_s4hana_get_sales_order","sap_s4hana_get_supplier","sap_s4hana_get_supplier_invoice","sap_s4hana_list_billing_documents","sap_s4hana_list_business_partners","sap_s4hana_list_customers","sap_s4hana_list_inbound_deliveries","sap_s4hana_list_material_documents","sap_s4hana_list_material_stock","sap_s4hana_list_outbound_deliveries","sap_s4hana_list_products","sap_s4hana_list_purchase_orders","sap_s4hana_list_purchase_requisitions","sap_s4hana_list_sales_orders","sap_s4hana_list_supplier_invoices","sap_s4hana_list_suppliers","sap_s4hana_odata_query","sap_s4hana_update_business_partner","sap_s4hana_update_customer","sap_s4hana_update_product","sap_s4hana_update_purchase_order","sap_s4hana_update_purchase_requisition","sap_s4hana_update_sales_order","sap_s4hana_update_supplier","search_tool","secrets_manager_create_secret","secrets_manager_delete_secret","secrets_manager_describe_secret","secrets_manager_get_secret","secrets_manager_list_secrets","secrets_manager_restore_secret","secrets_manager_rotate_secret","secrets_manager_tag_resource","secrets_manager_untag_resource","secrets_manager_update_secret","semrush_backlinks","semrush_backlinks_anchors","semrush_backlinks_competitors","semrush_backlinks_geo_distribution","semrush_backlinks_indexed_pages","semrush_backlinks_overview","semrush_backlinks_tld_distribution","semrush_batch_keyword_overview","semrush_broad_match_keywords","semrush_domain_ad_copies","semrush_domain_ad_history","semrush_domain_organic_competitors","semrush_domain_organic_keywords","semrush_domain_overview","semrush_domain_overview_all","semrush_domain_overview_history","semrush_domain_paid_competitors","semrush_domain_paid_keywords","semrush_domain_pla_copies","semrush_domain_pla_keywords","semrush_domain_vs_domain","semrush_keyword_ad_history","semrush_keyword_difficulty","semrush_keyword_overview","semrush_keyword_overview_all","semrush_keyword_questions","semrush_organic_results","semrush_paid_results","semrush_referring_domains","semrush_referring_ips","semrush_related_keywords","semrush_subdomain_ad_copies","semrush_subdomain_organic_keywords","semrush_subdomain_overview","semrush_subdomain_overview_all","semrush_subdomain_overview_history","semrush_subdomain_paid_keywords","semrush_top_domains","semrush_url_organic_keywords","semrush_url_overview","semrush_url_overview_all","semrush_url_overview_history","semrush_url_paid_keywords","semrush_winners_and_losers","sendblue_evaluate_service","sendblue_get_message","sendblue_send_group_message","sendblue_send_message","sendblue_send_typing_indicator","sendgrid_add_contact","sendgrid_add_contacts_to_list","sendgrid_create_list","sendgrid_create_template","sendgrid_create_template_version","sendgrid_delete_contacts","sendgrid_delete_list","sendgrid_delete_template","sendgrid_get_contact","sendgrid_get_list","sendgrid_get_template","sendgrid_list_all_lists","sendgrid_list_templates","sendgrid_remove_contacts_from_list","sendgrid_search_contacts","sendgrid_send_mail","sentry_events_get","sentry_events_list","sentry_issues_get","sentry_issues_list","sentry_issues_update","sentry_projects_create","sentry_projects_get","sentry_projects_list","sentry_projects_update","sentry_releases_create","sentry_releases_deploy","sentry_releases_list","sentry_teams_list","serper_search","servicenow_add_incident_comment","servicenow_aggregate","servicenow_close_incident","servicenow_create_change_request","servicenow_create_incident","servicenow_create_record","servicenow_delete_record","servicenow_download_attachment","servicenow_find_user","servicenow_get_change_next_states","servicenow_get_change_request","servicenow_get_ci","servicenow_get_incident","servicenow_get_knowledge_article","servicenow_get_requested_item","servicenow_list_approvals","servicenow_list_attachments","servicenow_list_catalog_items","servicenow_list_change_requests","servicenow_list_change_tasks","servicenow_list_ci_relationships","servicenow_list_group_members","servicenow_list_incidents","servicenow_list_requested_items","servicenow_order_catalog_item","servicenow_read_record","servicenow_resolve_incident","servicenow_search_cis","servicenow_search_knowledge","servicenow_update_approval","servicenow_update_change_request","servicenow_update_change_state","servicenow_update_incident","servicenow_update_record","servicenow_upload_attachment","ses_create_configuration_set","ses_create_email_identity","ses_create_template","ses_delete_email_identity","ses_delete_suppressed_destination","ses_delete_template","ses_get_account","ses_get_email_identity","ses_get_suppressed_destination","ses_get_template","ses_list_identities","ses_list_suppressed_destinations","ses_list_templates","ses_put_suppressed_destination","ses_send_bulk_email","ses_send_custom_verification_email","ses_send_email","ses_send_templated_email","ses_update_template","sftp_delete","sftp_download","sftp_list","sftp_mkdir","sftp_upload","sharepoint_add_list_items","sharepoint_create_list","sharepoint_create_page","sharepoint_delete_file","sharepoint_delete_list_item","sharepoint_delete_page","sharepoint_download_file","sharepoint_get_drive_item","sharepoint_get_list","sharepoint_get_list_item","sharepoint_list_sites","sharepoint_publish_page","sharepoint_read_page","sharepoint_update_list","sharepoint_update_page","sharepoint_upload_file","shopify_adjust_inventory","shopify_cancel_order","shopify_create_customer","shopify_create_fulfillment","shopify_create_product","shopify_delete_customer","shopify_delete_product","shopify_get_collection","shopify_get_customer","shopify_get_inventory_level","shopify_get_order","shopify_get_product","shopify_list_collections","shopify_list_customers","shopify_list_inventory_items","shopify_list_locations","shopify_list_orders","shopify_list_products","shopify_update_customer","shopify_update_order","shopify_update_product","similarweb_bounce_rate","similarweb_page_views","similarweb_pages_per_visit","similarweb_traffic_visits","similarweb_visit_duration","similarweb_website_overview","sixtyfour_enrich_company","sixtyfour_enrich_lead","sixtyfour_find_email","sixtyfour_find_phone","slack_add_reaction","slack_archive_conversation","slack_canvas","slack_create_channel_canvas","slack_create_conversation","slack_delete_canvas","slack_delete_message","slack_delete_scheduled_message","slack_download","slack_edit_canvas","slack_ephemeral_message","slack_get_canvas","slack_get_channel_history","slack_get_channel_info","slack_get_message","slack_get_permalink","slack_get_thread","slack_get_thread_replies","slack_get_user","slack_get_user_presence","slack_invite_to_conversation","slack_list_canvases","slack_list_channels","slack_list_members","slack_list_scheduled_messages","slack_list_users","slack_lookup_canvas_sections","slack_message","slack_message_reader","slack_open_view","slack_publish_view","slack_push_view","slack_remove_reaction","slack_rename_agent_session_v2","slack_rename_conversation","slack_schedule_message","slack_set_agent_session_status_v2","slack_set_conversation_purpose","slack_set_conversation_topic","slack_set_status","slack_set_suggested_prompts","slack_set_suggested_prompts_v2","slack_set_title","slack_update_message","slack_update_view","smartlead_add_email_accounts_to_campaign","smartlead_add_leads_to_campaign","smartlead_create_campaign","smartlead_create_lead_list","smartlead_delete_campaign","smartlead_delete_campaign_webhook","smartlead_delete_lead_from_campaign","smartlead_delete_lead_list","smartlead_duplicate_campaign","smartlead_export_campaign_leads","smartlead_get_campaign","smartlead_get_campaign_analytics","smartlead_get_campaign_analytics_by_date","smartlead_get_campaign_lead_statistics","smartlead_get_campaign_mailbox_statistics","smartlead_get_campaign_sequences","smartlead_get_campaign_statistics","smartlead_get_campaign_top_level_analytics_by_date","smartlead_get_campaign_webhook_summary","smartlead_get_lead_by_email","smartlead_get_lead_by_id","smartlead_get_lead_list","smartlead_get_lead_message_history","smartlead_list_campaign_email_accounts","smartlead_list_campaign_leads","smartlead_list_campaign_webhooks","smartlead_list_campaigns","smartlead_list_clients","smartlead_list_email_accounts","smartlead_list_inbox_replies","smartlead_list_lead_activities","smartlead_list_lead_categories","smartlead_list_lead_lists","smartlead_mark_lead_complete","smartlead_pause_lead","smartlead_remove_email_accounts_from_campaign","smartlead_resume_lead","smartlead_save_campaign_sequences","smartlead_unsubscribe_lead_from_campaign","smartlead_unsubscribe_lead_globally","smartlead_update_campaign_schedule","smartlead_update_campaign_settings","smartlead_update_campaign_status","smartlead_update_lead","smartlead_update_lead_category","smartlead_update_lead_list","smartlead_upsert_campaign_webhook","sms_send","smtp_send_mail","snowflake_alter_warehouse","snowflake_call_procedure","snowflake_cancel_statement","snowflake_cancel_task_run","snowflake_delete_rows","snowflake_execute_sql","snowflake_get_statement","snowflake_get_task","snowflake_get_task_run","snowflake_get_task_run_output","snowflake_get_warehouse","snowflake_insert_rows","snowflake_introspect_schema","snowflake_list_copy_history","snowflake_list_databases","snowflake_list_query_history","snowflake_list_schemas","snowflake_list_tables","snowflake_list_task_runs","snowflake_list_tasks","snowflake_list_warehouses","snowflake_load_data","snowflake_resume_task","snowflake_resume_warehouse","snowflake_run_task","snowflake_suspend_task","snowflake_suspend_warehouse","snowflake_unload_data","snowflake_update_rows","snowflake_upsert_rows","splunk_cancel_search_job","splunk_create_search_job","splunk_dispatch_saved_search","splunk_get_fired_alerts","splunk_get_saved_search","splunk_get_search_job","splunk_get_search_results","splunk_list_apps","splunk_list_fired_alerts","splunk_list_indexes","splunk_list_saved_searches","splunk_run_search","sportmonks_core_get_cities","sportmonks_core_get_city","sportmonks_core_get_continent","sportmonks_core_get_continents","sportmonks_core_get_countries","sportmonks_core_get_country","sportmonks_core_get_entity_filters","sportmonks_core_get_my_usage","sportmonks_core_get_region","sportmonks_core_get_regions","sportmonks_core_get_timezones","sportmonks_core_get_type","sportmonks_core_get_type_by_entity","sportmonks_core_get_types","sportmonks_core_search_cities","sportmonks_core_search_countries","sportmonks_core_search_regions","sportmonks_football_expected_by_player","sportmonks_football_expected_by_team","sportmonks_football_get_all_commentaries","sportmonks_football_get_all_fixtures","sportmonks_football_get_all_players","sportmonks_football_get_all_rivals","sportmonks_football_get_all_teams","sportmonks_football_get_all_transfer_rumours","sportmonks_football_get_all_transfers","sportmonks_football_get_brackets_by_season","sportmonks_football_get_coach","sportmonks_football_get_coaches","sportmonks_football_get_coaches_by_country","sportmonks_football_get_commentaries_by_fixture","sportmonks_football_get_current_leagues_by_team","sportmonks_football_get_expected_lineups_by_player","sportmonks_football_get_expected_lineups_by_team","sportmonks_football_get_extended_team_squad","sportmonks_football_get_fixture","sportmonks_football_get_fixtures_by_date","sportmonks_football_get_fixtures_by_date_range","sportmonks_football_get_fixtures_by_date_range_for_team","sportmonks_football_get_fixtures_by_ids","sportmonks_football_get_grouped_standings_by_round","sportmonks_football_get_head_to_head","sportmonks_football_get_inplay_livescores","sportmonks_football_get_latest_coaches","sportmonks_football_get_latest_fixtures","sportmonks_football_get_latest_livescores","sportmonks_football_get_latest_players","sportmonks_football_get_latest_totw","sportmonks_football_get_latest_transfers","sportmonks_football_get_league","sportmonks_football_get_leagues","sportmonks_football_get_leagues_by_country","sportmonks_football_get_leagues_by_date","sportmonks_football_get_leagues_by_team","sportmonks_football_get_live_leagues","sportmonks_football_get_live_probabilities","sportmonks_football_get_live_probabilities_by_fixture","sportmonks_football_get_live_standings_by_league","sportmonks_football_get_livescores","sportmonks_football_get_match_facts","sportmonks_football_get_match_facts_by_date_range","sportmonks_football_get_match_facts_by_fixture","sportmonks_football_get_match_facts_by_league","sportmonks_football_get_past_fixtures_by_tv_station","sportmonks_football_get_player","sportmonks_football_get_players_by_country","sportmonks_football_get_postmatch_news","sportmonks_football_get_postmatch_news_by_season","sportmonks_football_get_predictability_by_league","sportmonks_football_get_prematch_news","sportmonks_football_get_prematch_news_by_season","sportmonks_football_get_prematch_news_upcoming","sportmonks_football_get_probabilities","sportmonks_football_get_probabilities_by_fixture","sportmonks_football_get_referee","sportmonks_football_get_referees","sportmonks_football_get_referees_by_country","sportmonks_football_get_referees_by_season","sportmonks_football_get_rivals_by_team","sportmonks_football_get_round","sportmonks_football_get_round_statistics","sportmonks_football_get_rounds","sportmonks_football_get_rounds_by_season","sportmonks_football_get_schedules_by_season","sportmonks_football_get_schedules_by_season_and_team","sportmonks_football_get_schedules_by_team","sportmonks_football_get_season","sportmonks_football_get_seasons","sportmonks_football_get_seasons_by_team","sportmonks_football_get_stage","sportmonks_football_get_stage_statistics","sportmonks_football_get_stages","sportmonks_football_get_stages_by_season","sportmonks_football_get_standing_corrections_by_season","sportmonks_football_get_standings","sportmonks_football_get_standings_by_round","sportmonks_football_get_standings_by_season","sportmonks_football_get_state","sportmonks_football_get_states","sportmonks_football_get_team","sportmonks_football_get_team_rankings","sportmonks_football_get_team_rankings_by_date","sportmonks_football_get_team_rankings_by_team","sportmonks_football_get_team_squad","sportmonks_football_get_team_squad_by_season","sportmonks_football_get_teams_by_country","sportmonks_football_get_teams_by_season","sportmonks_football_get_topscorers_by_season","sportmonks_football_get_topscorers_by_stage","sportmonks_football_get_totw","sportmonks_football_get_totw_by_round","sportmonks_football_get_transfer","sportmonks_football_get_transfer_rumour","sportmonks_football_get_transfer_rumours_between_dates","sportmonks_football_get_transfer_rumours_by_player","sportmonks_football_get_transfer_rumours_by_team","sportmonks_football_get_transfers_between_dates","sportmonks_football_get_transfers_by_player","sportmonks_football_get_transfers_by_team","sportmonks_football_get_tv_station","sportmonks_football_get_tv_stations","sportmonks_football_get_tv_stations_by_fixture","sportmonks_football_get_upcoming_fixtures_by_market","sportmonks_football_get_upcoming_fixtures_by_tv_station","sportmonks_football_get_value_bets","sportmonks_football_get_value_bets_by_fixture","sportmonks_football_get_venue","sportmonks_football_get_venues","sportmonks_football_get_venues_by_season","sportmonks_football_search_coaches","sportmonks_football_search_fixtures","sportmonks_football_search_leagues","sportmonks_football_search_players","sportmonks_football_search_referees","sportmonks_football_search_rounds","sportmonks_football_search_seasons","sportmonks_football_search_stages","sportmonks_football_search_teams","sportmonks_football_search_venues","sportmonks_motorsport_get_all_fixtures","sportmonks_motorsport_get_current_leagues_by_team","sportmonks_motorsport_get_driver","sportmonks_motorsport_get_driver_standings","sportmonks_motorsport_get_driver_standings_by_season","sportmonks_motorsport_get_drivers","sportmonks_motorsport_get_drivers_by_country","sportmonks_motorsport_get_drivers_by_season","sportmonks_motorsport_get_fixture","sportmonks_motorsport_get_fixtures_by_date","sportmonks_motorsport_get_fixtures_by_date_range","sportmonks_motorsport_get_fixtures_by_ids","sportmonks_motorsport_get_laps_by_fixture","sportmonks_motorsport_get_laps_by_fixture_and_driver","sportmonks_motorsport_get_laps_by_fixture_and_lap","sportmonks_motorsport_get_latest_laps_by_fixture","sportmonks_motorsport_get_latest_pitstops_by_fixture","sportmonks_motorsport_get_latest_stints_by_fixture","sportmonks_motorsport_get_latest_updated_drivers","sportmonks_motorsport_get_latest_updated_fixtures","sportmonks_motorsport_get_league","sportmonks_motorsport_get_leagues","sportmonks_motorsport_get_leagues_by_country","sportmonks_motorsport_get_leagues_by_date","sportmonks_motorsport_get_leagues_by_live","sportmonks_motorsport_get_leagues_by_team","sportmonks_motorsport_get_livescores","sportmonks_motorsport_get_pitstops_by_fixture","sportmonks_motorsport_get_pitstops_by_fixture_and_driver","sportmonks_motorsport_get_pitstops_by_fixture_and_lap","sportmonks_motorsport_get_race_results_by_season_and_driver","sportmonks_motorsport_get_race_results_by_season_and_team","sportmonks_motorsport_get_schedules_by_season","sportmonks_motorsport_get_season","sportmonks_motorsport_get_seasons","sportmonks_motorsport_get_stage","sportmonks_motorsport_get_stages","sportmonks_motorsport_get_stages_by_season","sportmonks_motorsport_get_state","sportmonks_motorsport_get_states","sportmonks_motorsport_get_stints_by_fixture","sportmonks_motorsport_get_stints_by_fixture_and_driver","sportmonks_motorsport_get_stints_by_fixture_and_stint","sportmonks_motorsport_get_team","sportmonks_motorsport_get_team_standings","sportmonks_motorsport_get_team_standings_by_season","sportmonks_motorsport_get_teams","sportmonks_motorsport_get_teams_by_country","sportmonks_motorsport_get_teams_by_season","sportmonks_motorsport_get_venue","sportmonks_motorsport_get_venues","sportmonks_motorsport_get_venues_by_season","sportmonks_motorsport_search_drivers","sportmonks_motorsport_search_leagues","sportmonks_motorsport_search_stages","sportmonks_motorsport_search_teams","sportmonks_motorsport_search_venues","sportmonks_odds_get_all_historical_odds","sportmonks_odds_get_all_inplay_odds","sportmonks_odds_get_all_pre_match_odds","sportmonks_odds_get_all_premium_odds","sportmonks_odds_get_bookmaker","sportmonks_odds_get_bookmaker_event_ids_by_fixture","sportmonks_odds_get_bookmakers","sportmonks_odds_get_bookmakers_by_fixture","sportmonks_odds_get_inplay_odds_by_fixture","sportmonks_odds_get_inplay_odds_by_fixture_and_bookmaker","sportmonks_odds_get_inplay_odds_by_fixture_and_market","sportmonks_odds_get_last_updated_inplay_odds","sportmonks_odds_get_last_updated_pre_match_odds","sportmonks_odds_get_market","sportmonks_odds_get_markets","sportmonks_odds_get_pre_match_odds_by_fixture","sportmonks_odds_get_pre_match_odds_by_fixture_and_bookmaker","sportmonks_odds_get_pre_match_odds_by_fixture_and_market","sportmonks_odds_get_premium_odds_by_fixture","sportmonks_odds_get_premium_odds_by_fixture_and_bookmaker","sportmonks_odds_get_premium_odds_by_fixture_and_market","sportmonks_odds_get_updated_historical_odds_between","sportmonks_odds_get_updated_premium_odds_between","sportmonks_odds_search_bookmakers","sportmonks_odds_search_markets","spotify_add_playlist_cover","spotify_add_to_queue","spotify_add_tracks_to_playlist","spotify_check_following","spotify_check_playlist_followers","spotify_check_saved_albums","spotify_check_saved_audiobooks","spotify_check_saved_episodes","spotify_check_saved_shows","spotify_check_saved_tracks","spotify_create_playlist","spotify_follow_artists","spotify_follow_playlist","spotify_get_album","spotify_get_album_tracks","spotify_get_albums","spotify_get_artist","spotify_get_artist_albums","spotify_get_artist_top_tracks","spotify_get_artists","spotify_get_audiobook","spotify_get_audiobook_chapters","spotify_get_audiobooks","spotify_get_categories","spotify_get_current_user","spotify_get_currently_playing","spotify_get_devices","spotify_get_episode","spotify_get_episodes","spotify_get_followed_artists","spotify_get_markets","spotify_get_new_releases","spotify_get_playback_state","spotify_get_playlist","spotify_get_playlist_cover","spotify_get_playlist_tracks","spotify_get_queue","spotify_get_recently_played","spotify_get_saved_albums","spotify_get_saved_audiobooks","spotify_get_saved_episodes","spotify_get_saved_shows","spotify_get_saved_tracks","spotify_get_show","spotify_get_show_episodes","spotify_get_shows","spotify_get_top_artists","spotify_get_top_tracks","spotify_get_track","spotify_get_tracks","spotify_get_user_playlists","spotify_get_user_profile","spotify_pause","spotify_play","spotify_remove_saved_albums","spotify_remove_saved_audiobooks","spotify_remove_saved_episodes","spotify_remove_saved_shows","spotify_remove_saved_tracks","spotify_remove_tracks_from_playlist","spotify_reorder_playlist_items","spotify_replace_playlist_items","spotify_save_albums","spotify_save_audiobooks","spotify_save_episodes","spotify_save_shows","spotify_save_tracks","spotify_search","spotify_seek","spotify_set_repeat","spotify_set_shuffle","spotify_set_volume","spotify_skip_next","spotify_skip_previous","spotify_transfer_playback","spotify_unfollow_artists","spotify_unfollow_playlist","spotify_update_playlist","sqs_send","square_batch_retrieve_inventory_counts","square_cancel_invoice","square_cancel_payment","square_complete_payment","square_create_catalog_image","square_create_customer","square_create_invoice","square_create_order","square_create_payment","square_delete_catalog_object","square_delete_customer","square_delete_invoice","square_get_catalog_object","square_get_customer","square_get_invoice","square_get_location","square_get_order","square_get_payment","square_get_refund","square_list_catalog","square_list_customers","square_list_invoices","square_list_locations","square_list_payments","square_list_refunds","square_pay_order","square_publish_invoice","square_refund_payment","square_search_catalog_objects","square_search_customers","square_search_invoices","square_search_orders","square_update_customer","square_upsert_catalog_object","ssh_check_command_exists","ssh_check_file_exists","ssh_create_directory","ssh_delete_file","ssh_download_file","ssh_execute_command","ssh_execute_script","ssh_get_system_info","ssh_list_directory","ssh_move_rename","ssh_read_file_content","ssh_upload_file","ssh_write_file_content","stagehand_agent","stagehand_extract","stripe_cancel_payment_intent","stripe_cancel_subscription","stripe_capture_charge","stripe_capture_payment_intent","stripe_confirm_payment_intent","stripe_create_charge","stripe_create_customer","stripe_create_invoice","stripe_create_payment_intent","stripe_create_price","stripe_create_product","stripe_create_subscription","stripe_delete_customer","stripe_delete_invoice","stripe_delete_product","stripe_finalize_invoice","stripe_list_charges","stripe_list_customers","stripe_list_events","stripe_list_invoices","stripe_list_payment_intents","stripe_list_prices","stripe_list_products","stripe_list_subscriptions","stripe_pay_invoice","stripe_resume_subscription","stripe_retrieve_charge","stripe_retrieve_customer","stripe_retrieve_event","stripe_retrieve_invoice","stripe_retrieve_payment_intent","stripe_retrieve_price","stripe_retrieve_product","stripe_retrieve_subscription","stripe_search_charges","stripe_search_customers","stripe_search_invoices","stripe_search_payment_intents","stripe_search_prices","stripe_search_products","stripe_search_subscriptions","stripe_send_invoice","stripe_update_charge","stripe_update_customer","stripe_update_invoice","stripe_update_payment_intent","stripe_update_price","stripe_update_product","stripe_update_subscription","stripe_void_invoice","sts_assume_role","sts_assume_role_with_saml","sts_assume_role_with_web_identity","sts_get_access_key_info","sts_get_caller_identity","sts_get_session_token","stt_assemblyai","stt_assemblyai_v2","stt_deepgram","stt_deepgram_v2","stt_elevenlabs","stt_elevenlabs_v2","stt_gemini","stt_gemini_v2","stt_whisper","stt_whisper_v2","supabase_count","supabase_delete","supabase_get_row","supabase_insert","supabase_introspect","supabase_invoke_function","supabase_query","supabase_rpc","supabase_storage_copy","supabase_storage_create_bucket","supabase_storage_create_signed_upload_url","supabase_storage_create_signed_url","supabase_storage_delete","supabase_storage_delete_bucket","supabase_storage_download","supabase_storage_empty_bucket","supabase_storage_get_public_url","supabase_storage_list","supabase_storage_list_buckets","supabase_storage_move","supabase_storage_update_bucket","supabase_storage_upload","supabase_text_search","supabase_update","supabase_upsert","supabase_vector_search","table_batch_insert_rows","table_create","table_delete_row","table_delete_rows_by_filter","table_get_row","table_get_schema","table_insert_row","table_list","table_query_rows","table_query_rows_v2","table_update_row","table_update_rows_by_filter","table_upsert_row","tailscale_authorize_device","tailscale_create_auth_key","tailscale_delete_auth_key","tailscale_delete_device","tailscale_delete_user","tailscale_expire_device_key","tailscale_get_acl","tailscale_get_auth_key","tailscale_get_device","tailscale_get_device_routes","tailscale_get_dns_preferences","tailscale_get_dns_searchpaths","tailscale_list_auth_keys","tailscale_list_devices","tailscale_list_dns_nameservers","tailscale_list_users","tailscale_set_acl","tailscale_set_device_routes","tailscale_set_device_tags","tailscale_set_dns_nameservers","tailscale_set_dns_preferences","tailscale_set_dns_searchpaths","tailscale_suspend_user","tailscale_update_device_key","tavily_crawl","tavily_extract","tavily_map","tavily_search","telegram_copy_message","telegram_delete_message","telegram_edit_message_text","telegram_forward_message","telegram_get_chat","telegram_get_chat_member","telegram_message","telegram_pin_message","telegram_send_animation","telegram_send_audio","telegram_send_chat_action","telegram_send_contact","telegram_send_document","telegram_send_location","telegram_send_photo","telegram_send_poll","telegram_send_video","telegram_set_message_reaction","telegram_unpin_message","temporal_cancel_workflow","temporal_count_workflows","temporal_create_schedule","temporal_delete_schedule","temporal_describe_schedule","temporal_describe_task_queue","temporal_describe_workflow","temporal_get_workflow_history","temporal_list_schedules","temporal_list_workflows","temporal_pause_schedule","temporal_query_workflow","temporal_reset_workflow","temporal_signal_with_start","temporal_signal_workflow","temporal_start_workflow","temporal_terminate_workflow","temporal_trigger_schedule","temporal_unpause_schedule","temporal_update_workflow","textract_analyze_expense","textract_analyze_id","textract_parser","textract_parser_v2","thinking_tool","thrive_add_audience_managers","thrive_add_audience_members","thrive_add_user_tags","thrive_create_assignment","thrive_create_audience","thrive_create_completion","thrive_create_user","thrive_delete_assignment","thrive_delete_audience","thrive_delete_user","thrive_get_activity","thrive_get_assignment","thrive_get_audience","thrive_get_completion","thrive_get_content","thrive_get_cpd_category","thrive_get_cpd_entry","thrive_get_cpd_requirement","thrive_get_enrolment","thrive_get_skill_levels","thrive_get_tag","thrive_get_user_by_id","thrive_get_user_by_ref","thrive_list_assignments","thrive_list_audience_managers","thrive_list_audience_members","thrive_list_audiences","thrive_list_completions","thrive_list_enrolments","thrive_list_tags","thrive_query_activities","thrive_query_content","thrive_query_cpd_categories","thrive_query_cpd_entries","thrive_query_cpd_requirements","thrive_query_cpd_user_summaries","thrive_remove_audience_manager","thrive_remove_audience_member","thrive_remove_user_tags","thrive_replace_audience_managers","thrive_replace_audience_members","thrive_search_users","thrive_suspend_user","thrive_update_assignment","thrive_update_audience","thrive_update_user","thrive_update_user_skills","tiktok_get_post_status","tiktok_get_user","tiktok_list_videos","tiktok_query_videos","tiktok_upload_video_draft","tinybird_append_datasource","tinybird_delete_datasource_rows","tinybird_events","tinybird_get_job","tinybird_query","tinybird_query_pipe","tinybird_truncate_datasource","tinyfish_cancel_run","tinyfish_fetch","tinyfish_get_run","tinyfish_list_runs","tinyfish_list_vault_items","tinyfish_run","tinyfish_run_async","tinyfish_search","trello_add_checklist","trello_add_checklist_item","trello_add_comment","trello_add_label","trello_add_member","trello_create_board","trello_create_card","trello_create_list","trello_delete_card","trello_get_actions","trello_get_board","trello_get_card","trello_list_cards","trello_list_lists","trello_list_members","trello_remove_label","trello_remove_member","trello_search","trello_update_card","trello_update_checklist_item","trello_update_list","trigger_dev_activate_schedule","trigger_dev_add_run_tags","trigger_dev_batch_trigger_task","trigger_dev_cancel_run","trigger_dev_complete_waitpoint_token","trigger_dev_create_env_var","trigger_dev_create_schedule","trigger_dev_create_waitpoint_token","trigger_dev_deactivate_schedule","trigger_dev_delete_env_var","trigger_dev_delete_schedule","trigger_dev_execute_query","trigger_dev_get_batch","trigger_dev_get_batch_results","trigger_dev_get_deployment","trigger_dev_get_env_var","trigger_dev_get_latest_deployment","trigger_dev_get_query_schema","trigger_dev_get_queue","trigger_dev_get_run","trigger_dev_get_run_events","trigger_dev_get_run_result","trigger_dev_get_run_trace","trigger_dev_get_schedule","trigger_dev_get_waitpoint_token","trigger_dev_import_env_vars","trigger_dev_list_deployments","trigger_dev_list_env_vars","trigger_dev_list_queues","trigger_dev_list_runs","trigger_dev_list_schedules","trigger_dev_list_timezones","trigger_dev_list_waitpoint_tokens","trigger_dev_override_queue_concurrency","trigger_dev_pause_queue","trigger_dev_promote_deployment","trigger_dev_replay_run","trigger_dev_reschedule_run","trigger_dev_reset_queue_concurrency","trigger_dev_resume_queue","trigger_dev_trigger_task","trigger_dev_update_env_var","trigger_dev_update_run_metadata","trigger_dev_update_schedule","tts_azure","tts_cartesia","tts_deepgram","tts_elevenlabs","tts_google","tts_openai","tts_playht","twilio_send_sms","twilio_voice_get_recording","twilio_voice_list_calls","twilio_voice_make_call","typeform_create_form","typeform_delete_form","typeform_files","typeform_get_form","typeform_insights","typeform_list_forms","typeform_responses","typeform_update_form","upstash_redis_command","upstash_redis_delete","upstash_redis_exists","upstash_redis_expire","upstash_redis_get","upstash_redis_hget","upstash_redis_hgetall","upstash_redis_hset","upstash_redis_incr","upstash_redis_incrby","upstash_redis_keys","upstash_redis_lpush","upstash_redis_lrange","upstash_redis_set","upstash_redis_setnx","upstash_redis_ttl","uptimerobot_create_alert_contact","uptimerobot_create_maintenance_window","uptimerobot_create_monitor","uptimerobot_create_psp","uptimerobot_delete_alert_contact","uptimerobot_delete_maintenance_window","uptimerobot_delete_monitor","uptimerobot_delete_psp","uptimerobot_get_account","uptimerobot_get_alert_contact","uptimerobot_get_incident","uptimerobot_get_maintenance_window","uptimerobot_get_monitor","uptimerobot_get_psp","uptimerobot_list_alert_contacts","uptimerobot_list_incidents","uptimerobot_list_maintenance_windows","uptimerobot_list_monitors","uptimerobot_list_psps","uptimerobot_pause_monitor","uptimerobot_start_monitor","uptimerobot_update_maintenance_window","uptimerobot_update_monitor","uptimerobot_update_psp","vanta_download_document_file","vanta_get_control","vanta_get_document","vanta_get_framework","vanta_get_person","vanta_get_policy","vanta_get_risk_scenario","vanta_get_test","vanta_get_vendor","vanta_get_vulnerable_asset","vanta_list_control_documents","vanta_list_control_tests","vanta_list_controls","vanta_list_document_uploads","vanta_list_documents","vanta_list_framework_controls","vanta_list_frameworks","vanta_list_monitored_computers","vanta_list_people","vanta_list_policies","vanta_list_risk_scenarios","vanta_list_test_entities","vanta_list_tests","vanta_list_vendors","vanta_list_vulnerabilities","vanta_list_vulnerability_remediations","vanta_list_vulnerable_assets","vanta_submit_document","vanta_upload_document_file","vercel_add_domain","vercel_add_project_domain","vercel_cancel_deployment","vercel_create_alias","vercel_create_check","vercel_create_deployment","vercel_create_dns_record","vercel_create_edge_config","vercel_create_env_var","vercel_create_project","vercel_create_webhook","vercel_delete_alias","vercel_delete_deployment","vercel_delete_dns_record","vercel_delete_domain","vercel_delete_edge_config","vercel_delete_env_var","vercel_delete_project","vercel_delete_webhook","vercel_get_alias","vercel_get_check","vercel_get_deployment","vercel_get_deployment_events","vercel_get_domain","vercel_get_domain_config","vercel_get_edge_config","vercel_get_edge_config_items","vercel_get_env_vars","vercel_get_project","vercel_get_team","vercel_get_user","vercel_get_webhook","vercel_list_aliases","vercel_list_checks","vercel_list_deployment_files","vercel_list_deployments","vercel_list_dns_records","vercel_list_domains","vercel_list_edge_configs","vercel_list_project_domains","vercel_list_projects","vercel_list_team_members","vercel_list_teams","vercel_list_webhooks","vercel_pause_project","vercel_promote_deployment","vercel_remove_project_domain","vercel_rerequest_check","vercel_unpause_project","vercel_update_check","vercel_update_dns_record","vercel_update_edge_config_items","vercel_update_env_var","vercel_update_project","vercel_update_project_domain","vercel_verify_project_domain","video_falai","video_luma","video_minimax","video_runway","video_veo","vision_tool","vision_tool_v2","wealthbox_read_contact","wealthbox_read_note","wealthbox_read_task","wealthbox_write_contact","wealthbox_write_note","wealthbox_write_task","webflow_create_item","webflow_delete_item","webflow_get_item","webflow_list_items","webflow_update_item","webhook_request","whatsapp_get_media","whatsapp_mark_read","whatsapp_send_interactive","whatsapp_send_media","whatsapp_send_message","whatsapp_send_reaction","whatsapp_send_template","whatsapp_upload_media","wikipedia_content","wikipedia_random","wikipedia_search","wikipedia_summary","windchill_check_in_document","windchill_check_in_documents","windchill_check_out_document","windchill_check_out_documents","windchill_create_document","windchill_create_documents","windchill_delete_document","windchill_delete_documents","windchill_download_attachment","windchill_download_primary_content","windchill_get_document","windchill_get_document_structure","windchill_get_primary_content","windchill_get_valid_state_transitions","windchill_list_attachments","windchill_list_documents","windchill_revise_document","windchill_revise_documents","windchill_set_lifecycle_state","windchill_undo_check_out_document","windchill_undo_check_out_documents","windchill_update_common_properties","windchill_update_document","windchill_update_document_security_labels","windchill_update_documents","windchill_upload_attachments","windchill_upload_primary_content","wiza_company_enrichment","wiza_get_credits","wiza_individual_reveal","wiza_prospect_search","wordpress_create_category","wordpress_create_comment","wordpress_create_page","wordpress_create_post","wordpress_create_tag","wordpress_delete_category","wordpress_delete_comment","wordpress_delete_media","wordpress_delete_page","wordpress_delete_post","wordpress_delete_tag","wordpress_get_category","wordpress_get_current_user","wordpress_get_media","wordpress_get_page","wordpress_get_post","wordpress_get_tag","wordpress_get_user","wordpress_list_categories","wordpress_list_comments","wordpress_list_media","wordpress_list_pages","wordpress_list_posts","wordpress_list_tags","wordpress_list_users","wordpress_search_content","wordpress_update_category","wordpress_update_comment","wordpress_update_page","wordpress_update_post","wordpress_update_tag","wordpress_upload_media","workday_assign_onboarding","workday_change_job","workday_create_prehire","workday_get_compensation","workday_get_organizations","workday_get_worker","workday_hire_employee","workday_list_workers","workday_terminate_worker","workday_update_worker","workflow_executor","x_create_bookmark","x_create_tweet","x_delete_bookmark","x_delete_tweet","x_get_blocking","x_get_bookmarks","x_get_followers","x_get_following","x_get_liked_tweets","x_get_liking_users","x_get_me","x_get_personalized_trends","x_get_quote_tweets","x_get_retweeted_by","x_get_trends_by_woeid","x_get_tweets_by_ids","x_get_usage","x_get_user_mentions","x_get_user_timeline","x_get_user_tweets","x_hide_reply","x_manage_block","x_manage_follow","x_manage_like","x_manage_mute","x_manage_retweet","x_read","x_search","x_search_tweets","x_search_users","x_user","x_write","youtube_channel_info","youtube_channel_playlists","youtube_channel_videos","youtube_comments","youtube_playlist_items","youtube_search","youtube_trending","youtube_video_categories","youtube_video_details","zendesk_autocomplete_organizations","zendesk_create_organization","zendesk_create_organizations_bulk","zendesk_create_ticket","zendesk_create_tickets_bulk","zendesk_create_user","zendesk_create_users_bulk","zendesk_delete_organization","zendesk_delete_ticket","zendesk_delete_user","zendesk_get_current_user","zendesk_get_organization","zendesk_get_organizations","zendesk_get_ticket","zendesk_get_tickets","zendesk_get_user","zendesk_get_users","zendesk_merge_tickets","zendesk_search","zendesk_search_count","zendesk_search_users","zendesk_update_organization","zendesk_update_ticket","zendesk_update_tickets_bulk","zendesk_update_user","zendesk_update_users_bulk","zep_add_messages","zep_add_user","zep_create_thread","zep_delete_thread","zep_get_context","zep_get_messages","zep_get_threads","zep_get_user","zep_get_user_threads","zerobounce_get_credits","zerobounce_verify_email","zoho_desk_add_comment","zoho_desk_get_attachment","zoho_desk_get_contact","zoho_desk_get_thread","zoho_desk_get_ticket","zoho_desk_list_comments","zoho_desk_list_organizations","zoho_desk_list_threads","zoho_desk_list_tickets","zoho_desk_update_ticket","zoom_create_meeting","zoom_delete_meeting","zoom_delete_recording","zoom_get_meeting","zoom_get_meeting_invitation","zoom_get_meeting_recordings","zoom_list_meetings","zoom_list_past_participants","zoom_list_recordings","zoom_update_meeting","zoominfo_enrich_companies","zoominfo_enrich_contacts","zoominfo_search_companies","zoominfo_search_contacts","zoominfo_search_intent","zoominfo_search_news"]' ) export default toolIds diff --git a/apps/sim/tools/generated/tool-metadata.ts b/apps/sim/tools/generated/tool-metadata.ts index a6952f954fe..2bc22aecb8a 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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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)"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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)"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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)"}},"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"}},"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"}},"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"}},"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)"}},"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)"}},"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)"}},"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)"}},"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)"}},"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)"}},"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"}},"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"}},"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."}},"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"}},"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."}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"},"airweave_search":{"id":"airweave_search","name":"Airweave Search","description":"Search your synced data collections using Airweave. Supports semantic search with hybrid, neural, or keyword retrieval strategies. Optionally generate AI-powered answers from search results.","version":"1.0.0","params":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Airweave API Key for authentication"},"collectionId":{"type":"string","required":true,"visibility":"user-or-llm","description":"The readable ID of the collection to search"},"query":{"type":"string","required":true,"visibility":"user-or-llm","description":"The search query text"},"limit":{"type":"number","required":false,"visibility":"user-only","description":"Maximum number of results to return (default: 100)"},"retrievalStrategy":{"type":"string","required":false,"visibility":"user-or-llm","description":"Retrieval strategy: hybrid (default), neural, or keyword"},"expandQuery":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Generate query variations to improve recall"},"rerank":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Reorder results for improved relevance using LLM"},"generateAnswer":{"type":"boolean","required":false,"visibility":"user-or-llm","description":"Generate a natural-language answer to the query"}},"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"}},"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)"}},"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"}},"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"}},"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."}},"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"}},"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"}},"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"}},"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"}},"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\\"."}},"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"}},"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"}},"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)"}},"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)"}},"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"}},"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)"}},"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\\""}},"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\\""}},"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\\""}},"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\\""}},"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\\""}},"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\\""}},"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\\""}},"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\\""}},"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\\""}},"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\\""}},"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\\""}},"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":{"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)"}},"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\\""}},"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\\""}},"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\\""}},"hostedApiKey":"none"},"apify_run_actor_async":{"id":"apify_run_actor_async","name":"APIFY Run Actor (Async)","description":"Run an APIFY actor asynchronously with polling for long-running tasks","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\\""}},"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\\""}},"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\\""}},"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":{"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)"}},"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":{"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."}},"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":{"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"}},"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":{"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)"}},"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":{"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"}},"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":{"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"}},"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":{"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"}},"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":{"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"}},"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":{"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)"}},"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":{"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"}},"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":{"apiKey":{"type":"string","required":true,"visibility":"user-only","description":"Apollo API key (master key required)"}},"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":{"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"}},"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":{"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\\")"}},"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":{"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)"}},"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":{"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"}},"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":{"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\\"])"}},"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":{"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\\")"}},"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":{"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)"}},"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":{"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)"}},"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":{"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)"}},"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":{"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)"}},"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":{"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"}},"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":{"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)"}},"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":{"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"}},"hostedApiKey":"none"},"apollo_task_search":{"id":"apollo_task_search","name":"Apollo Search Tasks","description":"Search for tasks in Apollo","version":"1.0.0","params":{"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)"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"hostedApiKey":"none"},"ashby_anonymize_candidate":{"id":"ashby_anonymize_candidate","name":"Ashby Anonymize Candidate","description":"Strips personally identifiable information from a candidate in Ashby. This does not delete the candidate - the record and its applications remain, with the PII removed. Ashby exposes no candidate deletion endpoint; true deletion is UI-only, restricted by role, and limited to a 10-day window. 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"}},"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."}},"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."}},"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"}},"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"}},"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: , , , ,