From 83af693f1785b7699f6082e13504b34a1ccc9cb0 Mon Sep 17 00:00:00 2001 From: Waleed Latif Date: Fri, 7 Aug 2026 16:33:36 -0700 Subject: [PATCH 1/5] feat(dynatrace): add the Dynatrace integration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds a Dynatrace block backed by 22 Environment API v2 tools, covering the surfaces an observability workflow actually reaches for: - Problems: list, get, close, list comments, add comment - Metrics: query data points, list and get descriptors, ingest line protocol - Entities: list, get, list entity types - Events: list, get, ingest - Logs: search, ingest - SLOs: list, get - Application Security: list and get security problems - Audit log: read Every request path, query parameter, and response mapping is taken from the published Dynatrace API reference — no inferred fields. Auth is an access token sent as `Authorization: Api-Token ...` against a user-supplied environment URL, so SaaS, Managed, and environment ActiveGate all work. Two details worth knowing: `ingest_event` exposes Dynatrace's event timeout as `eventTimeout`, not `timeout`. The tool transport reserves `params.timeout` for the HTTP request deadline, so the obvious name would have silently retargeted the wrong knob. `get_metric` encodes its path segment with `encodeDynatracePathSegment` rather than `encodeURIComponent`, which leaves the `:` separators in metric keys and transformation operators intact, matching the docs' own examples. --- apps/docs/components/icons.tsx | 31 + apps/docs/components/ui/icon-mapping.ts | 2 + .../docs/en/integrations/dynatrace.mdx | 555 ++++++++ .../content/docs/en/integrations/meta.json | 1 + apps/sim/blocks/blocks/dynatrace.ts | 1213 +++++++++++++++++ apps/sim/blocks/registry-maps.ts | 3 + apps/sim/components/icons.tsx | 31 + apps/sim/lib/integrations/icon-mapping.ts | 2 + apps/sim/lib/integrations/integrations.json | 107 ++ .../tools/dynatrace/add_problem_comment.ts | 81 ++ apps/sim/tools/dynatrace/close_problem.ts | 95 ++ apps/sim/tools/dynatrace/get_audit_logs.ts | 168 +++ apps/sim/tools/dynatrace/get_entity.ts | 89 ++ apps/sim/tools/dynatrace/get_event.ts | 64 + apps/sim/tools/dynatrace/get_metric.ts | 70 + apps/sim/tools/dynatrace/get_problem.ts | 79 ++ .../tools/dynatrace/get_security_problem.ts | 99 ++ apps/sim/tools/dynatrace/get_slo.ts | 84 ++ apps/sim/tools/dynatrace/index.ts | 45 + apps/sim/tools/dynatrace/ingest_event.ts | 139 ++ apps/sim/tools/dynatrace/ingest_logs.ts | 75 + apps/sim/tools/dynatrace/ingest_metrics.ts | 84 ++ apps/sim/tools/dynatrace/list_entities.ts | 135 ++ apps/sim/tools/dynatrace/list_entity_types.ts | 146 ++ apps/sim/tools/dynatrace/list_events.ts | 126 ++ apps/sim/tools/dynatrace/list_metrics.ts | 141 ++ .../tools/dynatrace/list_problem_comments.ts | 103 ++ apps/sim/tools/dynatrace/list_problems.ts | 147 ++ .../tools/dynatrace/list_security_problems.ts | 135 ++ apps/sim/tools/dynatrace/list_slos.ts | 141 ++ apps/sim/tools/dynatrace/outputs.ts | 379 +++++ apps/sim/tools/dynatrace/query_metrics.ts | 183 +++ apps/sim/tools/dynatrace/search_logs.ts | 146 ++ apps/sim/tools/dynatrace/types.ts | 626 +++++++++ apps/sim/tools/dynatrace/utils.ts | 415 ++++++ apps/sim/tools/generated/tool-ids.ts | 2 +- apps/sim/tools/generated/tool-metadata.ts | 2 +- apps/sim/tools/generated/tool-outputs.ts | 2 +- apps/sim/tools/registry.ts | 46 + 39 files changed, 5989 insertions(+), 3 deletions(-) create mode 100644 apps/docs/content/docs/en/integrations/dynatrace.mdx create mode 100644 apps/sim/blocks/blocks/dynatrace.ts create mode 100644 apps/sim/tools/dynatrace/add_problem_comment.ts create mode 100644 apps/sim/tools/dynatrace/close_problem.ts create mode 100644 apps/sim/tools/dynatrace/get_audit_logs.ts create mode 100644 apps/sim/tools/dynatrace/get_entity.ts create mode 100644 apps/sim/tools/dynatrace/get_event.ts create mode 100644 apps/sim/tools/dynatrace/get_metric.ts create mode 100644 apps/sim/tools/dynatrace/get_problem.ts create mode 100644 apps/sim/tools/dynatrace/get_security_problem.ts create mode 100644 apps/sim/tools/dynatrace/get_slo.ts create mode 100644 apps/sim/tools/dynatrace/index.ts create mode 100644 apps/sim/tools/dynatrace/ingest_event.ts create mode 100644 apps/sim/tools/dynatrace/ingest_logs.ts create mode 100644 apps/sim/tools/dynatrace/ingest_metrics.ts create mode 100644 apps/sim/tools/dynatrace/list_entities.ts create mode 100644 apps/sim/tools/dynatrace/list_entity_types.ts create mode 100644 apps/sim/tools/dynatrace/list_events.ts create mode 100644 apps/sim/tools/dynatrace/list_metrics.ts create mode 100644 apps/sim/tools/dynatrace/list_problem_comments.ts create mode 100644 apps/sim/tools/dynatrace/list_problems.ts create mode 100644 apps/sim/tools/dynatrace/list_security_problems.ts create mode 100644 apps/sim/tools/dynatrace/list_slos.ts create mode 100644 apps/sim/tools/dynatrace/outputs.ts create mode 100644 apps/sim/tools/dynatrace/query_metrics.ts create mode 100644 apps/sim/tools/dynatrace/search_logs.ts create mode 100644 apps/sim/tools/dynatrace/types.ts create mode 100644 apps/sim/tools/dynatrace/utils.ts diff --git a/apps/docs/components/icons.tsx b/apps/docs/components/icons.tsx index b4dfeefc3f3..9a3d08eb0a7 100644 --- a/apps/docs/components/icons.tsx +++ b/apps/docs/components/icons.tsx @@ -6048,6 +6048,37 @@ export function RDSIcon(props: SVGProps) { ) } +export function DynatraceIcon(props: SVGProps) { + return ( + + + + + + + + + ) +} + export function DynamoDBIcon(props: SVGProps) { return ( = { dub: DubIcon, duckduckgo: DuckDuckGoIcon, dynamodb: DynamoDBIcon, + dynatrace: DynatraceIcon, elasticsearch: ElasticsearchIcon, elevenlabs: ElevenLabsIcon, emailbison: EmailBisonIcon, diff --git a/apps/docs/content/docs/en/integrations/dynatrace.mdx b/apps/docs/content/docs/en/integrations/dynatrace.mdx new file mode 100644 index 00000000000..1b60393e3d7 --- /dev/null +++ b/apps/docs/content/docs/en/integrations/dynatrace.mdx @@ -0,0 +1,555 @@ +--- +title: Dynatrace +description: Query Dynatrace problems, metrics, entities, logs, SLOs, and vulnerabilities +--- + +import { BlockInfoCard } from "@/components/ui/block-info-card" + + + +## Usage Instructions + +Integrate Dynatrace into workflows. Investigate and close Davis problems, query metrics and monitored entities, search and ingest logs, push deployment events, track SLO burn rates, review Application Security vulnerabilities, and read the audit log. + + + +## Actions + +### Dynatrace List Problems + +List Davis-detected problems in a Dynatrace environment, filtered by timeframe, problem selector, or entity selector. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `environmentUrl` | string | Yes | Dynatrace environment URL \(e.g., https://abc12345.live.dynatrace.com, or https://your-activegate:9999/e/abc12345 for Managed\) | +| `apiToken` | string | Yes | Dynatrace access token \(dt0c01...\) with the problems.read scope | +| `from` | string | No | Start of the timeframe as UTC milliseconds, ISO 8601, or a relative expression such as now-1d. Defaults to now-2h | +| `to` | string | No | End of the timeframe in the same formats as From. Defaults to now | +| `problemSelector` | string | No | Problem selector, e.g. status\("open"\),severityLevel\("AVAILABILITY"\),impactLevel\("SERVICES"\) | +| `entitySelector` | string | No | Entity selector scoping the result, e.g. type\("HOST"\),tag\("env:prod"\) | +| `sort` | string | No | Sort order: status, startTime, or relevance, each optionally prefixed with + or - \(e.g. -startTime\) | +| `fields` | string | No | Comma-separated optional properties to include: evidenceDetails, impactAnalysis, recentComments | +| `pageSize` | number | No | Problems per page \(max 500, default 50\) | +| `nextPageKey` | string | No | Cursor for the next page. All other filters are ignored when it is set | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `problems` | array | Matching problems | + +### Dynatrace Get Problem + +Get the full details of a single Dynatrace problem, including root cause, affected entities, and optionally its evidence and impact analysis. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `environmentUrl` | string | Yes | Dynatrace environment URL \(e.g., https://abc12345.live.dynatrace.com, or https://your-activegate:9999/e/abc12345 for Managed\) | +| `apiToken` | string | Yes | Dynatrace access token \(dt0c01...\) with the problems.read scope | +| `problemId` | string | Yes | ID of the problem \(e.g., -1234567890123456789_1700000000000V2\) | +| `fields` | string | No | Comma-separated optional properties to include: evidenceDetails, impactAnalysis, recentComments | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `problem` | object | The requested problem | + +### Dynatrace Close Problem + +Close a Dynatrace problem and record the closing comment. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `environmentUrl` | string | Yes | Dynatrace environment URL \(e.g., https://abc12345.live.dynatrace.com, or https://your-activegate:9999/e/abc12345 for Managed\) | +| `apiToken` | string | Yes | Dynatrace access token \(dt0c01...\) with the problems.write scope | +| `problemId` | string | Yes | ID of the problem to close | +| `message` | string | Yes | Text of the closing comment | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `problemId` | string | ID of the closed problem | +| `closeTimestamp` | number | Timestamp when closing was triggered, in UTC milliseconds | +| `closing` | boolean | Whether the problem is in the process of being closed | +| `comment` | object | The closing comment that was recorded | + +### Dynatrace List Problem Comments + +List the comments recorded on a Dynatrace problem. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `environmentUrl` | string | Yes | Dynatrace environment URL \(e.g., https://abc12345.live.dynatrace.com, or https://your-activegate:9999/e/abc12345 for Managed\) | +| `apiToken` | string | Yes | Dynatrace access token \(dt0c01...\) with the problems.read scope | +| `problemId` | string | Yes | ID of the problem whose comments should be listed | +| `pageSize` | number | No | Comments per page \(max 500, default 10\) | +| `nextPageKey` | string | No | Cursor for the next page. Page size is ignored when it is set | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `comments` | array | Comments on the problem | + +### Dynatrace Add Problem Comment + +Add a comment to a Dynatrace problem. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `environmentUrl` | string | Yes | Dynatrace environment URL \(e.g., https://abc12345.live.dynatrace.com, or https://your-activegate:9999/e/abc12345 for Managed\) | +| `apiToken` | string | Yes | Dynatrace access token \(dt0c01...\) with the problems.write scope | +| `problemId` | string | Yes | ID of the problem to comment on | +| `message` | string | Yes | Text of the comment | +| `context` | string | No | Context of the comment, shown alongside the author \(e.g., the source system\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `problemId` | string | ID of the problem the comment was added to | +| `message` | string | Text of the comment that was added | +| `context` | string | Context of the comment | + +### Dynatrace Query Metrics + +Read metric data points from Dynatrace using a metric selector, with optional entity and management-zone scoping. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `environmentUrl` | string | Yes | Dynatrace environment URL \(e.g., https://abc12345.live.dynatrace.com, or https://your-activegate:9999/e/abc12345 for Managed\) | +| `apiToken` | string | Yes | Dynatrace access token \(dt0c01...\) with the metrics.read scope | +| `metricSelector` | string | Yes | Metric selector, up to 10 metrics comma-separated, with optional transformations after a colon \(e.g. builtin:host.cpu.usage:avg:names\) | +| `from` | string | No | Start of the timeframe as UTC milliseconds, ISO 8601, or a relative expression such as now-2h. Defaults to now-2h | +| `to` | string | No | End of the timeframe in the same formats as From. Defaults to now | +| `resolution` | string | No | Number of data points \(default 120\), a timespan such as 10m or 3w, or Inf for a single aggregated value | +| `entitySelector` | string | No | Entity selector scoping the query, e.g. type\("HOST"\),tag\("env:prod"\) | +| `mzSelector` | string | No | Management zone selector, e.g. mzName\("Production"\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `result` | array | One entry per queried metric | +| ↳ `metricId` | string | Metric key including transformations | +| ↳ `dataPointCountRatio` | number | Queried data points relative to the query limit | +| ↳ `dimensionCountRatio` | number | Queried dimension tuples relative to the query limit | +| ↳ `appliedOptionalFilters` | array | Optional filters Dynatrace applied to the query | +| ↳ `dql` | json | DQL translation of the query, when available | +| ↳ `warnings` | array | Warnings for this metric | +| ↳ `data` | array | Series of the metric, one per dimension tuple | +| ↳ `dimensions` | array | Dimension values of the series | +| ↳ `dimensionMap` | json | Dimension values keyed by dimension key | +| ↳ `timestamps` | array | Timestamps in UTC milliseconds, one per value | +| ↳ `values` | array | Metric values. Null where no data exists | +| `resolution` | string | Resolution Dynatrace actually used | + +### Dynatrace List Metrics + +Discover the metrics available in a Dynatrace environment, filtered by metric selector, free text, or metadata. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `environmentUrl` | string | Yes | Dynatrace environment URL \(e.g., https://abc12345.live.dynatrace.com, or https://your-activegate:9999/e/abc12345 for Managed\) | +| `apiToken` | string | Yes | Dynatrace access token \(dt0c01...\) with the metrics.read scope | +| `metricSelector` | string | No | Metric selector, supporting wildcards \(e.g. builtin:host.cpu.*\) | +| `text` | string | No | Free-text search across metric display names and descriptions | +| `fields` | string | No | Comma-separated descriptor properties to include. metricId is always returned \(e.g. +displayName,+unit,+aggregationTypes\) | +| `writtenSince` | string | No | Only metrics written since this point, as UTC milliseconds, ISO 8601, or a relative expression such as now-7d | +| `writtenSinceMode` | string | No | INCLUDE \(default\) keeps metrics written since Written Since; EXCLUDE keeps the ones not written since then | +| `metadataSelector` | string | No | Metadata selector, e.g. unit\("Percent"\),tags\("dashboard"\) | +| `pageSize` | number | No | Metrics per page \(max 500, default 100\) | +| `nextPageKey` | string | No | Cursor for the next page. All other filters are ignored when it is set | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `metrics` | array | Matching metric descriptors | + +### Dynatrace Get Metric Descriptor + +Get the descriptor of a single Dynatrace metric — its unit, dimensions, supported aggregations, and transformations. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `environmentUrl` | string | Yes | Dynatrace environment URL \(e.g., https://abc12345.live.dynatrace.com, or https://your-activegate:9999/e/abc12345 for Managed\) | +| `apiToken` | string | Yes | Dynatrace access token \(dt0c01...\) with the metrics.read scope | +| `metricKey` | string | Yes | Metric key, optionally followed by transformation operators separated by a colon \(e.g. builtin:host.cpu.usage\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `metric` | object | The requested metric descriptor | + +### Dynatrace Ingest Metrics + +Push custom metric data points into Dynatrace using the metric line protocol, one data point per line. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `environmentUrl` | string | Yes | Dynatrace environment URL \(e.g., https://abc12345.live.dynatrace.com, or https://your-activegate:9999/e/abc12345 for Managed\) | +| `apiToken` | string | Yes | Dynatrace access token \(dt0c01...\) with the metrics.ingest scope | +| `payload` | string | Yes | Metric line protocol payload, one data point per line, max 1 MB \(e.g. cpu.temperature,dt.entity.host=HOST-06F288EE2A930951,cpu=1 55\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `linesOk` | number | Number of accepted data points | +| `linesInvalid` | number | Number of rejected data points | +| `ingestError` | json | Details of the invalid lines, with the line number and reason for each | +| `warnings` | json | Warnings raised during ingestion, such as changed metric keys | + +### Dynatrace List Entities + +List monitored entities — hosts, services, applications, Kubernetes workloads — matching an entity selector. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `environmentUrl` | string | Yes | Dynatrace environment URL \(e.g., https://abc12345.live.dynatrace.com, or https://your-activegate:9999/e/abc12345 for Managed\) | +| `apiToken` | string | Yes | Dynatrace access token \(dt0c01...\) with the entities.read scope | +| `entitySelector` | string | Yes | Entity selector defining the scope, e.g. type\("HOST"\),tag\("env:prod"\) or entityId\("HOST-06F288EE2A930951"\) | +| `from` | string | No | Start of the timeframe as UTC milliseconds, ISO 8601, or a relative expression such as now-3d. Defaults to now-3d | +| `to` | string | No | End of the timeframe in the same formats as From. Defaults to now | +| `fields` | string | No | Comma-separated additional entity properties to include \(e.g. +lastSeenTms,+properties.BITNESS,+tags\) | +| `sort` | string | No | Sort by display name: +displayName ascending or -displayName descending | +| `pageSize` | number | No | Entities per page \(default 50\) | +| `nextPageKey` | string | No | Cursor for the next page. All other filters are ignored when it is set | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `entities` | array | Matching monitored entities | + +### Dynatrace Get Entity + +Get the properties, tags, management zones, and relationships of a single monitored entity. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `environmentUrl` | string | Yes | Dynatrace environment URL \(e.g., https://abc12345.live.dynatrace.com, or https://your-activegate:9999/e/abc12345 for Managed\) | +| `apiToken` | string | Yes | Dynatrace access token \(dt0c01...\) with the entities.read scope | +| `entityId` | string | Yes | ID of the entity \(e.g., HOST-06F288EE2A930951\) | +| `from` | string | No | Start of the timeframe as UTC milliseconds, ISO 8601, or a relative expression such as now-3d. Defaults to now-3d | +| `to` | string | No | End of the timeframe in the same formats as From. Defaults to now | +| `fields` | string | No | Comma-separated additional entity properties to include \(e.g. +lastSeenTms,+properties.BITNESS\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `entity` | object | The requested monitored entity | + +### Dynatrace List Entity Types + +List the monitored entity types available in the environment, with the properties and relationships each supports. Use it to build valid entity selectors. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `environmentUrl` | string | Yes | Dynatrace environment URL \(e.g., https://abc12345.live.dynatrace.com, or https://your-activegate:9999/e/abc12345 for Managed\) | +| `apiToken` | string | Yes | Dynatrace access token \(dt0c01...\) with the entities.read scope | +| `pageSize` | number | No | Entity types per page \(max 500, default 50\) | +| `nextPageKey` | string | No | Cursor for the next page. Page size is ignored when it is set | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `types` | array | Available entity types | +| ↳ `type` | string | Entity type \(e.g., HOST, SERVICE\) | +| ↳ `displayName` | string | Display name of the type | +| ↳ `dimensionKey` | string | Metric dimension key of the type | +| ↳ `entityLimitExceeded` | boolean | Whether the environment exceeded the entity limit for this type | +| ↳ `fromRelationships` | array | Relationships originating at this type | +| ↳ `id` | string | Relationship ID | +| ↳ `toTypes` | array | Entity types the relationship points to | +| ↳ `toRelationships` | array | Relationships pointing at this type | +| ↳ `id` | string | Relationship ID | +| ↳ `fromTypes` | array | Entity types the relationship originates from | + +### Dynatrace List Events + +List events — deployments, availability changes, alerts, custom annotations — in a Dynatrace environment. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `environmentUrl` | string | Yes | Dynatrace environment URL \(e.g., https://abc12345.live.dynatrace.com, or https://your-activegate:9999/e/abc12345 for Managed\) | +| `apiToken` | string | Yes | Dynatrace access token \(dt0c01...\) with the events.read scope | +| `from` | string | No | Start of the timeframe as UTC milliseconds, ISO 8601, or a relative expression such as now-1d. Defaults to now-2h | +| `to` | string | No | End of the timeframe in the same formats as From. Defaults to now | +| `eventSelector` | string | No | Event selector, e.g. eventType\("CUSTOM_DEPLOYMENT"\),status\("OPEN"\),correlationId\("build-42"\) | +| `entitySelector` | string | No | Entity selector scoping the result, e.g. type\("SERVICE"\),tag\("env:prod"\) | +| `pageSize` | number | No | Events per page \(max 1000, default 100\) | +| `nextPageKey` | string | No | Cursor for the next page. All other filters are ignored when it is set | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `events` | array | Matching events | + +### Dynatrace Get Event + +Get the full details of a single Dynatrace event. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `environmentUrl` | string | Yes | Dynatrace environment URL \(e.g., https://abc12345.live.dynatrace.com, or https://your-activegate:9999/e/abc12345 for Managed\) | +| `apiToken` | string | Yes | Dynatrace access token \(dt0c01...\) with the events.read scope | +| `eventId` | string | Yes | ID of the event | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `event` | object | The requested event | + +### Dynatrace Ingest Event + +Push an event into Dynatrace — a deployment marker, custom annotation, or custom alert — attached to the entities matched by an entity selector. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `environmentUrl` | string | Yes | Dynatrace environment URL \(e.g., https://abc12345.live.dynatrace.com, or https://your-activegate:9999/e/abc12345 for Managed\) | +| `apiToken` | string | Yes | Dynatrace access token \(dt0c01...\) with the events.ingest scope | +| `eventType` | string | Yes | One of AVAILABILITY_EVENT, CUSTOM_ALERT, CUSTOM_ANNOTATION, CUSTOM_CONFIGURATION, CUSTOM_DEPLOYMENT, CUSTOM_INFO, ERROR_EVENT, MARKED_FOR_TERMINATION, PERFORMANCE_EVENT, RESOURCE_CONTENTION_EVENT, WARNING | +| `title` | string | Yes | Title of the event | +| `entitySelector` | string | No | Entity selector for the entities to attach the event to. Defaults to the environment entity | +| `startTime` | number | No | Event start in UTC milliseconds. Defaults to now | +| `endTime` | number | No | Event end in UTC milliseconds. Defaults to the start time plus the timeout | +| `eventTimeout` | number | No | Minutes the event stays open when no end time is given. Defaults to 15, capped at 360 | +| `properties` | json | No | Event properties as a key-value object. Max 100 entries, keys up to 100 and values up to 4096 characters | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `reportCount` | number | Number of events Dynatrace reported | +| `eventIngestResults` | array | One result per ingested event | +| ↳ `correlationId` | string | Correlation ID of the ingested event | +| ↳ `status` | string | OK, INVALID_ENTITY_TYPE, INVALID_METADATA, or INVALID_TIMESTAMPS | + +### Dynatrace Search Logs + +Search log records in Dynatrace by query and timeframe, for troubleshooting and incident analysis. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `environmentUrl` | string | Yes | Dynatrace environment URL \(e.g., https://abc12345.live.dynatrace.com, or https://your-activegate:9999/e/abc12345 for Managed\) | +| `apiToken` | string | Yes | Dynatrace access token \(dt0c01...\) with the logs.read scope, or storage:logs:read and storage:buckets:read on Grail | +| `query` | string | No | Log search query, e.g. status="ERROR" AND dt.entity.host="HOST-06F288EE2A930951" | +| `from` | string | No | Start of the timeframe as UTC milliseconds, ISO 8601, or a relative expression such as now-1h. Defaults to now-2w | +| `to` | string | No | End of the timeframe in the same formats as From. Defaults to now | +| `sort` | string | No | Sort by field with a + or - prefix, e.g. -timestamp for newest first | +| `limit` | number | No | Number of log records to return \(max 1000, default 1000\) | +| `nextSliceKey` | string | No | Cursor for the next slice. All other filters are ignored when it is set | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `results` | array | Matching log records | +| ↳ `timestamp` | number | Log timestamp in UTC milliseconds | +| ↳ `status` | string | Log level: ERROR, WARN, INFO, NONE, or NOT_APPLICABLE | +| ↳ `content` | string | Log message content | +| ↳ `eventType` | string | Event type of the record | +| ↳ `additionalColumns` | json | Additional log attributes keyed by column name | +| `sliceSize` | number | Number of records in this slice | +| `nextSliceKey` | string | Cursor for the next slice. Null when the result is complete | +| `warnings` | string | Warning raised while searching | + +### Dynatrace Ingest Logs + +Push log events into Dynatrace. Accepts a single log event object or an array of them. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `environmentUrl` | string | Yes | Dynatrace environment URL \(e.g., https://abc12345.live.dynatrace.com, or https://your-activegate:9999/e/abc12345 for Managed\) | +| `apiToken` | string | Yes | Dynatrace access token \(dt0c01...\) with the logs.ingest scope | +| `logs` | json | Yes | A log event object, or an array of them. Recognized keys are content, timestamp, and severity; any other key becomes a custom attribute \(e.g. \[\{"content":"Deploy finished","severity":"info","service":"checkout"\}\]\) | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `accepted` | boolean | True when Dynatrace accepted every log event \(HTTP 204\) | +| `statusCode` | number | HTTP status Dynatrace returned. 204 is full success, 200 is partial success | +| `details` | json | Partial-success details, present only when some events were rejected | + +### Dynatrace List SLOs + +List service-level objectives with their current attainment, error budget, and burn rate. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `environmentUrl` | string | Yes | Dynatrace environment URL \(e.g., https://abc12345.live.dynatrace.com, or https://your-activegate:9999/e/abc12345 for Managed\) | +| `apiToken` | string | Yes | Dynatrace access token \(dt0c01...\) with the slo.read scope | +| `sloSelector` | string | No | SLO selector, e.g. healthState\("WARNING"\),text\("checkout"\),problems\("true"\). Combine criteria with commas | +| `from` | string | No | Start of the evaluation timeframe as UTC milliseconds, ISO 8601, or a relative expression such as now-7d | +| `to` | string | No | End of the evaluation timeframe in the same formats as From. Defaults to now | +| `timeFrame` | string | No | CURRENT evaluates each SLO over its own timeframe; GTF evaluates over the From/To range | +| `sort` | string | No | Sort by name: name ascending or -name descending | +| `enabledSlos` | string | No | Filter by enabled state: true, false, or all | +| `evaluate` | boolean | No | Evaluate each SLO and include its calculated values | +| `showGlobalSlos` | boolean | No | Include SLOs that are not scoped to a management zone | +| `pageSize` | number | No | SLOs per page \(max 10000, default 10\) | +| `nextPageKey` | string | No | Cursor for the next page. All other filters are ignored when it is set | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `slos` | array | Matching service-level objectives | + +### Dynatrace Get SLO + +Get a single service-level objective with its evaluated attainment, error budget, and burn rate. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `environmentUrl` | string | Yes | Dynatrace environment URL \(e.g., https://abc12345.live.dynatrace.com, or https://your-activegate:9999/e/abc12345 for Managed\) | +| `apiToken` | string | Yes | Dynatrace access token \(dt0c01...\) with the slo.read scope | +| `sloId` | string | Yes | ID of the SLO | +| `from` | string | No | Start of the evaluation timeframe as UTC milliseconds, ISO 8601, or a relative expression such as now-7d. Defaults to now-2w | +| `to` | string | No | End of the evaluation timeframe in the same formats as From. Defaults to now | +| `timeFrame` | string | No | CURRENT evaluates the SLO over its own timeframe; GTF evaluates over the From/To range | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `slo` | object | The requested service-level objective | + +### Dynatrace List Security Problems + +List vulnerabilities detected by Dynatrace Application Security, filtered by risk level, status, CVE, or technology. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `environmentUrl` | string | Yes | Dynatrace environment URL \(e.g., https://abc12345.live.dynatrace.com, or https://your-activegate:9999/e/abc12345 for Managed\) | +| `apiToken` | string | Yes | Dynatrace access token \(dt0c01...\) with the securityProblems.read scope | +| `securityProblemSelector` | string | No | Security problem selector, e.g. status\("OPEN"\),riskLevel\("CRITICAL"\),technology\("JAVA"\) | +| `from` | string | No | Start of the timeframe as UTC milliseconds, ISO 8601, or a relative expression such as now-7d. Defaults to now-30d | +| `to` | string | No | End of the timeframe in the same formats as From. Defaults to now | +| `fields` | string | No | Comma-separated optional properties to include: +riskAssessment, +managementZones, +codeLevelVulnerabilityDetails, +globalCounts | +| `sort` | string | No | Sort by a field with a + or - prefix, e.g. -riskAssessment.riskScore | +| `pageSize` | number | No | Security problems per page \(max 500, default 100\) | +| `nextPageKey` | string | No | Cursor for the next page. All other filters are ignored when it is set | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `securityProblems` | array | Matching security problems | + +### Dynatrace Get Security Problem + +Get a single vulnerability with its description, remediation guidance, affected entities, and risk assessment. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `environmentUrl` | string | Yes | Dynatrace environment URL \(e.g., https://abc12345.live.dynatrace.com, or https://your-activegate:9999/e/abc12345 for Managed\) | +| `apiToken` | string | Yes | Dynatrace access token \(dt0c01...\) with the securityProblems.read scope | +| `securityProblemId` | string | Yes | ID of the security problem | +| `fields` | string | No | Comma-separated optional properties to include: +riskAssessment, +managementZones, +codeLevelVulnerabilityDetails, +globalCounts | +| `managementZoneFilter` | string | No | Restrict the counts to management zones, e.g. names\("Production"\) | +| `from` | string | No | Start of the timeframe as UTC milliseconds, ISO 8601, or a relative expression such as now-24h. Defaults to the last 24 hours | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `securityProblem` | object | The requested security problem | + +### Dynatrace Get Audit Logs + +Read the Dynatrace audit log — who changed which configuration, when, and whether it succeeded. + +#### Input + +| Parameter | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `environmentUrl` | string | Yes | Dynatrace environment URL \(e.g., https://abc12345.live.dynatrace.com, or https://your-activegate:9999/e/abc12345 for Managed\) | +| `apiToken` | string | Yes | Dynatrace access token \(dt0c01...\) with the auditLogs.read scope | +| `filter` | string | No | Audit log filter, e.g. eventType\("UPDATE"\),user\("someone@example.com"\),category\("CONFIG"\) | +| `from` | string | No | Start of the timeframe as UTC milliseconds, ISO 8601, or a relative expression such as now-1d. Defaults to now-2w | +| `to` | string | No | End of the timeframe in the same formats as From. Defaults to now | +| `sort` | string | No | timestamp for oldest first, or -timestamp for newest first \(default\) | +| `pageSize` | number | No | Entries per page \(max 5000, default 1000\) | +| `nextPageKey` | string | No | Cursor for the next page. All other filters are ignored when it is set | + +#### Output + +| Parameter | Type | Description | +| --------- | ---- | ----------- | +| `auditLogs` | array | Matching audit log entries | +| ↳ `logId` | string | Audit log entry ID | +| ↳ `eventType` | string | Type of the audited change | +| ↳ `category` | string | Category of the audited change | +| ↳ `entityId` | string | ID of the changed entity | +| ↳ `environmentId` | string | Environment the change happened in | +| ↳ `user` | string | User or token that made the change | +| ↳ `userType` | string | Type of the acting user | +| ↳ `userOrigin` | string | Origin of the request | +| ↳ `timestamp` | number | Change timestamp in UTC milliseconds | +| ↳ `success` | boolean | Whether the change succeeded | +| ↳ `message` | string | Description of the change | +| ↳ `patch` | json | JSON patch of the change | +| ↳ `settingsSchemaId` | string | Settings schema ID \(dt.settings.schema_id\) | +| ↳ `settingsScopeId` | string | Settings scope ID \(dt.settings.scope_id\) | +| ↳ `settingsKey` | string | Settings key \(dt.settings.key\) | +| ↳ `settingsObjectId` | string | Settings object ID \(dt.settings.object_id\) | +| ↳ `settingsObjectSummary` | string | Settings object summary \(dt.settings.object_summary\) | +| ↳ `settingsScopeName` | string | Settings scope name \(dt.settings.scope_name\) | + + diff --git a/apps/docs/content/docs/en/integrations/meta.json b/apps/docs/content/docs/en/integrations/meta.json index 431ce2d1c06..386a0d9361c 100644 --- a/apps/docs/content/docs/en/integrations/meta.json +++ b/apps/docs/content/docs/en/integrations/meta.json @@ -64,6 +64,7 @@ "dub", "duckduckgo", "dynamodb", + "dynatrace", "elasticsearch", "elevenlabs", "emailbison", diff --git a/apps/sim/blocks/blocks/dynatrace.ts b/apps/sim/blocks/blocks/dynatrace.ts new file mode 100644 index 00000000000..d2912da99d2 --- /dev/null +++ b/apps/sim/blocks/blocks/dynatrace.ts @@ -0,0 +1,1213 @@ +import { DynatraceIcon } from '@/components/icons' +import type { BlockConfig, BlockMeta } from '@/blocks/types' +import { AuthMode, IntegrationType } from '@/blocks/types' +import type { DynatraceResponse } from '@/tools/dynatrace/types' + +/** Operations that accept the shared `from` timeframe parameter. */ +const FROM_OPERATIONS = [ + 'dynatrace_list_problems', + 'dynatrace_query_metrics', + 'dynatrace_list_entities', + 'dynatrace_get_entity', + 'dynatrace_list_events', + 'dynatrace_search_logs', + 'dynatrace_list_slos', + 'dynatrace_get_slo', + 'dynatrace_list_security_problems', + 'dynatrace_get_security_problem', + 'dynatrace_get_audit_logs', +] + +/** Operations that accept the shared `to` timeframe parameter. */ +const TO_OPERATIONS = FROM_OPERATIONS.filter((op) => op !== 'dynatrace_get_security_problem') + +/** Operations that accept the shared `pageSize` / `nextPageKey` pagination parameters. */ +const PAGINATED_OPERATIONS = [ + 'dynatrace_list_problems', + 'dynatrace_list_problem_comments', + 'dynatrace_list_metrics', + 'dynatrace_list_entities', + 'dynatrace_list_entity_types', + 'dynatrace_list_events', + 'dynatrace_list_slos', + 'dynatrace_list_security_problems', + 'dynatrace_get_audit_logs', +] + +/** Operations that accept the shared `entitySelector` parameter. */ +const ENTITY_SELECTOR_OPERATIONS = [ + 'dynatrace_list_problems', + 'dynatrace_query_metrics', + 'dynatrace_list_entities', + 'dynatrace_list_events', + 'dynatrace_ingest_event', +] + +export const DynatraceBlock: BlockConfig = { + type: 'dynatrace', + name: 'Dynatrace', + description: 'Query Dynatrace problems, metrics, entities, logs, SLOs, and vulnerabilities', + longDescription: + 'Integrate Dynatrace into workflows. Investigate and close Davis problems, query metrics and monitored entities, search and ingest logs, push deployment events, track SLO burn rates, review Application Security vulnerabilities, and read the audit log.', + docsLink: 'https://docs.sim.ai/integrations/dynatrace', + category: 'tools', + integrationType: IntegrationType.Observability, + bgColor: '#FFFFFF', + icon: DynatraceIcon, + authMode: AuthMode.ApiKey, + + subBlocks: [ + { + id: 'operation', + title: 'Operation', + type: 'dropdown', + options: [ + { label: 'List Problems', id: 'dynatrace_list_problems' }, + { label: 'Get Problem', id: 'dynatrace_get_problem' }, + { label: 'Close Problem', id: 'dynatrace_close_problem' }, + { label: 'List Problem Comments', id: 'dynatrace_list_problem_comments' }, + { label: 'Add Problem Comment', id: 'dynatrace_add_problem_comment' }, + { label: 'Query Metrics', id: 'dynatrace_query_metrics' }, + { label: 'List Metrics', id: 'dynatrace_list_metrics' }, + { label: 'Get Metric Descriptor', id: 'dynatrace_get_metric' }, + { label: 'Ingest Metrics', id: 'dynatrace_ingest_metrics' }, + { label: 'List Entities', id: 'dynatrace_list_entities' }, + { label: 'Get Entity', id: 'dynatrace_get_entity' }, + { label: 'List Entity Types', id: 'dynatrace_list_entity_types' }, + { label: 'List Events', id: 'dynatrace_list_events' }, + { label: 'Get Event', id: 'dynatrace_get_event' }, + { label: 'Ingest Event', id: 'dynatrace_ingest_event' }, + { label: 'Search Logs', id: 'dynatrace_search_logs' }, + { label: 'Ingest Logs', id: 'dynatrace_ingest_logs' }, + { label: 'List SLOs', id: 'dynatrace_list_slos' }, + { label: 'Get SLO', id: 'dynatrace_get_slo' }, + { label: 'List Security Problems', id: 'dynatrace_list_security_problems' }, + { label: 'Get Security Problem', id: 'dynatrace_get_security_problem' }, + { label: 'Get Audit Logs', id: 'dynatrace_get_audit_logs' }, + ], + value: () => 'dynatrace_list_problems', + }, + + { + id: 'environmentUrl', + title: 'Environment URL', + type: 'short-input', + placeholder: 'https://abc12345.live.dynatrace.com', + required: true, + }, + { + id: 'apiToken', + title: 'Access Token', + type: 'short-input', + placeholder: 'dt0c01...', + password: true, + required: true, + }, + + { + id: 'problemId', + title: 'Problem ID', + type: 'short-input', + placeholder: '-1234567890123456789_1700000000000V2', + required: true, + condition: { + field: 'operation', + value: [ + 'dynatrace_get_problem', + 'dynatrace_close_problem', + 'dynatrace_list_problem_comments', + 'dynatrace_add_problem_comment', + ], + }, + }, + { + id: 'problemSelector', + title: 'Problem Selector', + type: 'short-input', + placeholder: 'status("open"),severityLevel("AVAILABILITY")', + condition: { field: 'operation', value: 'dynatrace_list_problems' }, + wandConfig: { + enabled: true, + prompt: `Generate a Dynatrace problem selector from the user's description. + +Criteria are comma-separated and each takes quoted values in parentheses. Common criteria: +- status("open") or status("closed") +- severityLevel("AVAILABILITY"|"CUSTOM_ALERT"|"ERROR"|"INFO"|"MONITORING_UNAVAILABLE"|"PERFORMANCE"|"RESOURCE_CONTENTION") +- impactLevel("APPLICATION"|"ENVIRONMENT"|"INFRASTRUCTURE"|"SERVICES") +- managementZones("Production") +- problemFilterNames("Critical alerts") +- text("checkout") + +Examples: +- "open availability problems" -> status("open"),severityLevel("AVAILABILITY") +- "closed service performance problems" -> status("closed"),severityLevel("PERFORMANCE"),impactLevel("SERVICES") + +Return ONLY the selector string - no explanations, no surrounding quotes.`, + placeholder: 'Describe the problems you want to find...', + }, + }, + { + id: 'problemSort', + title: 'Sort', + type: 'dropdown', + options: [ + { label: 'Newest first', id: '-startTime' }, + { label: 'Oldest first', id: '+startTime' }, + { label: 'Relevance', id: '-relevance' }, + { label: 'Status', id: 'status' }, + ], + mode: 'advanced', + condition: { field: 'operation', value: 'dynatrace_list_problems' }, + }, + { + id: 'problemFields', + title: 'Additional Fields', + type: 'short-input', + placeholder: 'evidenceDetails,impactAnalysis,recentComments', + mode: 'advanced', + condition: { + field: 'operation', + value: ['dynatrace_list_problems', 'dynatrace_get_problem'], + }, + }, + { + id: 'message', + title: 'Message', + type: 'long-input', + placeholder: 'Resolved by rolling back release 4.12.1', + required: true, + condition: { + field: 'operation', + value: ['dynatrace_close_problem', 'dynatrace_add_problem_comment'], + }, + }, + { + id: 'commentContext', + title: 'Comment Context', + type: 'short-input', + placeholder: 'Sim workflow', + mode: 'advanced', + condition: { field: 'operation', value: 'dynatrace_add_problem_comment' }, + }, + + { + id: 'metricSelector', + title: 'Metric Selector', + type: 'short-input', + placeholder: 'builtin:host.cpu.usage:avg', + required: { field: 'operation', value: 'dynatrace_query_metrics' }, + condition: { + field: 'operation', + value: ['dynatrace_query_metrics', 'dynatrace_list_metrics'], + }, + wandConfig: { + enabled: true, + prompt: `Generate a Dynatrace metric selector from the user's description. + +A metric selector is a metric key, optionally followed by transformation operators separated by colons. +Common builtin metric keys: builtin:host.cpu.usage, builtin:host.mem.usage, builtin:host.disk.usedPct, +builtin:service.response.time, builtin:service.errors.total.rate, builtin:apps.web.actionCount.load. +Common transformations: :avg, :max, :min, :sum, :count, :percentile(90), :names, :splitBy("dt.entity.host"), :sort(value(avg,descending)), :limit(10) + +Examples: +- "average CPU usage per host" -> builtin:host.cpu.usage:splitBy("dt.entity.host"):avg:names +- "top 10 slowest services" -> builtin:service.response.time:splitBy("dt.entity.service"):avg:sort(value(avg,descending)):limit(10):names + +Return ONLY the selector string - no explanations, no surrounding quotes.`, + placeholder: 'Describe the metric you want...', + }, + }, + { + id: 'resolution', + title: 'Resolution', + type: 'short-input', + placeholder: '10m, 120, or Inf', + mode: 'advanced', + condition: { field: 'operation', value: 'dynatrace_query_metrics' }, + }, + { + id: 'mzSelector', + title: 'Management Zone Selector', + type: 'short-input', + placeholder: 'mzName("Production")', + mode: 'advanced', + condition: { field: 'operation', value: 'dynatrace_query_metrics' }, + }, + { + id: 'metricKey', + title: 'Metric Key', + type: 'short-input', + placeholder: 'builtin:host.cpu.usage', + required: true, + condition: { field: 'operation', value: 'dynatrace_get_metric' }, + }, + { + id: 'text', + title: 'Search Text', + type: 'short-input', + placeholder: 'cpu', + condition: { field: 'operation', value: 'dynatrace_list_metrics' }, + }, + { + id: 'metadataSelector', + title: 'Metadata Selector', + type: 'short-input', + placeholder: 'unit("Percent"),tags("dashboard")', + mode: 'advanced', + condition: { field: 'operation', value: 'dynatrace_list_metrics' }, + }, + { + id: 'metricFields', + title: 'Additional Fields', + type: 'short-input', + placeholder: '+displayName,+unit,+aggregationTypes', + mode: 'advanced', + condition: { field: 'operation', value: 'dynatrace_list_metrics' }, + }, + { + id: 'writtenSince', + title: 'Written Since', + type: 'short-input', + placeholder: 'now-7d', + mode: 'advanced', + condition: { field: 'operation', value: 'dynatrace_list_metrics' }, + wandConfig: { + enabled: true, + prompt: + 'Generate a Dynatrace timeframe value: UTC milliseconds, an ISO 8601 timestamp, or a relative expression such as now-7d. Return ONLY the value.', + generationType: 'timestamp', + placeholder: 'Describe the point in time...', + }, + }, + { + id: 'writtenSinceMode', + title: 'Written Since Mode', + type: 'dropdown', + options: [ + { label: 'Include metrics written since', id: 'INCLUDE' }, + { label: 'Exclude metrics written since', id: 'EXCLUDE' }, + ], + mode: 'advanced', + condition: { field: 'operation', value: 'dynatrace_list_metrics' }, + }, + { + id: 'metricPayload', + title: 'Metric Lines', + type: 'long-input', + placeholder: 'cpu.temperature,dt.entity.host=HOST-06F288EE2A930951,cpu=1 55', + required: true, + condition: { field: 'operation', value: 'dynatrace_ingest_metrics' }, + }, + + { + id: 'entitySelector', + title: 'Entity Selector', + type: 'short-input', + placeholder: 'type("HOST"),tag("env:prod")', + required: { field: 'operation', value: 'dynatrace_list_entities' }, + condition: { field: 'operation', value: ENTITY_SELECTOR_OPERATIONS }, + wandConfig: { + enabled: true, + prompt: `Generate a Dynatrace entity selector from the user's description. + +Criteria are comma-separated and each takes quoted values in parentheses. Common criteria: +- type("HOST"|"SERVICE"|"APPLICATION"|"PROCESS_GROUP"|"PROCESS_GROUP_INSTANCE"|"KUBERNETES_CLUSTER"|"CLOUD_APPLICATION") +- entityId("HOST-06F288EE2A930951") +- entityName.equals("checkout-service") or entityName.contains("checkout") +- tag("env:prod") or tag("[AWS]Environment:production") +- mzName("Production") +- healthState("UNHEALTHY") + +Examples: +- "production hosts" -> type("HOST"),tag("env:prod") +- "unhealthy services named checkout" -> type("SERVICE"),entityName.contains("checkout"),healthState("UNHEALTHY") + +Return ONLY the selector string - no explanations, no surrounding quotes.`, + placeholder: 'Describe the entities you want...', + }, + }, + { + id: 'entityId', + title: 'Entity ID', + type: 'short-input', + placeholder: 'HOST-06F288EE2A930951', + required: true, + condition: { field: 'operation', value: 'dynatrace_get_entity' }, + }, + { + id: 'entityFields', + title: 'Additional Fields', + type: 'short-input', + placeholder: '+lastSeenTms,+properties.BITNESS,+tags', + mode: 'advanced', + condition: { + field: 'operation', + value: ['dynatrace_list_entities', 'dynatrace_get_entity'], + }, + }, + { + id: 'entitySort', + title: 'Sort', + type: 'dropdown', + options: [ + { label: 'Name ascending', id: '+displayName' }, + { label: 'Name descending', id: '-displayName' }, + ], + mode: 'advanced', + condition: { field: 'operation', value: 'dynatrace_list_entities' }, + }, + + { + id: 'eventSelector', + title: 'Event Selector', + type: 'short-input', + placeholder: 'eventType("CUSTOM_DEPLOYMENT"),status("OPEN")', + condition: { field: 'operation', value: 'dynatrace_list_events' }, + wandConfig: { + enabled: true, + prompt: `Generate a Dynatrace event selector from the user's description. + +Criteria are comma-separated and each takes quoted values in parentheses. Common criteria: +- eventType("CUSTOM_DEPLOYMENT"|"CUSTOM_ANNOTATION"|"CUSTOM_INFO"|"CUSTOM_ALERT"|"ERROR_EVENT"|"AVAILABILITY_EVENT"|"PERFORMANCE_EVENT"|"RESOURCE_CONTENTION_EVENT"|"MARKED_FOR_TERMINATION") +- status("OPEN"|"CLOSED") +- correlationId("build-42") +- eventId("...") +- managementZoneIds(...) + +Examples: +- "open deployment events" -> eventType("CUSTOM_DEPLOYMENT"),status("OPEN") +- "closed error events" -> eventType("ERROR_EVENT"),status("CLOSED") + +Return ONLY the selector string - no explanations, no surrounding quotes.`, + placeholder: 'Describe the events you want...', + }, + }, + { + id: 'eventId', + title: 'Event ID', + type: 'short-input', + placeholder: 'Enter the event ID', + required: true, + condition: { field: 'operation', value: 'dynatrace_get_event' }, + }, + { + id: 'eventType', + title: 'Event Type', + type: 'dropdown', + options: [ + { label: 'Custom Deployment', id: 'CUSTOM_DEPLOYMENT' }, + { label: 'Custom Annotation', id: 'CUSTOM_ANNOTATION' }, + { label: 'Custom Info', id: 'CUSTOM_INFO' }, + { label: 'Custom Alert', id: 'CUSTOM_ALERT' }, + { label: 'Custom Configuration', id: 'CUSTOM_CONFIGURATION' }, + { label: 'Availability Event', id: 'AVAILABILITY_EVENT' }, + { label: 'Error Event', id: 'ERROR_EVENT' }, + { label: 'Performance Event', id: 'PERFORMANCE_EVENT' }, + { label: 'Resource Contention Event', id: 'RESOURCE_CONTENTION_EVENT' }, + { label: 'Marked For Termination', id: 'MARKED_FOR_TERMINATION' }, + { label: 'Warning', id: 'WARNING' }, + ], + required: true, + condition: { field: 'operation', value: 'dynatrace_ingest_event' }, + value: () => 'CUSTOM_DEPLOYMENT', + }, + { + id: 'title', + title: 'Title', + type: 'short-input', + placeholder: 'Deployed checkout-service 4.12.2', + required: true, + condition: { field: 'operation', value: 'dynatrace_ingest_event' }, + }, + { + id: 'startTime', + title: 'Start Time', + type: 'short-input', + placeholder: 'UTC milliseconds', + mode: 'advanced', + condition: { field: 'operation', value: 'dynatrace_ingest_event' }, + wandConfig: { + enabled: true, + prompt: + 'Generate a Unix timestamp in UTC milliseconds for the moment described. Return ONLY the number.', + generationType: 'timestamp', + placeholder: 'Describe the start time...', + }, + }, + { + id: 'endTime', + title: 'End Time', + type: 'short-input', + placeholder: 'UTC milliseconds', + mode: 'advanced', + condition: { field: 'operation', value: 'dynatrace_ingest_event' }, + wandConfig: { + enabled: true, + prompt: + 'Generate a Unix timestamp in UTC milliseconds for the moment described. Return ONLY the number.', + generationType: 'timestamp', + placeholder: 'Describe the end time...', + }, + }, + { + id: 'eventTimeout', + title: 'Timeout (minutes)', + type: 'short-input', + placeholder: '15', + mode: 'advanced', + condition: { field: 'operation', value: 'dynatrace_ingest_event' }, + }, + { + id: 'eventProperties', + title: 'Properties', + type: 'long-input', + placeholder: '{ "version": "4.12.2", "ci.pipeline": "deploy-prod" }', + mode: 'advanced', + condition: { field: 'operation', value: 'dynatrace_ingest_event' }, + wandConfig: { + enabled: true, + prompt: + 'Generate a flat JSON object of Dynatrace event properties. Keys and values must be strings, max 100 entries. Return ONLY the JSON object.', + generationType: 'json-object', + placeholder: 'Describe the event properties...', + }, + }, + + { + id: 'logQuery', + title: 'Log Query', + type: 'long-input', + placeholder: 'status="ERROR" AND dt.entity.host="HOST-06F288EE2A930951"', + condition: { field: 'operation', value: 'dynatrace_search_logs' }, + wandConfig: { + enabled: true, + prompt: `Generate a Dynatrace log search query from the user's description. + +The query language matches log attributes with operators AND, OR, NOT, =, !=, and wildcards with *. +Common attributes: status ("ERROR", "WARN", "INFO"), content, loglevel, dt.entity.host, dt.entity.process_group, +k8s.namespace.name, k8s.pod.name, host.name, service.name, log.source. + +Examples: +- "errors from the checkout service" -> status="ERROR" AND service.name="checkout" +- "timeouts in the payments namespace" -> k8s.namespace.name="payments" AND content="*timeout*" + +Return ONLY the query string - no explanations, no surrounding quotes.`, + placeholder: 'Describe the logs you want to find...', + }, + }, + { + id: 'logSort', + title: 'Sort', + type: 'dropdown', + options: [ + { label: 'Newest first', id: '-timestamp' }, + { label: 'Oldest first', id: '+timestamp' }, + ], + mode: 'advanced', + condition: { field: 'operation', value: 'dynatrace_search_logs' }, + }, + { + id: 'limit', + title: 'Limit', + type: 'short-input', + placeholder: '1000', + mode: 'advanced', + condition: { field: 'operation', value: 'dynatrace_search_logs' }, + }, + { + id: 'nextSliceKey', + title: 'Next Slice Key', + type: 'short-input', + placeholder: 'Cursor from a previous search', + mode: 'advanced', + condition: { field: 'operation', value: 'dynatrace_search_logs' }, + }, + { + id: 'logs', + title: 'Log Events', + type: 'long-input', + placeholder: '[{ "content": "Deploy finished", "severity": "info", "service": "checkout" }]', + required: true, + condition: { field: 'operation', value: 'dynatrace_ingest_logs' }, + wandConfig: { + enabled: true, + prompt: + 'Generate a JSON array of Dynatrace log events. Each object may use content, timestamp, and severity; any other key becomes a custom attribute. Return ONLY the JSON array.', + generationType: 'json-object', + placeholder: 'Describe the log events to send...', + }, + }, + + { + id: 'sloSelector', + title: 'SLO Selector', + type: 'short-input', + placeholder: 'healthState("WARNING")', + condition: { field: 'operation', value: 'dynatrace_list_slos' }, + wandConfig: { + enabled: true, + prompt: `Generate a Dynatrace SLO selector from the user's description. + +Criteria are comma-separated and each takes quoted values in parentheses. Common criteria: +- healthState("SUCCESS"|"WARNING"|"FAILURE") +- text("checkout") +- problems("true"|"false") +- managementZones("Production") +- id("...") +- name("...") + +Examples: +- "failing SLOs" -> healthState("FAILURE") +- "checkout SLOs with open problems" -> text("checkout"),problems("true") + +Return ONLY the selector string - no explanations, no surrounding quotes.`, + placeholder: 'Describe the SLOs you want...', + }, + }, + { + id: 'sloId', + title: 'SLO ID', + type: 'short-input', + placeholder: 'Enter the SLO ID', + required: true, + condition: { field: 'operation', value: 'dynatrace_get_slo' }, + }, + { + id: 'timeFrame', + title: 'Evaluation Timeframe', + type: 'dropdown', + options: [ + { label: "The SLO's own timeframe (CURRENT)", id: 'CURRENT' }, + { label: 'The From/To range (GTF)', id: 'GTF' }, + ], + mode: 'advanced', + condition: { + field: 'operation', + value: ['dynatrace_list_slos', 'dynatrace_get_slo'], + }, + }, + { + id: 'sloSort', + title: 'Sort', + type: 'dropdown', + options: [ + { label: 'Name ascending', id: 'name' }, + { label: 'Name descending', id: '-name' }, + ], + mode: 'advanced', + condition: { field: 'operation', value: 'dynatrace_list_slos' }, + }, + { + id: 'enabledSlos', + title: 'Enabled State', + type: 'dropdown', + options: [ + { label: 'Enabled only', id: 'true' }, + { label: 'Disabled only', id: 'false' }, + { label: 'All', id: 'all' }, + ], + mode: 'advanced', + condition: { field: 'operation', value: 'dynatrace_list_slos' }, + }, + { + id: 'evaluate', + title: 'Evaluate SLOs', + type: 'switch', + mode: 'advanced', + condition: { field: 'operation', value: 'dynatrace_list_slos' }, + }, + { + id: 'showGlobalSlos', + title: 'Include Global SLOs', + type: 'switch', + mode: 'advanced', + condition: { field: 'operation', value: 'dynatrace_list_slos' }, + }, + + { + id: 'securityProblemSelector', + title: 'Security Problem Selector', + type: 'short-input', + placeholder: 'status("OPEN"),riskLevel("CRITICAL")', + condition: { field: 'operation', value: 'dynatrace_list_security_problems' }, + wandConfig: { + enabled: true, + prompt: `Generate a Dynatrace security problem selector from the user's description. + +Criteria are comma-separated and each takes quoted values in parentheses. Common criteria: +- status("OPEN"|"RESOLVED") +- riskLevel("CRITICAL"|"HIGH"|"MEDIUM"|"LOW"|"NONE") +- technology("JAVA"|"DOTNET"|"GO"|"NODE_JS"|"PHP"|"PYTHON"|"KUBERNETES") +- vulnerabilityType("CODE_LEVEL"|"RUNTIME"|"THIRD_PARTY") +- cveId("CVE-2021-44228") +- muted("true"|"false") +- externalVulnerabilityId("...") + +Examples: +- "open critical Java vulnerabilities" -> status("OPEN"),riskLevel("CRITICAL"),technology("JAVA") +- "unresolved Log4Shell" -> status("OPEN"),cveId("CVE-2021-44228") + +Return ONLY the selector string - no explanations, no surrounding quotes.`, + placeholder: 'Describe the vulnerabilities you want...', + }, + }, + { + id: 'securityProblemId', + title: 'Security Problem ID', + type: 'short-input', + placeholder: 'Enter the security problem ID', + required: true, + condition: { field: 'operation', value: 'dynatrace_get_security_problem' }, + }, + { + id: 'securityFields', + title: 'Additional Fields', + type: 'short-input', + placeholder: '+riskAssessment,+managementZones,+globalCounts', + mode: 'advanced', + condition: { + field: 'operation', + value: ['dynatrace_list_security_problems', 'dynatrace_get_security_problem'], + }, + }, + { + id: 'securitySort', + title: 'Sort', + type: 'short-input', + placeholder: '-riskAssessment.riskScore', + mode: 'advanced', + condition: { field: 'operation', value: 'dynatrace_list_security_problems' }, + }, + { + id: 'managementZoneFilter', + title: 'Management Zone Filter', + type: 'short-input', + placeholder: 'names("Production")', + mode: 'advanced', + condition: { field: 'operation', value: 'dynatrace_get_security_problem' }, + }, + + { + id: 'auditFilter', + title: 'Filter', + type: 'short-input', + placeholder: 'eventType("UPDATE"),user("someone@example.com")', + condition: { field: 'operation', value: 'dynatrace_get_audit_logs' }, + }, + { + id: 'auditSort', + title: 'Sort', + type: 'dropdown', + options: [ + { label: 'Newest first', id: '-timestamp' }, + { label: 'Oldest first', id: 'timestamp' }, + ], + mode: 'advanced', + condition: { field: 'operation', value: 'dynatrace_get_audit_logs' }, + }, + + { + id: 'from', + title: 'From', + type: 'short-input', + placeholder: 'now-2h', + mode: 'advanced', + condition: { field: 'operation', value: FROM_OPERATIONS }, + wandConfig: { + enabled: true, + prompt: + 'Generate a Dynatrace timeframe start: UTC milliseconds, an ISO 8601 timestamp, or a relative expression such as now-2h or now-1d/d. Return ONLY the value.', + generationType: 'timestamp', + placeholder: 'Describe the start of the timeframe...', + }, + }, + { + id: 'to', + title: 'To', + type: 'short-input', + placeholder: 'now', + mode: 'advanced', + condition: { field: 'operation', value: TO_OPERATIONS }, + wandConfig: { + enabled: true, + prompt: + 'Generate a Dynatrace timeframe end: UTC milliseconds, an ISO 8601 timestamp, or a relative expression such as now or now-5m. Return ONLY the value.', + generationType: 'timestamp', + placeholder: 'Describe the end of the timeframe...', + }, + }, + { + id: 'pageSize', + title: 'Page Size', + type: 'short-input', + placeholder: 'Entries per page', + mode: 'advanced', + condition: { field: 'operation', value: PAGINATED_OPERATIONS }, + }, + { + id: 'nextPageKey', + title: 'Next Page Key', + type: 'short-input', + placeholder: 'Cursor from a previous response', + mode: 'advanced', + condition: { field: 'operation', value: PAGINATED_OPERATIONS }, + }, + ], + + tools: { + access: [ + 'dynatrace_list_problems', + 'dynatrace_get_problem', + 'dynatrace_close_problem', + 'dynatrace_list_problem_comments', + 'dynatrace_add_problem_comment', + 'dynatrace_query_metrics', + 'dynatrace_list_metrics', + 'dynatrace_get_metric', + 'dynatrace_ingest_metrics', + 'dynatrace_list_entities', + 'dynatrace_get_entity', + 'dynatrace_list_entity_types', + 'dynatrace_list_events', + 'dynatrace_get_event', + 'dynatrace_ingest_event', + 'dynatrace_search_logs', + 'dynatrace_ingest_logs', + 'dynatrace_list_slos', + 'dynatrace_get_slo', + 'dynatrace_list_security_problems', + 'dynatrace_get_security_problem', + 'dynatrace_get_audit_logs', + ], + config: { + tool: (params) => params.operation, + params: (params) => { + const baseParams: Record = { + environmentUrl: params.environmentUrl, + apiToken: params.apiToken, + } + + const toNumber = (value: unknown) => + value === undefined || value === null || value === '' ? undefined : Number(value) + + const parseJson = (value: unknown) => { + if (value === undefined || value === null || value === '') return undefined + if (typeof value !== 'string') return value + try { + return JSON.parse(value) + } catch { + throw new Error('Value must be valid JSON') + } + } + + const pagination = { + pageSize: toNumber(params.pageSize), + nextPageKey: params.nextPageKey || undefined, + } + + switch (params.operation) { + case 'dynatrace_list_problems': + return { + ...baseParams, + ...pagination, + from: params.from || undefined, + to: params.to || undefined, + problemSelector: params.problemSelector || undefined, + entitySelector: params.entitySelector || undefined, + sort: params.problemSort || undefined, + fields: params.problemFields || undefined, + } + + case 'dynatrace_get_problem': + return { + ...baseParams, + problemId: params.problemId, + fields: params.problemFields || undefined, + } + + case 'dynatrace_close_problem': + return { ...baseParams, problemId: params.problemId, message: params.message } + + case 'dynatrace_list_problem_comments': + return { ...baseParams, ...pagination, problemId: params.problemId } + + case 'dynatrace_add_problem_comment': + return { + ...baseParams, + problemId: params.problemId, + message: params.message, + context: params.commentContext || undefined, + } + + case 'dynatrace_query_metrics': + return { + ...baseParams, + metricSelector: params.metricSelector, + from: params.from || undefined, + to: params.to || undefined, + resolution: params.resolution || undefined, + entitySelector: params.entitySelector || undefined, + mzSelector: params.mzSelector || undefined, + } + + case 'dynatrace_list_metrics': + return { + ...baseParams, + ...pagination, + metricSelector: params.metricSelector || undefined, + text: params.text || undefined, + fields: params.metricFields || undefined, + writtenSince: params.writtenSince || undefined, + writtenSinceMode: params.writtenSinceMode || undefined, + metadataSelector: params.metadataSelector || undefined, + } + + case 'dynatrace_get_metric': + return { ...baseParams, metricKey: params.metricKey } + + case 'dynatrace_ingest_metrics': + return { ...baseParams, payload: params.metricPayload } + + case 'dynatrace_list_entities': + return { + ...baseParams, + ...pagination, + entitySelector: params.entitySelector, + from: params.from || undefined, + to: params.to || undefined, + fields: params.entityFields || undefined, + sort: params.entitySort || undefined, + } + + case 'dynatrace_get_entity': + return { + ...baseParams, + entityId: params.entityId, + from: params.from || undefined, + to: params.to || undefined, + fields: params.entityFields || undefined, + } + + case 'dynatrace_list_entity_types': + return { ...baseParams, ...pagination } + + case 'dynatrace_list_events': + return { + ...baseParams, + ...pagination, + from: params.from || undefined, + to: params.to || undefined, + eventSelector: params.eventSelector || undefined, + entitySelector: params.entitySelector || undefined, + } + + case 'dynatrace_get_event': + return { ...baseParams, eventId: params.eventId } + + case 'dynatrace_ingest_event': + return { + ...baseParams, + eventType: params.eventType, + title: params.title, + entitySelector: params.entitySelector || undefined, + startTime: toNumber(params.startTime), + endTime: toNumber(params.endTime), + eventTimeout: toNumber(params.eventTimeout), + properties: parseJson(params.eventProperties), + } + + case 'dynatrace_search_logs': + return { + ...baseParams, + query: params.logQuery || undefined, + from: params.from || undefined, + to: params.to || undefined, + sort: params.logSort || undefined, + limit: toNumber(params.limit), + nextSliceKey: params.nextSliceKey || undefined, + } + + case 'dynatrace_ingest_logs': + return { ...baseParams, logs: parseJson(params.logs) } + + case 'dynatrace_list_slos': + return { + ...baseParams, + ...pagination, + sloSelector: params.sloSelector || undefined, + from: params.from || undefined, + to: params.to || undefined, + timeFrame: params.timeFrame || undefined, + sort: params.sloSort || undefined, + enabledSlos: params.enabledSlos || undefined, + evaluate: params.evaluate, + showGlobalSlos: params.showGlobalSlos, + } + + case 'dynatrace_get_slo': + return { + ...baseParams, + sloId: params.sloId, + from: params.from || undefined, + to: params.to || undefined, + timeFrame: params.timeFrame || undefined, + } + + case 'dynatrace_list_security_problems': + return { + ...baseParams, + ...pagination, + securityProblemSelector: params.securityProblemSelector || undefined, + from: params.from || undefined, + to: params.to || undefined, + fields: params.securityFields || undefined, + sort: params.securitySort || undefined, + } + + case 'dynatrace_get_security_problem': + return { + ...baseParams, + securityProblemId: params.securityProblemId, + fields: params.securityFields || undefined, + managementZoneFilter: params.managementZoneFilter || undefined, + from: params.from || undefined, + } + + case 'dynatrace_get_audit_logs': + return { + ...baseParams, + ...pagination, + filter: params.auditFilter || undefined, + from: params.from || undefined, + to: params.to || undefined, + sort: params.auditSort || undefined, + } + + default: + return baseParams + } + }, + }, + }, + + inputs: { + operation: { type: 'string', description: 'Operation to perform' }, + environmentUrl: { type: 'string', description: 'Dynatrace environment URL' }, + apiToken: { type: 'string', description: 'Dynatrace access token' }, + problemId: { type: 'string', description: 'Problem ID' }, + problemSelector: { type: 'string', description: 'Problem selector' }, + problemSort: { type: 'string', description: 'Sort order for problems' }, + problemFields: { type: 'string', description: 'Additional problem properties to include' }, + message: { type: 'string', description: 'Comment or closing message' }, + commentContext: { type: 'string', description: 'Context of the comment' }, + metricSelector: { type: 'string', description: 'Metric selector' }, + resolution: { type: 'string', description: 'Metric resolution' }, + mzSelector: { type: 'string', description: 'Management zone selector' }, + metricKey: { type: 'string', description: 'Metric key' }, + text: { type: 'string', description: 'Free-text metric search' }, + metadataSelector: { type: 'string', description: 'Metric metadata selector' }, + metricFields: { type: 'string', description: 'Additional metric properties to include' }, + writtenSince: { type: 'string', description: 'Only metrics written since this point' }, + writtenSinceMode: { type: 'string', description: 'INCLUDE or EXCLUDE for Written Since' }, + metricPayload: { type: 'string', description: 'Metric line protocol payload' }, + entitySelector: { type: 'string', description: 'Entity selector' }, + entityId: { type: 'string', description: 'Entity ID' }, + entityFields: { type: 'string', description: 'Additional entity properties to include' }, + entitySort: { type: 'string', description: 'Sort order for entities' }, + eventSelector: { type: 'string', description: 'Event selector' }, + eventId: { type: 'string', description: 'Event ID' }, + eventType: { type: 'string', description: 'Type of the event to ingest' }, + title: { type: 'string', description: 'Title of the event to ingest' }, + startTime: { type: 'number', description: 'Event start in UTC milliseconds' }, + endTime: { type: 'number', description: 'Event end in UTC milliseconds' }, + eventTimeout: { type: 'number', description: 'Event timeout in minutes' }, + eventProperties: { type: 'json', description: 'Event properties as a key-value object' }, + logQuery: { type: 'string', description: 'Log search query' }, + logSort: { type: 'string', description: 'Sort order for log records' }, + limit: { type: 'number', description: 'Number of log records to return' }, + nextSliceKey: { type: 'string', description: 'Cursor for the next log slice' }, + logs: { type: 'json', description: 'Log events to ingest' }, + sloSelector: { type: 'string', description: 'SLO selector' }, + sloId: { type: 'string', description: 'SLO ID' }, + timeFrame: { type: 'string', description: 'SLO evaluation timeframe: CURRENT or GTF' }, + sloSort: { type: 'string', description: 'Sort order for SLOs' }, + enabledSlos: { type: 'string', description: 'Filter SLOs by enabled state' }, + evaluate: { type: 'boolean', description: 'Evaluate each SLO' }, + showGlobalSlos: { type: 'boolean', description: 'Include SLOs without a management zone' }, + securityProblemSelector: { type: 'string', description: 'Security problem selector' }, + securityProblemId: { type: 'string', description: 'Security problem ID' }, + securityFields: { + type: 'string', + description: 'Additional security problem properties to include', + }, + securitySort: { type: 'string', description: 'Sort order for security problems' }, + managementZoneFilter: { type: 'string', description: 'Management zone filter' }, + auditFilter: { type: 'string', description: 'Audit log filter' }, + auditSort: { type: 'string', description: 'Sort order for audit log entries' }, + from: { type: 'string', description: 'Start of the timeframe' }, + to: { type: 'string', description: 'End of the timeframe' }, + pageSize: { type: 'number', description: 'Entries per page' }, + nextPageKey: { type: 'string', description: 'Cursor for the next page' }, + }, + + outputs: { + problems: { type: 'json', description: 'List of problems' }, + problem: { type: 'json', description: 'A single problem' }, + comments: { type: 'json', description: 'Comments on a problem' }, + comment: { type: 'json', description: 'The closing comment recorded on a problem' }, + closeTimestamp: { type: 'number', description: 'When problem closing was triggered' }, + closing: { type: 'boolean', description: 'Whether the problem is being closed' }, + result: { type: 'json', description: 'Metric query result, one entry per metric' }, + resolution: { type: 'string', description: 'Resolution Dynatrace used for the query' }, + metrics: { type: 'json', description: 'List of metric descriptors' }, + metric: { type: 'json', description: 'A single metric descriptor' }, + linesOk: { type: 'number', description: 'Accepted metric data points' }, + linesInvalid: { type: 'number', description: 'Rejected metric data points' }, + ingestError: { type: 'json', description: 'Details of invalid metric lines' }, + entities: { type: 'json', description: 'List of monitored entities' }, + entity: { type: 'json', description: 'A single monitored entity' }, + types: { type: 'json', description: 'List of entity types' }, + events: { type: 'json', description: 'List of events' }, + event: { type: 'json', description: 'A single event' }, + reportCount: { type: 'number', description: 'Number of events reported' }, + eventIngestResults: { type: 'json', description: 'Per-event ingestion results' }, + results: { type: 'json', description: 'Matching log records' }, + sliceSize: { type: 'number', description: 'Number of log records in the slice' }, + nextSliceKey: { type: 'string', description: 'Cursor for the next log slice' }, + accepted: { type: 'boolean', description: 'Whether every log event was accepted' }, + statusCode: { type: 'number', description: 'HTTP status of the log ingestion' }, + details: { type: 'json', description: 'Partial-success details of the log ingestion' }, + slos: { type: 'json', description: 'List of service-level objectives' }, + slo: { type: 'json', description: 'A single service-level objective' }, + securityProblems: { type: 'json', description: 'List of security problems' }, + securityProblem: { type: 'json', description: 'A single security problem' }, + auditLogs: { type: 'json', description: 'List of audit log entries' }, + problemId: { type: 'string', description: 'ID of the affected problem' }, + message: { type: 'string', description: 'Comment text that was recorded' }, + context: { type: 'string', description: 'Context of the recorded comment' }, + totalCount: { type: 'number', description: 'Total number of matching entries' }, + pageSize: { type: 'number', description: 'Number of entries in the page' }, + nextPageKey: { type: 'string', description: 'Cursor for the next page' }, + warnings: { type: 'json', description: 'Warnings returned alongside the result' }, + }, +} + +export const DynatraceBlockMeta = { + tags: ['monitoring', 'incident-management', 'error-tracking'], + url: 'https://www.dynatrace.com', + templates: [ + { + icon: DynatraceIcon, + title: 'Dynatrace problem triage', + prompt: + 'Build a scheduled workflow that polls Dynatrace every five minutes for open problems, pulls the root cause entity and recent logs for each one, summarizes the likely cause with an agent, and posts the enriched problem to Slack and PagerDuty.', + modules: ['scheduled', 'agent', 'workflows'], + category: 'engineering', + tags: ['devops', 'monitoring'], + alsoIntegrations: ['slack', 'pagerduty'], + }, + { + icon: DynatraceIcon, + title: 'Dynatrace deploy marker', + prompt: + 'Create a workflow that runs when a GitHub release is published and ingests a CUSTOM_DEPLOYMENT event into Dynatrace with the version, commit, and service entity selector, so metric changes can be correlated with the deploy.', + modules: ['agent', 'workflows'], + category: 'engineering', + tags: ['devops', 'ci-cd'], + alsoIntegrations: ['github'], + }, + { + icon: DynatraceIcon, + title: 'Dynatrace SLO burn-rate watch', + prompt: + 'Build a scheduled hourly workflow that reads Dynatrace SLOs, flags any with a fast error-budget burn rate, and opens a Linear issue with the SLO name, remaining budget, and time to exhaustion.', + modules: ['scheduled', 'agent', 'workflows'], + category: 'engineering', + tags: ['devops', 'reporting'], + alsoIntegrations: ['linear'], + }, + { + icon: DynatraceIcon, + title: 'Dynatrace vulnerability digest', + prompt: + 'Create a scheduled daily workflow that lists open critical and high Dynatrace security problems, groups them by affected service and CVE, writes them to a Sim table, and posts a remediation digest to the security channel in Slack.', + modules: ['scheduled', 'tables', 'agent', 'workflows'], + category: 'engineering', + tags: ['devops', 'reporting'], + alsoIntegrations: ['slack'], + }, + { + icon: DynatraceIcon, + title: 'Dynatrace capacity report', + prompt: + 'Build a scheduled weekly workflow that queries Dynatrace host CPU, memory, and disk metrics per management zone, ranks the most saturated hosts, and writes a capacity planning report to a Sim table.', + modules: ['scheduled', 'tables', 'agent', 'workflows'], + category: 'engineering', + tags: ['devops', 'analysis'], + }, + { + icon: DynatraceIcon, + title: 'Dynatrace log error triage', + prompt: + 'Create a scheduled workflow that searches Dynatrace logs for new error patterns in the last fifteen minutes, clusters them by message shape with an agent, and posts only the previously unseen clusters to Slack.', + modules: ['scheduled', 'agent', 'workflows'], + category: 'engineering', + tags: ['devops', 'monitoring'], + alsoIntegrations: ['slack'], + }, + { + icon: DynatraceIcon, + title: 'Dynatrace auto-close on recovery', + prompt: + 'Build a scheduled workflow that checks Dynatrace problems whose entities have returned to a healthy metric baseline, closes them with an explanatory comment, and records what was closed in a Sim table for review.', + modules: ['scheduled', 'tables', 'agent', 'workflows'], + category: 'operations', + tags: ['automation', 'monitoring'], + }, + { + icon: DynatraceIcon, + title: 'Dynatrace config audit', + prompt: + 'Create a scheduled weekly workflow that reads the Dynatrace audit log for configuration changes, highlights changes made outside business hours or by service accounts, and emails a compliance summary to the platform team.', + modules: ['scheduled', 'agent', 'workflows'], + category: 'operations', + tags: ['reporting', 'automation'], + alsoIntegrations: ['gmail'], + }, + ], + skills: [ + { + name: 'triage-open-problems', + description: + 'Pull open Dynatrace problems, attach root cause and impact context, and rank them for on-call.', + content: + '# Triage Open Problems\n\nBuild a prioritized picture of what is currently broken.\n\n## Steps\n1. List problems with a selector of `status("open")` over the relevant timeframe.\n2. For each problem, get its details with the `evidenceDetails` and `impactAnalysis` fields so the root cause entity and estimated affected users are included.\n3. Get the root cause entity to read its type, tags, and management zones.\n4. Rank by impact level, severity level, and estimated affected users.\n\n## Output\nReturn a ranked list: display ID, title, severity, impact, root cause entity, affected entity count, and how long the problem has been open.', + }, + { + name: 'correlate-deploy-with-metrics', + description: 'Mark a deploy in Dynatrace and compare service metrics before and after it.', + content: + '# Correlate Deploy With Metrics\n\nMake a release visible in Dynatrace and prove whether it moved the numbers.\n\n## Steps\n1. Ingest a `CUSTOM_DEPLOYMENT` event with the version and pipeline as properties, scoped to the service with an entity selector.\n2. Query the service response time and error rate metrics for the window before the deploy.\n3. Query the same metrics for the window after the deploy.\n4. Compare the two and state whether the release regressed either metric.\n\n## Output\nReturn the deploy event correlation ID plus a before/after table of each metric, with the percentage change and a regression verdict.', + }, + { + name: 'review-slo-health', + description: 'Report SLO attainment, remaining error budget, and burn rate.', + content: + '# Review SLO Health\n\nProduce an SLO scorecard for a service review or weekly report.\n\n## Steps\n1. List SLOs with evaluation enabled so the calculated values are populated.\n2. Filter to the ones that are failing or warning, and to any with a FAST burn rate.\n3. For each flagged SLO, get its details to read the estimated time to consume the error budget.\n4. Group results by management zone or service.\n\n## Output\nReturn each SLO with its target, current attainment, remaining error budget, burn rate type, and time to exhaustion. Flag the ones that will breach before the period ends.', + }, + { + name: 'investigate-entity', + description: + 'Assemble the full picture of one host or service: properties, metrics, events, and logs.', + content: + '# Investigate Entity\n\nGather everything Dynatrace knows about a single entity.\n\n## Steps\n1. Get the entity by ID, or list entities with a selector to find it by name or tag.\n2. Query its key metrics over the incident window using an entity selector scoped to its ID.\n3. List events for the same entity and window to find deploys, restarts, or configuration changes.\n4. Search logs filtered to the entity to pull the errors around the same time.\n\n## Output\nReturn the entity properties and tags, a metric summary over the window, the timeline of events, and the top recurring log errors.', + }, + { + name: 'audit-vulnerabilities', + description: + 'Inventory open Dynatrace vulnerabilities by risk, exposure, and affected service.', + content: + '# Audit Vulnerabilities\n\nTurn Application Security findings into a remediation queue.\n\n## Steps\n1. List security problems with `status("OPEN")` and request the `riskAssessment` and `globalCounts` fields.\n2. Sort by risk score and separate the publicly exposed ones with reachable data assets — those are the ones to fix first.\n3. Get the details of each high-priority finding to read its description, remediation guidance, and vulnerable components.\n4. Group by affected service or package so one upgrade can close several findings.\n\n## Output\nReturn a remediation queue: CVE, risk level and score, exposure, affected services, vulnerable component version, and the recommended fix.', + }, + ], +} as const satisfies BlockMeta diff --git a/apps/sim/blocks/registry-maps.ts b/apps/sim/blocks/registry-maps.ts index 95d449636a6..1bef4ad9d28 100644 --- a/apps/sim/blocks/registry-maps.ts +++ b/apps/sim/blocks/registry-maps.ts @@ -60,6 +60,7 @@ import { DSPyBlock, DSPyBlockMeta } from '@/blocks/blocks/dspy' import { DubBlock, DubBlockMeta } from '@/blocks/blocks/dub' import { DuckDuckGoBlock, DuckDuckGoBlockMeta } from '@/blocks/blocks/duckduckgo' import { DynamoDBBlock, DynamoDBBlockMeta } from '@/blocks/blocks/dynamodb' +import { DynatraceBlock, DynatraceBlockMeta } from '@/blocks/blocks/dynatrace' import { ElasticsearchBlock, ElasticsearchBlockMeta } from '@/blocks/blocks/elasticsearch' import { ElevenLabsBlock, ElevenLabsBlockMeta } from '@/blocks/blocks/elevenlabs' import { EmailBisonBlock, EmailBisonBlockMeta } from '@/blocks/blocks/emailbison' @@ -411,6 +412,7 @@ export const BLOCK_REGISTRY: Record = { dub: DubBlock, duckduckgo: DuckDuckGoBlock, dynamodb: DynamoDBBlock, + dynatrace: DynatraceBlock, elasticsearch: ElasticsearchBlock, elevenlabs: ElevenLabsBlock, emailbison: EmailBisonBlock, @@ -735,6 +737,7 @@ export const BLOCK_META_REGISTRY: Record = { dub: DubBlockMeta, duckduckgo: DuckDuckGoBlockMeta, dynamodb: DynamoDBBlockMeta, + dynatrace: DynatraceBlockMeta, elasticsearch: ElasticsearchBlockMeta, elevenlabs: ElevenLabsBlockMeta, emailbison: EmailBisonBlockMeta, diff --git a/apps/sim/components/icons.tsx b/apps/sim/components/icons.tsx index b4dfeefc3f3..9a3d08eb0a7 100644 --- a/apps/sim/components/icons.tsx +++ b/apps/sim/components/icons.tsx @@ -6048,6 +6048,37 @@ export function RDSIcon(props: SVGProps) { ) } +export function DynatraceIcon(props: SVGProps) { + return ( + + + + + + + + + ) +} + export function DynamoDBIcon(props: SVGProps) { return ( = { dub: DubIcon, duckduckgo: DuckDuckGoIcon, dynamodb: DynamoDBIcon, + dynatrace: DynatraceIcon, elasticsearch: ElasticsearchIcon, elevenlabs: ElevenLabsIcon, emailbison: EmailBisonIcon, diff --git a/apps/sim/lib/integrations/integrations.json b/apps/sim/lib/integrations/integrations.json index 7212898d7ac..87eb70423ea 100644 --- a/apps/sim/lib/integrations/integrations.json +++ b/apps/sim/lib/integrations/integrations.json @@ -5427,6 +5427,113 @@ "integrationType": "search", "tags": ["web-scraping"] }, + { + "type": "dynatrace", + "slug": "dynatrace", + "name": "Dynatrace", + "description": "Query Dynatrace problems, metrics, entities, logs, SLOs, and vulnerabilities", + "longDescription": "Integrate Dynatrace into workflows. Investigate and close Davis problems, query metrics and monitored entities, search and ingest logs, push deployment events, track SLO burn rates, review Application Security vulnerabilities, and read the audit log.", + "bgColor": "#FFFFFF", + "iconName": "DynatraceIcon", + "docsUrl": "https://docs.sim.ai/integrations/dynatrace", + "operations": [ + { + "name": "List Problems", + "description": "List Davis-detected problems in a Dynatrace environment, filtered by timeframe, problem selector, or entity selector." + }, + { + "name": "Get Problem", + "description": "Get the full details of a single Dynatrace problem, including root cause, affected entities, and optionally its evidence and impact analysis." + }, + { + "name": "Close Problem", + "description": "Close a Dynatrace problem and record the closing comment." + }, + { + "name": "List Problem Comments", + "description": "List the comments recorded on a Dynatrace problem." + }, + { + "name": "Add Problem Comment", + "description": "Add a comment to a Dynatrace problem." + }, + { + "name": "Query Metrics", + "description": "Read metric data points from Dynatrace using a metric selector, with optional entity and management-zone scoping." + }, + { + "name": "List Metrics", + "description": "Discover the metrics available in a Dynatrace environment, filtered by metric selector, free text, or metadata." + }, + { + "name": "Get Metric Descriptor", + "description": "Get the descriptor of a single Dynatrace metric — its unit, dimensions, supported aggregations, and transformations." + }, + { + "name": "Ingest Metrics", + "description": "Push custom metric data points into Dynatrace using the metric line protocol, one data point per line." + }, + { + "name": "List Entities", + "description": "List monitored entities — hosts, services, applications, Kubernetes workloads — matching an entity selector." + }, + { + "name": "Get Entity", + "description": "Get the properties, tags, management zones, and relationships of a single monitored entity." + }, + { + "name": "List Entity Types", + "description": "List the monitored entity types available in the environment, with the properties and relationships each supports. Use it to build valid entity selectors." + }, + { + "name": "List Events", + "description": "List events — deployments, availability changes, alerts, custom annotations — in a Dynatrace environment." + }, + { + "name": "Get Event", + "description": "Get the full details of a single Dynatrace event." + }, + { + "name": "Ingest Event", + "description": "Push an event into Dynatrace — a deployment marker, custom annotation, or custom alert — attached to the entities matched by an entity selector." + }, + { + "name": "Search Logs", + "description": "Search log records in Dynatrace by query and timeframe, for troubleshooting and incident analysis." + }, + { + "name": "Ingest Logs", + "description": "Push log events into Dynatrace. Accepts a single log event object or an array of them." + }, + { + "name": "List SLOs", + "description": "List service-level objectives with their current attainment, error budget, and burn rate." + }, + { + "name": "Get SLO", + "description": "Get a single service-level objective with its evaluated attainment, error budget, and burn rate." + }, + { + "name": "List Security Problems", + "description": "List vulnerabilities detected by Dynatrace Application Security, filtered by risk level, status, CVE, or technology." + }, + { + "name": "Get Security Problem", + "description": "Get a single vulnerability with its description, remediation guidance, affected entities, and risk assessment." + }, + { + "name": "Get Audit Logs", + "description": "Read the Dynatrace audit log — who changed which configuration, when, and whether it succeeded." + } + ], + "operationCount": 22, + "triggers": [], + "triggerCount": 0, + "authType": "api-key", + "category": "tools", + "integrationType": "observability", + "tags": ["monitoring", "incident-management", "error-tracking"] + }, { "type": "elasticsearch", "slug": "elasticsearch", diff --git a/apps/sim/tools/dynatrace/add_problem_comment.ts b/apps/sim/tools/dynatrace/add_problem_comment.ts new file mode 100644 index 00000000000..674dc8268c4 --- /dev/null +++ b/apps/sim/tools/dynatrace/add_problem_comment.ts @@ -0,0 +1,81 @@ +import type { + DynatraceAddProblemCommentParams, + DynatraceAddProblemCommentResponse, +} from '@/tools/dynatrace/types' +import { buildDynatraceUrl, dynatraceHeaders } from '@/tools/dynatrace/utils' +import type { ToolConfig } from '@/tools/types' + +export const addProblemCommentTool: ToolConfig< + DynatraceAddProblemCommentParams, + DynatraceAddProblemCommentResponse +> = { + id: 'dynatrace_add_problem_comment', + name: 'Dynatrace Add Problem Comment', + description: 'Add a comment to a Dynatrace problem.', + version: '1.0.0', + + params: { + environmentUrl: { + type: 'string', + required: true, + visibility: 'user-only', + description: + 'Dynatrace environment URL (e.g., https://abc12345.live.dynatrace.com, or https://your-activegate:9999/e/abc12345 for Managed)', + }, + apiToken: { + type: 'string', + required: true, + visibility: 'user-only', + description: 'Dynatrace access token (dt0c01...) with the problems.write scope', + }, + problemId: { + type: 'string', + required: true, + visibility: 'user-or-llm', + description: 'ID of the problem to comment on', + }, + message: { + type: 'string', + required: true, + visibility: 'user-or-llm', + description: 'Text of the comment', + }, + context: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: 'Context of the comment, shown alongside the author (e.g., the source system)', + }, + }, + + request: { + url: (params) => + buildDynatraceUrl( + params.environmentUrl, + `/problems/${encodeURIComponent(params.problemId)}/comments` + ), + method: 'POST', + headers: (params) => dynatraceHeaders(params.apiToken), + body: (params) => { + const body: Record = { message: params.message } + if (params.context) body.context = params.context + return body + }, + }, + + /** The endpoint answers 201 with no body, so the created comment is echoed back. */ + transformResponse: async (_response: Response, params?: DynatraceAddProblemCommentParams) => ({ + success: true, + output: { + problemId: params?.problemId ?? '', + message: params?.message ?? '', + context: params?.context ?? null, + }, + }), + + outputs: { + problemId: { type: 'string', description: 'ID of the problem the comment was added to' }, + message: { type: 'string', description: 'Text of the comment that was added' }, + context: { type: 'string', description: 'Context of the comment', nullable: true }, + }, +} diff --git a/apps/sim/tools/dynatrace/close_problem.ts b/apps/sim/tools/dynatrace/close_problem.ts new file mode 100644 index 00000000000..f9332c1a87a --- /dev/null +++ b/apps/sim/tools/dynatrace/close_problem.ts @@ -0,0 +1,95 @@ +import { commentProperties } from '@/tools/dynatrace/outputs' +import type { + DynatraceCloseProblemParams, + DynatraceCloseProblemResponse, +} from '@/tools/dynatrace/types' +import { + buildDynatraceUrl, + dynatraceHeaders, + mapComment, + readJsonBody, +} from '@/tools/dynatrace/utils' +import type { ToolConfig } from '@/tools/types' + +export const closeProblemTool: ToolConfig< + DynatraceCloseProblemParams, + DynatraceCloseProblemResponse +> = { + id: 'dynatrace_close_problem', + name: 'Dynatrace Close Problem', + description: 'Close a Dynatrace problem and record the closing comment.', + version: '1.0.0', + + params: { + environmentUrl: { + type: 'string', + required: true, + visibility: 'user-only', + description: + 'Dynatrace environment URL (e.g., https://abc12345.live.dynatrace.com, or https://your-activegate:9999/e/abc12345 for Managed)', + }, + apiToken: { + type: 'string', + required: true, + visibility: 'user-only', + description: 'Dynatrace access token (dt0c01...) with the problems.write scope', + }, + problemId: { + type: 'string', + required: true, + visibility: 'user-or-llm', + description: 'ID of the problem to close', + }, + message: { + type: 'string', + required: true, + visibility: 'user-or-llm', + description: 'Text of the closing comment', + }, + }, + + request: { + url: (params) => + buildDynatraceUrl( + params.environmentUrl, + `/problems/${encodeURIComponent(params.problemId)}/close` + ), + method: 'POST', + headers: (params) => dynatraceHeaders(params.apiToken), + body: (params) => ({ message: params.message }), + }, + + transformResponse: async (response: Response) => { + const data = await readJsonBody(response) + + return { + success: true, + output: { + problemId: (data.problemId as string) ?? null, + closeTimestamp: (data.closeTimestamp as number) ?? null, + closing: (data.closing as boolean) ?? null, + comment: mapComment(data.comment), + }, + } + }, + + outputs: { + problemId: { type: 'string', description: 'ID of the closed problem', nullable: true }, + closeTimestamp: { + type: 'number', + description: 'Timestamp when closing was triggered, in UTC milliseconds', + nullable: true, + }, + closing: { + type: 'boolean', + description: 'Whether the problem is in the process of being closed', + nullable: true, + }, + comment: { + type: 'object', + description: 'The closing comment that was recorded', + nullable: true, + properties: commentProperties, + }, + }, +} diff --git a/apps/sim/tools/dynatrace/get_audit_logs.ts b/apps/sim/tools/dynatrace/get_audit_logs.ts new file mode 100644 index 00000000000..379ae25ad30 --- /dev/null +++ b/apps/sim/tools/dynatrace/get_audit_logs.ts @@ -0,0 +1,168 @@ +import { nextPageKeyOutput, pageSizeOutput, totalCountOutput } from '@/tools/dynatrace/outputs' +import type { + DynatraceGetAuditLogsParams, + DynatraceGetAuditLogsResponse, +} from '@/tools/dynatrace/types' +import { + buildDynatraceUrl, + dynatraceHeaders, + mapAuditLog, + readJsonBody, +} from '@/tools/dynatrace/utils' +import type { ToolConfig } from '@/tools/types' + +export const getAuditLogsTool: ToolConfig< + DynatraceGetAuditLogsParams, + DynatraceGetAuditLogsResponse +> = { + id: 'dynatrace_get_audit_logs', + name: 'Dynatrace Get Audit Logs', + description: + 'Read the Dynatrace audit log — who changed which configuration, when, and whether it succeeded.', + version: '1.0.0', + + params: { + environmentUrl: { + type: 'string', + required: true, + visibility: 'user-only', + description: + 'Dynatrace environment URL (e.g., https://abc12345.live.dynatrace.com, or https://your-activegate:9999/e/abc12345 for Managed)', + }, + apiToken: { + type: 'string', + required: true, + visibility: 'user-only', + description: 'Dynatrace access token (dt0c01...) with the auditLogs.read scope', + }, + filter: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: + 'Audit log filter, e.g. eventType("UPDATE"),user("someone@example.com"),category("CONFIG")', + }, + from: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: + 'Start of the timeframe as UTC milliseconds, ISO 8601, or a relative expression such as now-1d. Defaults to now-2w', + }, + to: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: 'End of the timeframe in the same formats as From. Defaults to now', + }, + sort: { + type: 'string', + required: false, + visibility: 'user-only', + description: 'timestamp for oldest first, or -timestamp for newest first (default)', + }, + pageSize: { + type: 'number', + required: false, + visibility: 'user-only', + description: 'Entries per page (max 5000, default 1000)', + }, + nextPageKey: { + type: 'string', + required: false, + visibility: 'user-only', + description: 'Cursor for the next page. All other filters are ignored when it is set', + }, + }, + + request: { + url: (params) => + params.nextPageKey + ? buildDynatraceUrl(params.environmentUrl, '/auditlogs', { + nextPageKey: params.nextPageKey, + }) + : buildDynatraceUrl(params.environmentUrl, '/auditlogs', { + filter: params.filter, + from: params.from, + to: params.to, + sort: params.sort, + pageSize: params.pageSize, + }), + method: 'GET', + headers: (params) => dynatraceHeaders(params.apiToken), + }, + + transformResponse: async (response: Response) => { + const data = await readJsonBody(response) + const auditLogs = Array.isArray(data.auditLogs) + ? (data.auditLogs as Array>) + : [] + + return { + success: true, + output: { + auditLogs: auditLogs.map(mapAuditLog), + totalCount: (data.totalCount as number) ?? null, + pageSize: (data.pageSize as number) ?? null, + nextPageKey: (data.nextPageKey as string) ?? null, + }, + } + }, + + outputs: { + auditLogs: { + type: 'array', + description: 'Matching audit log entries', + items: { + type: 'object', + properties: { + logId: { type: 'string', description: 'Audit log entry ID' }, + eventType: { type: 'string', description: 'Type of the audited change' }, + category: { type: 'string', description: 'Category of the audited change' }, + entityId: { type: 'string', description: 'ID of the changed entity', nullable: true }, + environmentId: { type: 'string', description: 'Environment the change happened in' }, + user: { type: 'string', description: 'User or token that made the change' }, + userType: { type: 'string', description: 'Type of the acting user' }, + userOrigin: { type: 'string', description: 'Origin of the request', nullable: true }, + timestamp: { type: 'number', description: 'Change timestamp in UTC milliseconds' }, + success: { type: 'boolean', description: 'Whether the change succeeded' }, + message: { type: 'string', description: 'Description of the change', nullable: true }, + patch: { type: 'json', description: 'JSON patch of the change', nullable: true }, + settingsSchemaId: { + type: 'string', + description: 'Settings schema ID (dt.settings.schema_id)', + nullable: true, + }, + settingsScopeId: { + type: 'string', + description: 'Settings scope ID (dt.settings.scope_id)', + nullable: true, + }, + settingsKey: { + type: 'string', + description: 'Settings key (dt.settings.key)', + nullable: true, + }, + settingsObjectId: { + type: 'string', + description: 'Settings object ID (dt.settings.object_id)', + nullable: true, + }, + settingsObjectSummary: { + type: 'string', + description: 'Settings object summary (dt.settings.object_summary)', + nullable: true, + }, + settingsScopeName: { + type: 'string', + description: 'Settings scope name (dt.settings.scope_name)', + nullable: true, + }, + }, + }, + }, + totalCount: totalCountOutput, + pageSize: pageSizeOutput, + nextPageKey: nextPageKeyOutput, + }, +} diff --git a/apps/sim/tools/dynatrace/get_entity.ts b/apps/sim/tools/dynatrace/get_entity.ts new file mode 100644 index 00000000000..89cec2d8fc9 --- /dev/null +++ b/apps/sim/tools/dynatrace/get_entity.ts @@ -0,0 +1,89 @@ +import { entityProperties } from '@/tools/dynatrace/outputs' +import type { DynatraceGetEntityParams, DynatraceGetEntityResponse } from '@/tools/dynatrace/types' +import { + buildDynatraceUrl, + dynatraceHeaders, + mapEntity, + readJsonBody, +} from '@/tools/dynatrace/utils' +import type { ToolConfig } from '@/tools/types' + +export const getEntityTool: ToolConfig = { + id: 'dynatrace_get_entity', + name: 'Dynatrace Get Entity', + description: + 'Get the properties, tags, management zones, and relationships of a single monitored entity.', + version: '1.0.0', + + params: { + environmentUrl: { + type: 'string', + required: true, + visibility: 'user-only', + description: + 'Dynatrace environment URL (e.g., https://abc12345.live.dynatrace.com, or https://your-activegate:9999/e/abc12345 for Managed)', + }, + apiToken: { + type: 'string', + required: true, + visibility: 'user-only', + description: 'Dynatrace access token (dt0c01...) with the entities.read scope', + }, + entityId: { + type: 'string', + required: true, + visibility: 'user-or-llm', + description: 'ID of the entity (e.g., HOST-06F288EE2A930951)', + }, + from: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: + 'Start of the timeframe as UTC milliseconds, ISO 8601, or a relative expression such as now-3d. Defaults to now-3d', + }, + to: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: 'End of the timeframe in the same formats as From. Defaults to now', + }, + fields: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: + 'Comma-separated additional entity properties to include (e.g. +lastSeenTms,+properties.BITNESS)', + }, + }, + + request: { + url: (params) => + buildDynatraceUrl(params.environmentUrl, `/entities/${encodeURIComponent(params.entityId)}`, { + from: params.from, + to: params.to, + fields: params.fields, + }), + method: 'GET', + headers: (params) => dynatraceHeaders(params.apiToken), + }, + + transformResponse: async (response: Response) => { + const data = await readJsonBody(response) + + return { + success: true, + output: { + entity: mapEntity(data), + }, + } + }, + + outputs: { + entity: { + type: 'object', + description: 'The requested monitored entity', + properties: entityProperties, + }, + }, +} diff --git a/apps/sim/tools/dynatrace/get_event.ts b/apps/sim/tools/dynatrace/get_event.ts new file mode 100644 index 00000000000..1cb96698501 --- /dev/null +++ b/apps/sim/tools/dynatrace/get_event.ts @@ -0,0 +1,64 @@ +import { eventProperties } from '@/tools/dynatrace/outputs' +import type { DynatraceGetEventParams, DynatraceGetEventResponse } from '@/tools/dynatrace/types' +import { + buildDynatraceUrl, + dynatraceHeaders, + mapEvent, + readJsonBody, +} from '@/tools/dynatrace/utils' +import type { ToolConfig } from '@/tools/types' + +export const getEventTool: ToolConfig = { + id: 'dynatrace_get_event', + name: 'Dynatrace Get Event', + description: 'Get the full details of a single Dynatrace event.', + version: '1.0.0', + + params: { + environmentUrl: { + type: 'string', + required: true, + visibility: 'user-only', + description: + 'Dynatrace environment URL (e.g., https://abc12345.live.dynatrace.com, or https://your-activegate:9999/e/abc12345 for Managed)', + }, + apiToken: { + type: 'string', + required: true, + visibility: 'user-only', + description: 'Dynatrace access token (dt0c01...) with the events.read scope', + }, + eventId: { + type: 'string', + required: true, + visibility: 'user-or-llm', + description: 'ID of the event', + }, + }, + + request: { + url: (params) => + buildDynatraceUrl(params.environmentUrl, `/events/${encodeURIComponent(params.eventId)}`), + method: 'GET', + headers: (params) => dynatraceHeaders(params.apiToken), + }, + + transformResponse: async (response: Response) => { + const data = await readJsonBody(response) + + return { + success: true, + output: { + event: mapEvent(data), + }, + } + }, + + outputs: { + event: { + type: 'object', + description: 'The requested event', + properties: eventProperties, + }, + }, +} diff --git a/apps/sim/tools/dynatrace/get_metric.ts b/apps/sim/tools/dynatrace/get_metric.ts new file mode 100644 index 00000000000..84b6802a567 --- /dev/null +++ b/apps/sim/tools/dynatrace/get_metric.ts @@ -0,0 +1,70 @@ +import { metricDescriptorProperties } from '@/tools/dynatrace/outputs' +import type { DynatraceGetMetricParams, DynatraceGetMetricResponse } from '@/tools/dynatrace/types' +import { + buildDynatraceUrl, + dynatraceHeaders, + encodeDynatracePathSegment, + mapMetricDescriptor, + readJsonBody, +} from '@/tools/dynatrace/utils' +import type { ToolConfig } from '@/tools/types' + +export const getMetricTool: ToolConfig = { + id: 'dynatrace_get_metric', + name: 'Dynatrace Get Metric Descriptor', + description: + 'Get the descriptor of a single Dynatrace metric — its unit, dimensions, supported aggregations, and transformations.', + version: '1.0.0', + + params: { + environmentUrl: { + type: 'string', + required: true, + visibility: 'user-only', + description: + 'Dynatrace environment URL (e.g., https://abc12345.live.dynatrace.com, or https://your-activegate:9999/e/abc12345 for Managed)', + }, + apiToken: { + type: 'string', + required: true, + visibility: 'user-only', + description: 'Dynatrace access token (dt0c01...) with the metrics.read scope', + }, + metricKey: { + type: 'string', + required: true, + visibility: 'user-or-llm', + description: + 'Metric key, optionally followed by transformation operators separated by a colon (e.g. builtin:host.cpu.usage)', + }, + }, + + request: { + url: (params) => + buildDynatraceUrl( + params.environmentUrl, + `/metrics/${encodeDynatracePathSegment(params.metricKey)}` + ), + method: 'GET', + headers: (params) => dynatraceHeaders(params.apiToken), + }, + + transformResponse: async (response: Response) => { + const data = await readJsonBody(response) + + return { + success: true, + output: { + metric: mapMetricDescriptor(data), + }, + } + }, + + outputs: { + metric: { + type: 'object', + description: 'The requested metric descriptor', + properties: metricDescriptorProperties, + }, + }, +} diff --git a/apps/sim/tools/dynatrace/get_problem.ts b/apps/sim/tools/dynatrace/get_problem.ts new file mode 100644 index 00000000000..35091f0a806 --- /dev/null +++ b/apps/sim/tools/dynatrace/get_problem.ts @@ -0,0 +1,79 @@ +import { problemProperties } from '@/tools/dynatrace/outputs' +import type { + DynatraceGetProblemParams, + DynatraceGetProblemResponse, +} from '@/tools/dynatrace/types' +import { + buildDynatraceUrl, + dynatraceHeaders, + mapProblem, + readJsonBody, +} from '@/tools/dynatrace/utils' +import type { ToolConfig } from '@/tools/types' + +export const getProblemTool: ToolConfig = { + id: 'dynatrace_get_problem', + name: 'Dynatrace Get Problem', + description: + 'Get the full details of a single Dynatrace problem, including root cause, affected entities, and optionally its evidence and impact analysis.', + version: '1.0.0', + + params: { + environmentUrl: { + type: 'string', + required: true, + visibility: 'user-only', + description: + 'Dynatrace environment URL (e.g., https://abc12345.live.dynatrace.com, or https://your-activegate:9999/e/abc12345 for Managed)', + }, + apiToken: { + type: 'string', + required: true, + visibility: 'user-only', + description: 'Dynatrace access token (dt0c01...) with the problems.read scope', + }, + problemId: { + type: 'string', + required: true, + visibility: 'user-or-llm', + description: 'ID of the problem (e.g., -1234567890123456789_1700000000000V2)', + }, + fields: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: + 'Comma-separated optional properties to include: evidenceDetails, impactAnalysis, recentComments', + }, + }, + + request: { + url: (params) => + buildDynatraceUrl( + params.environmentUrl, + `/problems/${encodeURIComponent(params.problemId)}`, + { fields: params.fields } + ), + method: 'GET', + headers: (params) => dynatraceHeaders(params.apiToken), + }, + + transformResponse: async (response: Response) => { + const data = await readJsonBody(response) + + return { + success: true, + output: { + problem: mapProblem(data), + }, + } + }, + + outputs: { + problem: { + type: 'object', + description: 'The requested problem', + properties: problemProperties, + }, + }, +} diff --git a/apps/sim/tools/dynatrace/get_security_problem.ts b/apps/sim/tools/dynatrace/get_security_problem.ts new file mode 100644 index 00000000000..5c439f623b0 --- /dev/null +++ b/apps/sim/tools/dynatrace/get_security_problem.ts @@ -0,0 +1,99 @@ +import { securityProblemDetailsProperties } from '@/tools/dynatrace/outputs' +import type { + DynatraceGetSecurityProblemParams, + DynatraceGetSecurityProblemResponse, +} from '@/tools/dynatrace/types' +import { + buildDynatraceUrl, + dynatraceHeaders, + mapSecurityProblemDetails, + readJsonBody, +} from '@/tools/dynatrace/utils' +import type { ToolConfig } from '@/tools/types' + +export const getSecurityProblemTool: ToolConfig< + DynatraceGetSecurityProblemParams, + DynatraceGetSecurityProblemResponse +> = { + id: 'dynatrace_get_security_problem', + name: 'Dynatrace Get Security Problem', + description: + 'Get a single vulnerability with its description, remediation guidance, affected entities, and risk assessment.', + version: '1.0.0', + + params: { + environmentUrl: { + type: 'string', + required: true, + visibility: 'user-only', + description: + 'Dynatrace environment URL (e.g., https://abc12345.live.dynatrace.com, or https://your-activegate:9999/e/abc12345 for Managed)', + }, + apiToken: { + type: 'string', + required: true, + visibility: 'user-only', + description: 'Dynatrace access token (dt0c01...) with the securityProblems.read scope', + }, + securityProblemId: { + type: 'string', + required: true, + visibility: 'user-or-llm', + description: 'ID of the security problem', + }, + fields: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: + 'Comma-separated optional properties to include: +riskAssessment, +managementZones, +codeLevelVulnerabilityDetails, +globalCounts', + }, + managementZoneFilter: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: 'Restrict the counts to management zones, e.g. names("Production")', + }, + from: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: + 'Start of the timeframe as UTC milliseconds, ISO 8601, or a relative expression such as now-24h. Defaults to the last 24 hours', + }, + }, + + request: { + url: (params) => + buildDynatraceUrl( + params.environmentUrl, + `/securityProblems/${encodeURIComponent(params.securityProblemId)}`, + { + fields: params.fields, + managementZoneFilter: params.managementZoneFilter, + from: params.from, + } + ), + method: 'GET', + headers: (params) => dynatraceHeaders(params.apiToken), + }, + + transformResponse: async (response: Response) => { + const data = await readJsonBody(response) + + return { + success: true, + output: { + securityProblem: mapSecurityProblemDetails(data), + }, + } + }, + + outputs: { + securityProblem: { + type: 'object', + description: 'The requested security problem', + properties: securityProblemDetailsProperties, + }, + }, +} diff --git a/apps/sim/tools/dynatrace/get_slo.ts b/apps/sim/tools/dynatrace/get_slo.ts new file mode 100644 index 00000000000..81288585ef1 --- /dev/null +++ b/apps/sim/tools/dynatrace/get_slo.ts @@ -0,0 +1,84 @@ +import { sloProperties } from '@/tools/dynatrace/outputs' +import type { DynatraceGetSloParams, DynatraceGetSloResponse } from '@/tools/dynatrace/types' +import { buildDynatraceUrl, dynatraceHeaders, mapSlo, readJsonBody } from '@/tools/dynatrace/utils' +import type { ToolConfig } from '@/tools/types' + +export const getSloTool: ToolConfig = { + id: 'dynatrace_get_slo', + name: 'Dynatrace Get SLO', + description: + 'Get a single service-level objective with its evaluated attainment, error budget, and burn rate.', + version: '1.0.0', + + params: { + environmentUrl: { + type: 'string', + required: true, + visibility: 'user-only', + description: + 'Dynatrace environment URL (e.g., https://abc12345.live.dynatrace.com, or https://your-activegate:9999/e/abc12345 for Managed)', + }, + apiToken: { + type: 'string', + required: true, + visibility: 'user-only', + description: 'Dynatrace access token (dt0c01...) with the slo.read scope', + }, + sloId: { + type: 'string', + required: true, + visibility: 'user-or-llm', + description: 'ID of the SLO', + }, + from: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: + 'Start of the evaluation timeframe as UTC milliseconds, ISO 8601, or a relative expression such as now-7d. Defaults to now-2w', + }, + to: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: 'End of the evaluation timeframe in the same formats as From. Defaults to now', + }, + timeFrame: { + type: 'string', + required: false, + visibility: 'user-only', + description: + 'CURRENT evaluates the SLO over its own timeframe; GTF evaluates over the From/To range', + }, + }, + + request: { + url: (params) => + buildDynatraceUrl(params.environmentUrl, `/slo/${encodeURIComponent(params.sloId)}`, { + from: params.from, + to: params.to, + timeFrame: params.timeFrame, + }), + method: 'GET', + headers: (params) => dynatraceHeaders(params.apiToken), + }, + + transformResponse: async (response: Response) => { + const data = await readJsonBody(response) + + return { + success: true, + output: { + slo: mapSlo(data), + }, + } + }, + + outputs: { + slo: { + type: 'object', + description: 'The requested service-level objective', + properties: sloProperties, + }, + }, +} diff --git a/apps/sim/tools/dynatrace/index.ts b/apps/sim/tools/dynatrace/index.ts new file mode 100644 index 00000000000..71313f5f5fe --- /dev/null +++ b/apps/sim/tools/dynatrace/index.ts @@ -0,0 +1,45 @@ +import { addProblemCommentTool } from '@/tools/dynatrace/add_problem_comment' +import { closeProblemTool } from '@/tools/dynatrace/close_problem' +import { getAuditLogsTool } from '@/tools/dynatrace/get_audit_logs' +import { getEntityTool } from '@/tools/dynatrace/get_entity' +import { getEventTool } from '@/tools/dynatrace/get_event' +import { getMetricTool } from '@/tools/dynatrace/get_metric' +import { getProblemTool } from '@/tools/dynatrace/get_problem' +import { getSecurityProblemTool } from '@/tools/dynatrace/get_security_problem' +import { getSloTool } from '@/tools/dynatrace/get_slo' +import { ingestEventTool } from '@/tools/dynatrace/ingest_event' +import { ingestLogsTool } from '@/tools/dynatrace/ingest_logs' +import { ingestMetricsTool } from '@/tools/dynatrace/ingest_metrics' +import { listEntitiesTool } from '@/tools/dynatrace/list_entities' +import { listEntityTypesTool } from '@/tools/dynatrace/list_entity_types' +import { listEventsTool } from '@/tools/dynatrace/list_events' +import { listMetricsTool } from '@/tools/dynatrace/list_metrics' +import { listProblemCommentsTool } from '@/tools/dynatrace/list_problem_comments' +import { listProblemsTool } from '@/tools/dynatrace/list_problems' +import { listSecurityProblemsTool } from '@/tools/dynatrace/list_security_problems' +import { listSlosTool } from '@/tools/dynatrace/list_slos' +import { queryMetricsTool } from '@/tools/dynatrace/query_metrics' +import { searchLogsTool } from '@/tools/dynatrace/search_logs' + +export const dynatraceAddProblemCommentTool = addProblemCommentTool +export const dynatraceCloseProblemTool = closeProblemTool +export const dynatraceGetAuditLogsTool = getAuditLogsTool +export const dynatraceGetEntityTool = getEntityTool +export const dynatraceGetEventTool = getEventTool +export const dynatraceGetMetricTool = getMetricTool +export const dynatraceGetProblemTool = getProblemTool +export const dynatraceGetSecurityProblemTool = getSecurityProblemTool +export const dynatraceGetSloTool = getSloTool +export const dynatraceIngestEventTool = ingestEventTool +export const dynatraceIngestLogsTool = ingestLogsTool +export const dynatraceIngestMetricsTool = ingestMetricsTool +export const dynatraceListEntitiesTool = listEntitiesTool +export const dynatraceListEntityTypesTool = listEntityTypesTool +export const dynatraceListEventsTool = listEventsTool +export const dynatraceListMetricsTool = listMetricsTool +export const dynatraceListProblemCommentsTool = listProblemCommentsTool +export const dynatraceListProblemsTool = listProblemsTool +export const dynatraceListSecurityProblemsTool = listSecurityProblemsTool +export const dynatraceListSlosTool = listSlosTool +export const dynatraceQueryMetricsTool = queryMetricsTool +export const dynatraceSearchLogsTool = searchLogsTool diff --git a/apps/sim/tools/dynatrace/ingest_event.ts b/apps/sim/tools/dynatrace/ingest_event.ts new file mode 100644 index 00000000000..bf9e94a7773 --- /dev/null +++ b/apps/sim/tools/dynatrace/ingest_event.ts @@ -0,0 +1,139 @@ +import type { + DynatraceIngestEventParams, + DynatraceIngestEventResponse, +} from '@/tools/dynatrace/types' +import { buildDynatraceUrl, dynatraceHeaders, readJsonBody } from '@/tools/dynatrace/utils' +import type { ToolConfig } from '@/tools/types' + +export const ingestEventTool: ToolConfig = + { + id: 'dynatrace_ingest_event', + name: 'Dynatrace Ingest Event', + description: + 'Push an event into Dynatrace — a deployment marker, custom annotation, or custom alert — attached to the entities matched by an entity selector.', + version: '1.0.0', + + params: { + environmentUrl: { + type: 'string', + required: true, + visibility: 'user-only', + description: + 'Dynatrace environment URL (e.g., https://abc12345.live.dynatrace.com, or https://your-activegate:9999/e/abc12345 for Managed)', + }, + apiToken: { + type: 'string', + required: true, + visibility: 'user-only', + description: 'Dynatrace access token (dt0c01...) with the events.ingest scope', + }, + eventType: { + type: 'string', + required: true, + visibility: 'user-or-llm', + description: + 'One of AVAILABILITY_EVENT, CUSTOM_ALERT, CUSTOM_ANNOTATION, CUSTOM_CONFIGURATION, CUSTOM_DEPLOYMENT, CUSTOM_INFO, ERROR_EVENT, MARKED_FOR_TERMINATION, PERFORMANCE_EVENT, RESOURCE_CONTENTION_EVENT, WARNING', + }, + title: { + type: 'string', + required: true, + visibility: 'user-or-llm', + description: 'Title of the event', + }, + entitySelector: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: + 'Entity selector for the entities to attach the event to. Defaults to the environment entity', + }, + startTime: { + type: 'number', + required: false, + visibility: 'user-or-llm', + description: 'Event start in UTC milliseconds. Defaults to now', + }, + endTime: { + type: 'number', + required: false, + visibility: 'user-or-llm', + description: 'Event end in UTC milliseconds. Defaults to the start time plus the timeout', + }, + eventTimeout: { + type: 'number', + required: false, + visibility: 'user-or-llm', + description: + 'Minutes the event stays open when no end time is given. Defaults to 15, capped at 360', + }, + properties: { + type: 'json', + required: false, + visibility: 'user-or-llm', + description: + 'Event properties as a key-value object. Max 100 entries, keys up to 100 and values up to 4096 characters', + }, + }, + + request: { + url: (params) => buildDynatraceUrl(params.environmentUrl, '/events/ingest'), + method: 'POST', + headers: (params) => dynatraceHeaders(params.apiToken), + body: (params) => { + const body: Record = { + eventType: params.eventType, + title: params.title, + } + if (params.entitySelector) body.entitySelector = params.entitySelector + if (params.startTime !== undefined) body.startTime = params.startTime + if (params.endTime !== undefined) body.endTime = params.endTime + if (params.eventTimeout !== undefined) body.timeout = params.eventTimeout + if (params.properties) body.properties = params.properties + return body + }, + }, + + transformResponse: async (response: Response) => { + const data = await readJsonBody(response) + const results = Array.isArray(data.eventIngestResults) + ? (data.eventIngestResults as Array>) + : [] + + return { + success: true, + output: { + reportCount: (data.reportCount as number) ?? null, + eventIngestResults: results.map((result) => ({ + correlationId: (result.correlationId as string) ?? null, + status: (result.status as string) ?? null, + })), + }, + } + }, + + outputs: { + reportCount: { + type: 'number', + description: 'Number of events Dynatrace reported', + nullable: true, + }, + eventIngestResults: { + type: 'array', + description: 'One result per ingested event', + items: { + type: 'object', + properties: { + correlationId: { + type: 'string', + description: 'Correlation ID of the ingested event', + nullable: true, + }, + status: { + type: 'string', + description: 'OK, INVALID_ENTITY_TYPE, INVALID_METADATA, or INVALID_TIMESTAMPS', + }, + }, + }, + }, + }, + } diff --git a/apps/sim/tools/dynatrace/ingest_logs.ts b/apps/sim/tools/dynatrace/ingest_logs.ts new file mode 100644 index 00000000000..9dfed2aea3f --- /dev/null +++ b/apps/sim/tools/dynatrace/ingest_logs.ts @@ -0,0 +1,75 @@ +import type { + DynatraceIngestLogsParams, + DynatraceIngestLogsResponse, +} from '@/tools/dynatrace/types' +import { buildDynatraceUrl, dynatraceHeaders, readJsonBody } from '@/tools/dynatrace/utils' +import type { ToolConfig } from '@/tools/types' + +export const ingestLogsTool: ToolConfig = { + id: 'dynatrace_ingest_logs', + name: 'Dynatrace Ingest Logs', + description: + 'Push log events into Dynatrace. Accepts a single log event object or an array of them.', + version: '1.0.0', + + params: { + environmentUrl: { + type: 'string', + required: true, + visibility: 'user-only', + description: + 'Dynatrace environment URL (e.g., https://abc12345.live.dynatrace.com, or https://your-activegate:9999/e/abc12345 for Managed)', + }, + apiToken: { + type: 'string', + required: true, + visibility: 'user-only', + description: 'Dynatrace access token (dt0c01...) with the logs.ingest scope', + }, + logs: { + type: 'json', + required: true, + visibility: 'user-or-llm', + description: + 'A log event object, or an array of them. Recognized keys are content, timestamp, and severity; any other key becomes a custom attribute (e.g. [{"content":"Deploy finished","severity":"info","service":"checkout"}])', + }, + }, + + request: { + url: (params) => buildDynatraceUrl(params.environmentUrl, '/logs/ingest'), + method: 'POST', + headers: (params) => dynatraceHeaders(params.apiToken), + body: (params) => JSON.stringify(params.logs), + }, + + /** Ingestion answers 204 with no body, or 200 with a partial-success body. */ + transformResponse: async (response: Response) => { + const data = await readJsonBody(response) + const hasDetails = Object.keys(data).length > 0 + + return { + success: true, + output: { + accepted: response.status === 204, + statusCode: response.status, + details: hasDetails ? data : null, + }, + } + }, + + outputs: { + accepted: { + type: 'boolean', + description: 'True when Dynatrace accepted every log event (HTTP 204)', + }, + statusCode: { + type: 'number', + description: 'HTTP status Dynatrace returned. 204 is full success, 200 is partial success', + }, + details: { + type: 'json', + description: 'Partial-success details, present only when some events were rejected', + nullable: true, + }, + }, +} diff --git a/apps/sim/tools/dynatrace/ingest_metrics.ts b/apps/sim/tools/dynatrace/ingest_metrics.ts new file mode 100644 index 00000000000..1fb307e7ceb --- /dev/null +++ b/apps/sim/tools/dynatrace/ingest_metrics.ts @@ -0,0 +1,84 @@ +import type { + DynatraceIngestMetricsParams, + DynatraceIngestMetricsResponse, +} from '@/tools/dynatrace/types' +import { buildDynatraceUrl, dynatraceHeaders, readJsonBody } from '@/tools/dynatrace/utils' +import type { ToolConfig } from '@/tools/types' + +export const ingestMetricsTool: ToolConfig< + DynatraceIngestMetricsParams, + DynatraceIngestMetricsResponse +> = { + id: 'dynatrace_ingest_metrics', + name: 'Dynatrace Ingest Metrics', + description: + 'Push custom metric data points into Dynatrace using the metric line protocol, one data point per line.', + version: '1.0.0', + + params: { + environmentUrl: { + type: 'string', + required: true, + visibility: 'user-only', + description: + 'Dynatrace environment URL (e.g., https://abc12345.live.dynatrace.com, or https://your-activegate:9999/e/abc12345 for Managed)', + }, + apiToken: { + type: 'string', + required: true, + visibility: 'user-only', + description: 'Dynatrace access token (dt0c01...) with the metrics.ingest scope', + }, + payload: { + type: 'string', + required: true, + visibility: 'user-or-llm', + description: + 'Metric line protocol payload, one data point per line, max 1 MB (e.g. cpu.temperature,dt.entity.host=HOST-06F288EE2A930951,cpu=1 55)', + }, + }, + + request: { + url: (params) => buildDynatraceUrl(params.environmentUrl, '/metrics/ingest'), + method: 'POST', + headers: (params) => dynatraceHeaders(params.apiToken, 'text/plain'), + body: (params) => params.payload, + }, + + transformResponse: async (response: Response) => { + const data = await readJsonBody(response) + + return { + success: true, + output: { + linesOk: (data.linesOk as number) ?? null, + linesInvalid: (data.linesInvalid as number) ?? null, + ingestError: (data.error as Record) ?? null, + warnings: (data.warnings as Record) ?? null, + }, + } + }, + + outputs: { + linesOk: { + type: 'number', + description: 'Number of accepted data points', + nullable: true, + }, + linesInvalid: { + type: 'number', + description: 'Number of rejected data points', + nullable: true, + }, + ingestError: { + type: 'json', + description: 'Details of the invalid lines, with the line number and reason for each', + nullable: true, + }, + warnings: { + type: 'json', + description: 'Warnings raised during ingestion, such as changed metric keys', + nullable: true, + }, + }, +} diff --git a/apps/sim/tools/dynatrace/list_entities.ts b/apps/sim/tools/dynatrace/list_entities.ts new file mode 100644 index 00000000000..806cfaaf1a3 --- /dev/null +++ b/apps/sim/tools/dynatrace/list_entities.ts @@ -0,0 +1,135 @@ +import { + entityProperties, + nextPageKeyOutput, + pageSizeOutput, + totalCountOutput, +} from '@/tools/dynatrace/outputs' +import type { + DynatraceListEntitiesParams, + DynatraceListEntitiesResponse, +} from '@/tools/dynatrace/types' +import { + buildDynatraceUrl, + dynatraceHeaders, + mapEntity, + readJsonBody, +} from '@/tools/dynatrace/utils' +import type { ToolConfig } from '@/tools/types' + +export const listEntitiesTool: ToolConfig< + DynatraceListEntitiesParams, + DynatraceListEntitiesResponse +> = { + id: 'dynatrace_list_entities', + name: 'Dynatrace List Entities', + description: + 'List monitored entities — hosts, services, applications, Kubernetes workloads — matching an entity selector.', + version: '1.0.0', + + params: { + environmentUrl: { + type: 'string', + required: true, + visibility: 'user-only', + description: + 'Dynatrace environment URL (e.g., https://abc12345.live.dynatrace.com, or https://your-activegate:9999/e/abc12345 for Managed)', + }, + apiToken: { + type: 'string', + required: true, + visibility: 'user-only', + description: 'Dynatrace access token (dt0c01...) with the entities.read scope', + }, + entitySelector: { + type: 'string', + required: true, + visibility: 'user-or-llm', + description: + 'Entity selector defining the scope, e.g. type("HOST"),tag("env:prod") or entityId("HOST-06F288EE2A930951")', + }, + from: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: + 'Start of the timeframe as UTC milliseconds, ISO 8601, or a relative expression such as now-3d. Defaults to now-3d', + }, + to: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: 'End of the timeframe in the same formats as From. Defaults to now', + }, + fields: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: + 'Comma-separated additional entity properties to include (e.g. +lastSeenTms,+properties.BITNESS,+tags)', + }, + sort: { + type: 'string', + required: false, + visibility: 'user-only', + description: 'Sort by display name: +displayName ascending or -displayName descending', + }, + pageSize: { + type: 'number', + required: false, + visibility: 'user-only', + description: 'Entities per page (default 50)', + }, + nextPageKey: { + type: 'string', + required: false, + visibility: 'user-only', + description: 'Cursor for the next page. All other filters are ignored when it is set', + }, + }, + + request: { + url: (params) => + params.nextPageKey + ? buildDynatraceUrl(params.environmentUrl, '/entities', { + nextPageKey: params.nextPageKey, + }) + : buildDynatraceUrl(params.environmentUrl, '/entities', { + entitySelector: params.entitySelector, + from: params.from, + to: params.to, + fields: params.fields, + sort: params.sort, + pageSize: params.pageSize, + }), + method: 'GET', + headers: (params) => dynatraceHeaders(params.apiToken), + }, + + transformResponse: async (response: Response) => { + const data = await readJsonBody(response) + const entities = Array.isArray(data.entities) + ? (data.entities as Array>) + : [] + + return { + success: true, + output: { + entities: entities.map(mapEntity), + totalCount: (data.totalCount as number) ?? null, + pageSize: (data.pageSize as number) ?? null, + nextPageKey: (data.nextPageKey as string) ?? null, + }, + } + }, + + outputs: { + entities: { + type: 'array', + description: 'Matching monitored entities', + items: { type: 'object', properties: entityProperties }, + }, + totalCount: totalCountOutput, + pageSize: pageSizeOutput, + nextPageKey: nextPageKeyOutput, + }, +} diff --git a/apps/sim/tools/dynatrace/list_entity_types.ts b/apps/sim/tools/dynatrace/list_entity_types.ts new file mode 100644 index 00000000000..011a4d5a3ef --- /dev/null +++ b/apps/sim/tools/dynatrace/list_entity_types.ts @@ -0,0 +1,146 @@ +import { nextPageKeyOutput, pageSizeOutput, totalCountOutput } from '@/tools/dynatrace/outputs' +import type { + DynatraceListEntityTypesParams, + DynatraceListEntityTypesResponse, +} from '@/tools/dynatrace/types' +import { + buildDynatraceUrl, + dynatraceHeaders, + mapEntityType, + readJsonBody, +} from '@/tools/dynatrace/utils' +import type { ToolConfig } from '@/tools/types' + +export const listEntityTypesTool: ToolConfig< + DynatraceListEntityTypesParams, + DynatraceListEntityTypesResponse +> = { + id: 'dynatrace_list_entity_types', + name: 'Dynatrace List Entity Types', + description: + 'List the monitored entity types available in the environment, with the properties and relationships each supports. Use it to build valid entity selectors.', + version: '1.0.0', + + params: { + environmentUrl: { + type: 'string', + required: true, + visibility: 'user-only', + description: + 'Dynatrace environment URL (e.g., https://abc12345.live.dynatrace.com, or https://your-activegate:9999/e/abc12345 for Managed)', + }, + apiToken: { + type: 'string', + required: true, + visibility: 'user-only', + description: 'Dynatrace access token (dt0c01...) with the entities.read scope', + }, + pageSize: { + type: 'number', + required: false, + visibility: 'user-only', + description: 'Entity types per page (max 500, default 50)', + }, + nextPageKey: { + type: 'string', + required: false, + visibility: 'user-only', + description: 'Cursor for the next page. Page size is ignored when it is set', + }, + }, + + request: { + url: (params) => + buildDynatraceUrl( + params.environmentUrl, + '/entityTypes', + params.nextPageKey ? { nextPageKey: params.nextPageKey } : { pageSize: params.pageSize } + ), + method: 'GET', + headers: (params) => dynatraceHeaders(params.apiToken), + }, + + transformResponse: async (response: Response) => { + const data = await readJsonBody(response) + const types = Array.isArray(data.types) ? (data.types as Array>) : [] + + return { + success: true, + output: { + types: types.map(mapEntityType), + totalCount: (data.totalCount as number) ?? null, + pageSize: (data.pageSize as number) ?? null, + nextPageKey: (data.nextPageKey as string) ?? null, + }, + } + }, + + outputs: { + types: { + type: 'array', + description: 'Available entity types', + items: { + type: 'object', + properties: { + type: { type: 'string', description: 'Entity type (e.g., HOST, SERVICE)' }, + displayName: { type: 'string', description: 'Display name of the type', nullable: true }, + dimensionKey: { + type: 'string', + description: 'Metric dimension key of the type', + nullable: true, + }, + entityLimitExceeded: { + type: 'boolean', + description: 'Whether the environment exceeded the entity limit for this type', + nullable: true, + }, + properties: { + type: 'array', + description: 'Properties available on the type', + items: { + type: 'object', + properties: { + id: { type: 'string', description: 'Property ID' }, + displayName: { type: 'string', description: 'Property display name' }, + type: { type: 'string', description: 'Property value type' }, + }, + }, + }, + fromRelationships: { + type: 'array', + description: 'Relationships originating at this type', + items: { + type: 'object', + properties: { + id: { type: 'string', description: 'Relationship ID' }, + toTypes: { + type: 'array', + description: 'Entity types the relationship points to', + items: { type: 'string' }, + }, + }, + }, + }, + toRelationships: { + type: 'array', + description: 'Relationships pointing at this type', + items: { + type: 'object', + properties: { + id: { type: 'string', description: 'Relationship ID' }, + fromTypes: { + type: 'array', + description: 'Entity types the relationship originates from', + items: { type: 'string' }, + }, + }, + }, + }, + }, + }, + }, + totalCount: totalCountOutput, + pageSize: pageSizeOutput, + nextPageKey: nextPageKeyOutput, + }, +} diff --git a/apps/sim/tools/dynatrace/list_events.ts b/apps/sim/tools/dynatrace/list_events.ts new file mode 100644 index 00000000000..56c401c1310 --- /dev/null +++ b/apps/sim/tools/dynatrace/list_events.ts @@ -0,0 +1,126 @@ +import { + eventProperties, + nextPageKeyOutput, + pageSizeOutput, + totalCountOutput, + warningsOutput, +} from '@/tools/dynatrace/outputs' +import type { + DynatraceListEventsParams, + DynatraceListEventsResponse, +} from '@/tools/dynatrace/types' +import { + buildDynatraceUrl, + dynatraceHeaders, + mapEvent, + mapWarnings, + readJsonBody, +} from '@/tools/dynatrace/utils' +import type { ToolConfig } from '@/tools/types' + +export const listEventsTool: ToolConfig = { + id: 'dynatrace_list_events', + name: 'Dynatrace List Events', + description: + 'List events — deployments, availability changes, alerts, custom annotations — in a Dynatrace environment.', + version: '1.0.0', + + params: { + environmentUrl: { + type: 'string', + required: true, + visibility: 'user-only', + description: + 'Dynatrace environment URL (e.g., https://abc12345.live.dynatrace.com, or https://your-activegate:9999/e/abc12345 for Managed)', + }, + apiToken: { + type: 'string', + required: true, + visibility: 'user-only', + description: 'Dynatrace access token (dt0c01...) with the events.read scope', + }, + from: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: + 'Start of the timeframe as UTC milliseconds, ISO 8601, or a relative expression such as now-1d. Defaults to now-2h', + }, + to: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: 'End of the timeframe in the same formats as From. Defaults to now', + }, + eventSelector: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: + 'Event selector, e.g. eventType("CUSTOM_DEPLOYMENT"),status("OPEN"),correlationId("build-42")', + }, + entitySelector: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: 'Entity selector scoping the result, e.g. type("SERVICE"),tag("env:prod")', + }, + pageSize: { + type: 'number', + required: false, + visibility: 'user-only', + description: 'Events per page (max 1000, default 100)', + }, + nextPageKey: { + type: 'string', + required: false, + visibility: 'user-only', + description: 'Cursor for the next page. All other filters are ignored when it is set', + }, + }, + + request: { + url: (params) => + params.nextPageKey + ? buildDynatraceUrl(params.environmentUrl, '/events', { + nextPageKey: params.nextPageKey, + }) + : buildDynatraceUrl(params.environmentUrl, '/events', { + from: params.from, + to: params.to, + eventSelector: params.eventSelector, + entitySelector: params.entitySelector, + pageSize: params.pageSize, + }), + method: 'GET', + headers: (params) => dynatraceHeaders(params.apiToken), + }, + + transformResponse: async (response: Response) => { + const data = await readJsonBody(response) + const events = Array.isArray(data.events) ? (data.events as Array>) : [] + + return { + success: true, + output: { + events: events.map(mapEvent), + totalCount: (data.totalCount as number) ?? null, + pageSize: (data.pageSize as number) ?? null, + nextPageKey: (data.nextPageKey as string) ?? null, + warnings: mapWarnings(data.warnings), + }, + } + }, + + outputs: { + events: { + type: 'array', + description: 'Matching events', + items: { type: 'object', properties: eventProperties }, + }, + totalCount: totalCountOutput, + pageSize: pageSizeOutput, + nextPageKey: nextPageKeyOutput, + warnings: warningsOutput, + }, +} diff --git a/apps/sim/tools/dynatrace/list_metrics.ts b/apps/sim/tools/dynatrace/list_metrics.ts new file mode 100644 index 00000000000..c37827eef66 --- /dev/null +++ b/apps/sim/tools/dynatrace/list_metrics.ts @@ -0,0 +1,141 @@ +import { + metricDescriptorProperties, + nextPageKeyOutput, + totalCountOutput, + warningsOutput, +} from '@/tools/dynatrace/outputs' +import type { + DynatraceListMetricsParams, + DynatraceListMetricsResponse, +} from '@/tools/dynatrace/types' +import { + buildDynatraceUrl, + dynatraceHeaders, + mapMetricDescriptor, + mapWarnings, + readJsonBody, +} from '@/tools/dynatrace/utils' +import type { ToolConfig } from '@/tools/types' + +export const listMetricsTool: ToolConfig = + { + id: 'dynatrace_list_metrics', + name: 'Dynatrace List Metrics', + description: + 'Discover the metrics available in a Dynatrace environment, filtered by metric selector, free text, or metadata.', + version: '1.0.0', + + params: { + environmentUrl: { + type: 'string', + required: true, + visibility: 'user-only', + description: + 'Dynatrace environment URL (e.g., https://abc12345.live.dynatrace.com, or https://your-activegate:9999/e/abc12345 for Managed)', + }, + apiToken: { + type: 'string', + required: true, + visibility: 'user-only', + description: 'Dynatrace access token (dt0c01...) with the metrics.read scope', + }, + metricSelector: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: 'Metric selector, supporting wildcards (e.g. builtin:host.cpu.*)', + }, + text: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: 'Free-text search across metric display names and descriptions', + }, + fields: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: + 'Comma-separated descriptor properties to include. metricId is always returned (e.g. +displayName,+unit,+aggregationTypes)', + }, + writtenSince: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: + 'Only metrics written since this point, as UTC milliseconds, ISO 8601, or a relative expression such as now-7d', + }, + writtenSinceMode: { + type: 'string', + required: false, + visibility: 'user-only', + description: + 'INCLUDE (default) keeps metrics written since Written Since; EXCLUDE keeps the ones not written since then', + }, + metadataSelector: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: 'Metadata selector, e.g. unit("Percent"),tags("dashboard")', + }, + pageSize: { + type: 'number', + required: false, + visibility: 'user-only', + description: 'Metrics per page (max 500, default 100)', + }, + nextPageKey: { + type: 'string', + required: false, + visibility: 'user-only', + description: 'Cursor for the next page. All other filters are ignored when it is set', + }, + }, + + request: { + url: (params) => + params.nextPageKey + ? buildDynatraceUrl(params.environmentUrl, '/metrics', { + nextPageKey: params.nextPageKey, + }) + : buildDynatraceUrl(params.environmentUrl, '/metrics', { + metricSelector: params.metricSelector, + text: params.text, + fields: params.fields, + writtenSince: params.writtenSince, + writtenSinceMode: params.writtenSinceMode, + metadataSelector: params.metadataSelector, + pageSize: params.pageSize, + }), + method: 'GET', + headers: (params) => dynatraceHeaders(params.apiToken), + }, + + transformResponse: async (response: Response) => { + const data = await readJsonBody(response) + const metrics = Array.isArray(data.metrics) + ? (data.metrics as Array>) + : [] + + return { + success: true, + output: { + metrics: metrics.map(mapMetricDescriptor), + totalCount: (data.totalCount as number) ?? null, + nextPageKey: (data.nextPageKey as string) ?? null, + warnings: mapWarnings(data.warnings), + }, + } + }, + + outputs: { + metrics: { + type: 'array', + description: 'Matching metric descriptors', + items: { type: 'object', properties: metricDescriptorProperties }, + }, + totalCount: totalCountOutput, + nextPageKey: nextPageKeyOutput, + warnings: warningsOutput, + }, + } diff --git a/apps/sim/tools/dynatrace/list_problem_comments.ts b/apps/sim/tools/dynatrace/list_problem_comments.ts new file mode 100644 index 00000000000..5f9466a68d5 --- /dev/null +++ b/apps/sim/tools/dynatrace/list_problem_comments.ts @@ -0,0 +1,103 @@ +import { + commentProperties, + nextPageKeyOutput, + pageSizeOutput, + totalCountOutput, +} from '@/tools/dynatrace/outputs' +import type { + DynatraceComment, + DynatraceListProblemCommentsParams, + DynatraceListProblemCommentsResponse, +} from '@/tools/dynatrace/types' +import { + buildDynatraceUrl, + dynatraceHeaders, + mapComment, + readJsonBody, +} from '@/tools/dynatrace/utils' +import type { ToolConfig } from '@/tools/types' + +export const listProblemCommentsTool: ToolConfig< + DynatraceListProblemCommentsParams, + DynatraceListProblemCommentsResponse +> = { + id: 'dynatrace_list_problem_comments', + name: 'Dynatrace List Problem Comments', + description: 'List the comments recorded on a Dynatrace problem.', + version: '1.0.0', + + params: { + environmentUrl: { + type: 'string', + required: true, + visibility: 'user-only', + description: + 'Dynatrace environment URL (e.g., https://abc12345.live.dynatrace.com, or https://your-activegate:9999/e/abc12345 for Managed)', + }, + apiToken: { + type: 'string', + required: true, + visibility: 'user-only', + description: 'Dynatrace access token (dt0c01...) with the problems.read scope', + }, + problemId: { + type: 'string', + required: true, + visibility: 'user-or-llm', + description: 'ID of the problem whose comments should be listed', + }, + pageSize: { + type: 'number', + required: false, + visibility: 'user-only', + description: 'Comments per page (max 500, default 10)', + }, + nextPageKey: { + type: 'string', + required: false, + visibility: 'user-only', + description: 'Cursor for the next page. Page size is ignored when it is set', + }, + }, + + request: { + url: (params) => + buildDynatraceUrl( + params.environmentUrl, + `/problems/${encodeURIComponent(params.problemId)}/comments`, + params.nextPageKey ? { nextPageKey: params.nextPageKey } : { pageSize: params.pageSize } + ), + method: 'GET', + headers: (params) => dynatraceHeaders(params.apiToken), + }, + + transformResponse: async (response: Response) => { + const data = await readJsonBody(response) + const comments = Array.isArray(data.comments) + ? (data.comments as Array>) + : [] + + return { + success: true, + output: { + comments: comments + .map(mapComment) + .filter((comment): comment is DynatraceComment => comment !== null), + totalCount: (data.totalCount as number) ?? null, + pageSize: (data.pageSize as number) ?? null, + nextPageKey: (data.nextPageKey as string) ?? null, + }, + } + }, + + outputs: { + comments: { + type: 'array', + description: 'Comments on the problem', + items: { type: 'object', properties: commentProperties }, + }, + totalCount: totalCountOutput, + pageSize: pageSizeOutput, + nextPageKey: nextPageKeyOutput, + }, +} diff --git a/apps/sim/tools/dynatrace/list_problems.ts b/apps/sim/tools/dynatrace/list_problems.ts new file mode 100644 index 00000000000..988340d60e1 --- /dev/null +++ b/apps/sim/tools/dynatrace/list_problems.ts @@ -0,0 +1,147 @@ +import { + nextPageKeyOutput, + pageSizeOutput, + problemProperties, + totalCountOutput, + warningsOutput, +} from '@/tools/dynatrace/outputs' +import type { + DynatraceListProblemsParams, + DynatraceListProblemsResponse, +} from '@/tools/dynatrace/types' +import { + buildDynatraceUrl, + dynatraceHeaders, + mapProblem, + mapWarnings, + readJsonBody, +} from '@/tools/dynatrace/utils' +import type { ToolConfig } from '@/tools/types' + +export const listProblemsTool: ToolConfig< + DynatraceListProblemsParams, + DynatraceListProblemsResponse +> = { + id: 'dynatrace_list_problems', + name: 'Dynatrace List Problems', + description: + 'List Davis-detected problems in a Dynatrace environment, filtered by timeframe, problem selector, or entity selector.', + version: '1.0.0', + + params: { + environmentUrl: { + type: 'string', + required: true, + visibility: 'user-only', + description: + 'Dynatrace environment URL (e.g., https://abc12345.live.dynatrace.com, or https://your-activegate:9999/e/abc12345 for Managed)', + }, + apiToken: { + type: 'string', + required: true, + visibility: 'user-only', + description: 'Dynatrace access token (dt0c01...) with the problems.read scope', + }, + from: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: + 'Start of the timeframe as UTC milliseconds, ISO 8601, or a relative expression such as now-1d. Defaults to now-2h', + }, + to: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: 'End of the timeframe in the same formats as From. Defaults to now', + }, + problemSelector: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: + 'Problem selector, e.g. status("open"),severityLevel("AVAILABILITY"),impactLevel("SERVICES")', + }, + entitySelector: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: 'Entity selector scoping the result, e.g. type("HOST"),tag("env:prod")', + }, + sort: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: + 'Sort order: status, startTime, or relevance, each optionally prefixed with + or - (e.g. -startTime)', + }, + fields: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: + 'Comma-separated optional properties to include: evidenceDetails, impactAnalysis, recentComments', + }, + pageSize: { + type: 'number', + required: false, + visibility: 'user-only', + description: 'Problems per page (max 500, default 50)', + }, + nextPageKey: { + type: 'string', + required: false, + visibility: 'user-only', + description: 'Cursor for the next page. All other filters are ignored when it is set', + }, + }, + + request: { + url: (params) => + params.nextPageKey + ? buildDynatraceUrl(params.environmentUrl, '/problems', { + nextPageKey: params.nextPageKey, + }) + : buildDynatraceUrl(params.environmentUrl, '/problems', { + from: params.from, + to: params.to, + problemSelector: params.problemSelector, + entitySelector: params.entitySelector, + sort: params.sort, + fields: params.fields, + pageSize: params.pageSize, + }), + method: 'GET', + headers: (params) => dynatraceHeaders(params.apiToken), + }, + + transformResponse: async (response: Response) => { + const data = await readJsonBody(response) + const problems = Array.isArray(data.problems) + ? (data.problems as Array>) + : [] + + return { + success: true, + output: { + problems: problems.map(mapProblem), + totalCount: (data.totalCount as number) ?? null, + pageSize: (data.pageSize as number) ?? null, + nextPageKey: (data.nextPageKey as string) ?? null, + warnings: mapWarnings(data.warnings), + }, + } + }, + + outputs: { + problems: { + type: 'array', + description: 'Matching problems', + items: { type: 'object', properties: problemProperties }, + }, + totalCount: totalCountOutput, + pageSize: pageSizeOutput, + nextPageKey: nextPageKeyOutput, + warnings: warningsOutput, + }, +} diff --git a/apps/sim/tools/dynatrace/list_security_problems.ts b/apps/sim/tools/dynatrace/list_security_problems.ts new file mode 100644 index 00000000000..d8582d5926a --- /dev/null +++ b/apps/sim/tools/dynatrace/list_security_problems.ts @@ -0,0 +1,135 @@ +import { + nextPageKeyOutput, + pageSizeOutput, + securityProblemProperties, + totalCountOutput, +} from '@/tools/dynatrace/outputs' +import type { + DynatraceListSecurityProblemsParams, + DynatraceListSecurityProblemsResponse, +} from '@/tools/dynatrace/types' +import { + buildDynatraceUrl, + dynatraceHeaders, + mapSecurityProblem, + readJsonBody, +} from '@/tools/dynatrace/utils' +import type { ToolConfig } from '@/tools/types' + +export const listSecurityProblemsTool: ToolConfig< + DynatraceListSecurityProblemsParams, + DynatraceListSecurityProblemsResponse +> = { + id: 'dynatrace_list_security_problems', + name: 'Dynatrace List Security Problems', + description: + 'List vulnerabilities detected by Dynatrace Application Security, filtered by risk level, status, CVE, or technology.', + version: '1.0.0', + + params: { + environmentUrl: { + type: 'string', + required: true, + visibility: 'user-only', + description: + 'Dynatrace environment URL (e.g., https://abc12345.live.dynatrace.com, or https://your-activegate:9999/e/abc12345 for Managed)', + }, + apiToken: { + type: 'string', + required: true, + visibility: 'user-only', + description: 'Dynatrace access token (dt0c01...) with the securityProblems.read scope', + }, + securityProblemSelector: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: + 'Security problem selector, e.g. status("OPEN"),riskLevel("CRITICAL"),technology("JAVA")', + }, + from: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: + 'Start of the timeframe as UTC milliseconds, ISO 8601, or a relative expression such as now-7d. Defaults to now-30d', + }, + to: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: 'End of the timeframe in the same formats as From. Defaults to now', + }, + fields: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: + 'Comma-separated optional properties to include: +riskAssessment, +managementZones, +codeLevelVulnerabilityDetails, +globalCounts', + }, + sort: { + type: 'string', + required: false, + visibility: 'user-only', + description: 'Sort by a field with a + or - prefix, e.g. -riskAssessment.riskScore', + }, + pageSize: { + type: 'number', + required: false, + visibility: 'user-only', + description: 'Security problems per page (max 500, default 100)', + }, + nextPageKey: { + type: 'string', + required: false, + visibility: 'user-only', + description: 'Cursor for the next page. All other filters are ignored when it is set', + }, + }, + + request: { + url: (params) => + params.nextPageKey + ? buildDynatraceUrl(params.environmentUrl, '/securityProblems', { + nextPageKey: params.nextPageKey, + }) + : buildDynatraceUrl(params.environmentUrl, '/securityProblems', { + securityProblemSelector: params.securityProblemSelector, + from: params.from, + to: params.to, + fields: params.fields, + sort: params.sort, + pageSize: params.pageSize, + }), + method: 'GET', + headers: (params) => dynatraceHeaders(params.apiToken), + }, + + transformResponse: async (response: Response) => { + const data = await readJsonBody(response) + const securityProblems = Array.isArray(data.securityProblems) + ? (data.securityProblems as Array>) + : [] + + return { + success: true, + output: { + securityProblems: securityProblems.map(mapSecurityProblem), + totalCount: (data.totalCount as number) ?? null, + pageSize: (data.pageSize as number) ?? null, + nextPageKey: (data.nextPageKey as string) ?? null, + }, + } + }, + + outputs: { + securityProblems: { + type: 'array', + description: 'Matching security problems', + items: { type: 'object', properties: securityProblemProperties }, + }, + totalCount: totalCountOutput, + pageSize: pageSizeOutput, + nextPageKey: nextPageKeyOutput, + }, +} diff --git a/apps/sim/tools/dynatrace/list_slos.ts b/apps/sim/tools/dynatrace/list_slos.ts new file mode 100644 index 00000000000..438846ff8f9 --- /dev/null +++ b/apps/sim/tools/dynatrace/list_slos.ts @@ -0,0 +1,141 @@ +import { + nextPageKeyOutput, + pageSizeOutput, + sloProperties, + totalCountOutput, +} from '@/tools/dynatrace/outputs' +import type { DynatraceListSlosParams, DynatraceListSlosResponse } from '@/tools/dynatrace/types' +import { buildDynatraceUrl, dynatraceHeaders, mapSlo, readJsonBody } from '@/tools/dynatrace/utils' +import type { ToolConfig } from '@/tools/types' + +export const listSlosTool: ToolConfig = { + id: 'dynatrace_list_slos', + name: 'Dynatrace List SLOs', + description: + 'List service-level objectives with their current attainment, error budget, and burn rate.', + version: '1.0.0', + + params: { + environmentUrl: { + type: 'string', + required: true, + visibility: 'user-only', + description: + 'Dynatrace environment URL (e.g., https://abc12345.live.dynatrace.com, or https://your-activegate:9999/e/abc12345 for Managed)', + }, + apiToken: { + type: 'string', + required: true, + visibility: 'user-only', + description: 'Dynatrace access token (dt0c01...) with the slo.read scope', + }, + sloSelector: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: + 'SLO selector, e.g. healthState("WARNING"),text("checkout"),problems("true"). Combine criteria with commas', + }, + from: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: + 'Start of the evaluation timeframe as UTC milliseconds, ISO 8601, or a relative expression such as now-7d', + }, + to: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: 'End of the evaluation timeframe in the same formats as From. Defaults to now', + }, + timeFrame: { + type: 'string', + required: false, + visibility: 'user-only', + description: + 'CURRENT evaluates each SLO over its own timeframe; GTF evaluates over the From/To range', + }, + sort: { + type: 'string', + required: false, + visibility: 'user-only', + description: 'Sort by name: name ascending or -name descending', + }, + enabledSlos: { + type: 'string', + required: false, + visibility: 'user-only', + description: 'Filter by enabled state: true, false, or all', + }, + evaluate: { + type: 'boolean', + required: false, + visibility: 'user-only', + description: 'Evaluate each SLO and include its calculated values', + }, + showGlobalSlos: { + type: 'boolean', + required: false, + visibility: 'user-only', + description: 'Include SLOs that are not scoped to a management zone', + }, + pageSize: { + type: 'number', + required: false, + visibility: 'user-only', + description: 'SLOs per page (max 10000, default 10)', + }, + nextPageKey: { + type: 'string', + required: false, + visibility: 'user-only', + description: 'Cursor for the next page. All other filters are ignored when it is set', + }, + }, + + request: { + url: (params) => + params.nextPageKey + ? buildDynatraceUrl(params.environmentUrl, '/slo', { nextPageKey: params.nextPageKey }) + : buildDynatraceUrl(params.environmentUrl, '/slo', { + sloSelector: params.sloSelector, + from: params.from, + to: params.to, + timeFrame: params.timeFrame, + sort: params.sort, + enabledSlos: params.enabledSlos, + evaluate: params.evaluate, + showGlobalSlos: params.showGlobalSlos, + pageSize: params.pageSize, + }), + method: 'GET', + headers: (params) => dynatraceHeaders(params.apiToken), + }, + + transformResponse: async (response: Response) => { + const data = await readJsonBody(response) + const slos = Array.isArray(data.slo) ? (data.slo as Array>) : [] + + return { + success: true, + output: { + slos: slos.map(mapSlo), + totalCount: (data.totalCount as number) ?? null, + pageSize: (data.pageSize as number) ?? null, + nextPageKey: (data.nextPageKey as string) ?? null, + }, + } + }, + + outputs: { + slos: { + type: 'array', + description: 'Matching service-level objectives', + items: { type: 'object', properties: sloProperties }, + }, + totalCount: totalCountOutput, + pageSize: pageSizeOutput, + nextPageKey: nextPageKeyOutput, + }, +} diff --git a/apps/sim/tools/dynatrace/outputs.ts b/apps/sim/tools/dynatrace/outputs.ts new file mode 100644 index 00000000000..9516653e35a --- /dev/null +++ b/apps/sim/tools/dynatrace/outputs.ts @@ -0,0 +1,379 @@ +import type { OutputProperty } from '@/tools/types' + +/** Flattened `EntityStub` shape produced by `mapEntityStub`. */ +export const entityStubProperties: Record = { + id: { type: 'string', description: 'Entity ID', nullable: true }, + type: { type: 'string', description: 'Entity type', nullable: true }, + name: { type: 'string', description: 'Entity display name', nullable: true }, +} + +/** `METag` shape. */ +export const tagProperties: Record = { + context: { type: 'string', description: 'Tag origin (e.g., AWS, KUBERNETES, CONTEXTLESS)' }, + key: { type: 'string', description: 'Tag key' }, + value: { type: 'string', description: 'Tag value', nullable: true }, + stringRepresentation: { type: 'string', description: 'Tag rendered as a string' }, +} + +/** Short management zone shape. */ +export const managementZoneProperties: Record = { + id: { type: 'string', description: 'Management zone ID' }, + name: { type: 'string', description: 'Management zone name' }, +} + +/** Problem comment shape. */ +export const commentProperties: Record = { + id: { type: 'string', description: 'Comment ID' }, + authorName: { type: 'string', description: 'Name of the comment author' }, + content: { type: 'string', description: 'Comment text' }, + context: { type: 'string', description: 'Context of the comment', nullable: true }, + createdAtTimestamp: { + type: 'number', + description: 'Creation timestamp in UTC milliseconds', + }, +} + +/** Problem shape produced by `mapProblem`. */ +export const problemProperties: Record = { + problemId: { type: 'string', description: 'Problem ID' }, + displayId: { type: 'string', description: 'Human-readable problem ID (e.g., P-2401234)' }, + title: { type: 'string', description: 'Problem title' }, + status: { type: 'string', description: 'Problem status: OPEN or CLOSED' }, + severityLevel: { + type: 'string', + description: + 'AVAILABILITY, CUSTOM_ALERT, ERROR, INFO, MONITORING_UNAVAILABLE, PERFORMANCE, or RESOURCE_CONTENTION', + }, + impactLevel: { + type: 'string', + description: 'APPLICATION, ENVIRONMENT, INFRASTRUCTURE, or SERVICES', + }, + startTime: { type: 'number', description: 'Problem start in UTC milliseconds' }, + endTime: { + type: 'number', + description: 'Problem end in UTC milliseconds, or -1 while the problem is open', + }, + rootCauseEntity: { + type: 'object', + description: 'Entity Dynatrace determined to be the root cause', + nullable: true, + properties: entityStubProperties, + }, + affectedEntities: { + type: 'array', + description: 'Entities affected by the problem', + items: { type: 'object', properties: entityStubProperties }, + }, + impactedEntities: { + type: 'array', + description: 'Entities impacted by the problem', + items: { type: 'object', properties: entityStubProperties }, + }, + managementZones: { + type: 'array', + description: 'Management zones the problem belongs to', + items: { type: 'object', properties: managementZoneProperties }, + }, + entityTags: { + type: 'array', + description: 'Tags of the affected entities', + items: { type: 'object', properties: tagProperties }, + }, + problemFilters: { + type: 'array', + description: 'Alerting profiles that matched the problem', + items: { + type: 'object', + properties: { + id: { type: 'string', description: 'Alerting profile ID' }, + name: { type: 'string', description: 'Alerting profile name' }, + }, + }, + }, + linkedProblemInfo: { + type: 'object', + description: 'The problem this one is linked to', + nullable: true, + properties: { + problemId: { type: 'string', description: 'Linked problem ID' }, + displayId: { type: 'string', description: 'Linked problem display ID' }, + }, + }, + evidenceDetails: { + type: 'json', + description: 'Evidence behind the problem. Only present when requested via Fields', + nullable: true, + }, + impactAnalysis: { + type: 'json', + description: 'Estimated user impact. Only present when requested via Fields', + nullable: true, + }, + recentComments: { + type: 'json', + description: 'Most recent comments. Only present when requested via Fields', + nullable: true, + }, +} + +/** Monitored entity shape produced by `mapEntity`. */ +export const entityProperties: Record = { + entityId: { type: 'string', description: 'Entity ID (e.g., HOST-06F288EE2A930951)' }, + type: { type: 'string', description: 'Entity type (e.g., HOST, SERVICE)' }, + displayName: { type: 'string', description: 'Entity display name' }, + firstSeenTms: { type: 'number', description: 'First seen timestamp in UTC milliseconds' }, + lastSeenTms: { type: 'number', description: 'Last seen timestamp in UTC milliseconds' }, + properties: { type: 'json', description: 'Type-specific entity properties' }, + tags: { + type: 'array', + description: 'Tags of the entity', + items: { type: 'object', properties: tagProperties }, + }, + managementZones: { + type: 'array', + description: 'Management zones of the entity', + items: { type: 'object', properties: managementZoneProperties }, + }, + icon: { type: 'json', description: 'Icon of the entity', nullable: true }, + fromRelationships: { type: 'json', description: 'Relationships originating at this entity' }, + toRelationships: { type: 'json', description: 'Relationships pointing at this entity' }, +} + +/** Event shape produced by `mapEvent`. */ +export const eventProperties: Record = { + eventId: { type: 'string', description: 'Event ID' }, + eventType: { type: 'string', description: 'Event type' }, + title: { type: 'string', description: 'Event title' }, + startTime: { type: 'number', description: 'Event start in UTC milliseconds' }, + endTime: { type: 'number', description: 'Event end in UTC milliseconds', nullable: true }, + status: { type: 'string', description: 'Event status: OPEN or CLOSED' }, + correlationId: { type: 'string', description: 'Correlation ID of the event', nullable: true }, + frequentEvent: { type: 'boolean', description: 'Whether the event is a frequent event' }, + underMaintenance: { + type: 'boolean', + description: 'Whether the event occurred during a maintenance window', + }, + suppressAlert: { type: 'boolean', description: 'Whether alerting is suppressed' }, + suppressProblem: { type: 'boolean', description: 'Whether problem creation is suppressed' }, + entityId: { + type: 'object', + description: 'Entity the event belongs to', + nullable: true, + properties: entityStubProperties, + }, + properties: { + type: 'array', + description: 'Event properties', + items: { + type: 'object', + properties: { + key: { type: 'string', description: 'Property key' }, + value: { type: 'string', description: 'Property value' }, + }, + }, + }, + managementZones: { + type: 'array', + description: 'Management zones of the event', + items: { type: 'object', properties: managementZoneProperties }, + }, + entityTags: { + type: 'array', + description: 'Tags of the related entity', + items: { type: 'object', properties: tagProperties }, + }, +} + +/** Metric descriptor shape produced by `mapMetricDescriptor`. */ +export const metricDescriptorProperties: Record = { + metricId: { type: 'string', description: 'Metric key, including any transformations' }, + displayName: { type: 'string', description: 'Metric display name', nullable: true }, + description: { type: 'string', description: 'Metric description', nullable: true }, + unit: { type: 'string', description: 'Metric unit', nullable: true }, + unitDisplayFormat: { type: 'string', description: 'Preferred unit format', nullable: true }, + tags: { type: 'array', description: 'Metric tags', items: { type: 'string' } }, + billable: { type: 'boolean', description: 'Whether the metric is billable', nullable: true }, + dduBillable: { type: 'boolean', description: 'Whether the metric consumes DDUs', nullable: true }, + created: { type: 'number', description: 'Creation timestamp in UTC ms', nullable: true }, + lastWritten: { type: 'number', description: 'Last write timestamp in UTC ms', nullable: true }, + aggregationTypes: { + type: 'array', + description: 'Supported aggregations', + items: { type: 'string' }, + }, + defaultAggregation: { type: 'json', description: 'Default aggregation', nullable: true }, + dimensionDefinitions: { type: 'json', description: 'Dimension definitions of the metric' }, + dimensionCardinalities: { type: 'json', description: 'Estimated dimension cardinalities' }, + transformations: { + type: 'array', + description: 'Supported transformations', + items: { type: 'string' }, + }, + entityType: { + type: 'array', + description: 'Entity types the metric can be split by', + items: { type: 'string' }, + }, + minimumValue: { type: 'number', description: 'Smallest allowed value', nullable: true }, + maximumValue: { type: 'number', description: 'Largest allowed value', nullable: true }, + rootCauseRelevant: { type: 'boolean', description: 'Root-cause relevant', nullable: true }, + impactRelevant: { type: 'boolean', description: 'Impact relevant', nullable: true }, + metricValueType: { type: 'json', description: 'Value type of the metric', nullable: true }, + latency: { type: 'number', description: 'Expected write latency in minutes', nullable: true }, + metricSelector: { + type: 'string', + description: 'Selector the descriptor was resolved from', + nullable: true, + }, + scalar: { type: 'boolean', description: 'Whether the result is a single value', nullable: true }, + resolutionInfSupported: { + type: 'boolean', + description: 'Whether resolution=Inf is supported', + nullable: true, + }, + warnings: { type: 'array', description: 'Warnings for this metric', items: { type: 'string' } }, +} + +/** SLO shape produced by `mapSlo`. */ +export const sloProperties: Record = { + id: { type: 'string', description: 'SLO ID' }, + name: { type: 'string', description: 'SLO name' }, + description: { type: 'string', description: 'SLO description', nullable: true }, + enabled: { type: 'boolean', description: 'Whether the SLO is enabled' }, + target: { type: 'number', description: 'Target success rate' }, + warning: { type: 'number', description: 'Warning threshold' }, + timeframe: { type: 'string', description: 'Evaluation timeframe of the SLO' }, + filter: { type: 'string', description: 'Entity filter of the SLO', nullable: true }, + evaluationType: { type: 'string', description: 'Evaluation type of the SLO' }, + evaluatedPercentage: { type: 'number', description: 'Calculated SLO value', nullable: true }, + status: { type: 'string', description: 'SLO status: SUCCESS, WARNING, or FAILURE' }, + error: { type: 'string', description: 'Error that prevented evaluation', nullable: true }, + errorBudget: { type: 'number', description: 'Remaining error budget', nullable: true }, + errorBudgetBurnRate: { type: 'json', description: 'Error budget burn rate', nullable: true }, + metricKey: { type: 'string', description: 'Metric key of the SLO', nullable: true }, + metricName: { type: 'string', description: 'Metric name of the SLO', nullable: true }, + metricExpression: { type: 'string', description: 'Metric expression', nullable: true }, + relatedOpenProblems: { type: 'number', description: 'Open related problems', nullable: true }, + relatedTotalProblems: { type: 'number', description: 'Total related problems', nullable: true }, +} + +/** Security problem shape produced by `mapSecurityProblem`. */ +export const securityProblemProperties: Record = { + securityProblemId: { type: 'string', description: 'Security problem ID' }, + displayId: { type: 'string', description: 'Human-readable security problem ID' }, + status: { type: 'string', description: 'Status: OPEN or RESOLVED' }, + muted: { type: 'boolean', description: 'Whether the security problem is muted' }, + title: { type: 'string', description: 'Security problem title' }, + technology: { + type: 'string', + description: 'DOTNET, GO, JAVA, KUBERNETES, NODE_JS, PHP, or PYTHON', + }, + vulnerabilityType: { type: 'string', description: 'CODE_LEVEL, RUNTIME, or THIRD_PARTY' }, + packageName: { type: 'string', description: 'Affected package name', nullable: true }, + externalVulnerabilityId: { + type: 'string', + description: 'External vulnerability ID', + nullable: true, + }, + cveIds: { type: 'array', description: 'Related CVE IDs', items: { type: 'string' } }, + url: { type: 'string', description: 'Link to the security problem in Dynatrace', nullable: true }, + firstSeenTimestamp: { type: 'number', description: 'First seen in UTC milliseconds' }, + lastUpdatedTimestamp: { type: 'number', description: 'Last update in UTC milliseconds' }, + lastOpenedTimestamp: { + type: 'number', + description: 'Last opened in UTC milliseconds', + nullable: true, + }, + lastResolvedTimestamp: { + type: 'number', + description: 'Last resolved in UTC milliseconds', + nullable: true, + }, + riskAssessment: { + type: 'json', + description: 'Davis risk assessment. Only present when requested via Fields', + nullable: true, + }, + managementZones: { + type: 'array', + description: 'Management zones. Only present when requested via Fields', + items: { type: 'object', properties: managementZoneProperties }, + }, + globalCounts: { + type: 'json', + description: 'Global affected-entity counts. Only present when requested via Fields', + nullable: true, + }, + codeLevelVulnerabilityDetails: { + type: 'json', + description: 'Code-level vulnerability details. Only present when requested via Fields', + nullable: true, + }, +} + +/** Additional fields the single security problem endpoint returns. */ +export const securityProblemDetailsProperties: Record = { + ...securityProblemProperties, + description: { type: 'string', description: 'Vulnerability description', nullable: true }, + remediationDescription: { + type: 'string', + description: 'How to remediate the vulnerability', + nullable: true, + }, + muteStateChangeInProgress: { + type: 'boolean', + description: 'Whether a mute state change is in progress', + nullable: true, + }, + affectedEntities: { + type: 'array', + description: 'IDs of affected process group instances', + items: { type: 'string' }, + }, + exposedEntities: { + type: 'array', + description: 'IDs of publicly exposed entities', + items: { type: 'string' }, + }, + reachableDataAssets: { + type: 'array', + description: 'IDs of entities with reachable data assets', + items: { type: 'string' }, + }, + vulnerableComponents: { type: 'json', description: 'Vulnerable components' }, + filteredCounts: { + type: 'json', + description: 'Counts within the management zone filter', + nullable: true, + }, + events: { type: 'json', description: 'Lifecycle events of the security problem' }, + entryPoints: { type: 'json', description: 'Entry points into the vulnerability', nullable: true }, + relatedEntities: { type: 'json', description: 'Related entities', nullable: true }, + relatedAttacks: { type: 'json', description: 'Related attacks', nullable: true }, + relatedContainerImages: { type: 'json', description: 'Related container images', nullable: true }, +} + +/** Shared pagination outputs of the Environment API v2 list endpoints. */ +export const totalCountOutput: OutputProperty = { + type: 'number', + description: 'Total number of matching entries', + nullable: true, +} + +export const pageSizeOutput: OutputProperty = { + type: 'number', + description: 'Number of entries in this page', + nullable: true, +} + +export const nextPageKeyOutput: OutputProperty = { + type: 'string', + description: 'Cursor for the next page. Null on the last page', + nullable: true, +} + +export const warningsOutput: OutputProperty = { + type: 'array', + description: 'Warnings returned alongside the result', + items: { type: 'string' }, +} diff --git a/apps/sim/tools/dynatrace/query_metrics.ts b/apps/sim/tools/dynatrace/query_metrics.ts new file mode 100644 index 00000000000..788cbc17f32 --- /dev/null +++ b/apps/sim/tools/dynatrace/query_metrics.ts @@ -0,0 +1,183 @@ +import { nextPageKeyOutput, totalCountOutput, warningsOutput } from '@/tools/dynatrace/outputs' +import type { + DynatraceQueryMetricsParams, + DynatraceQueryMetricsResponse, +} from '@/tools/dynatrace/types' +import { + buildDynatraceUrl, + dynatraceHeaders, + mapMetricResult, + mapWarnings, + readJsonBody, +} from '@/tools/dynatrace/utils' +import type { ToolConfig } from '@/tools/types' + +export const queryMetricsTool: ToolConfig< + DynatraceQueryMetricsParams, + DynatraceQueryMetricsResponse +> = { + id: 'dynatrace_query_metrics', + name: 'Dynatrace Query Metrics', + description: + 'Read metric data points from Dynatrace using a metric selector, with optional entity and management-zone scoping.', + version: '1.0.0', + + params: { + environmentUrl: { + type: 'string', + required: true, + visibility: 'user-only', + description: + 'Dynatrace environment URL (e.g., https://abc12345.live.dynatrace.com, or https://your-activegate:9999/e/abc12345 for Managed)', + }, + apiToken: { + type: 'string', + required: true, + visibility: 'user-only', + description: 'Dynatrace access token (dt0c01...) with the metrics.read scope', + }, + metricSelector: { + type: 'string', + required: true, + visibility: 'user-or-llm', + description: + 'Metric selector, up to 10 metrics comma-separated, with optional transformations after a colon (e.g. builtin:host.cpu.usage:avg:names)', + }, + from: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: + 'Start of the timeframe as UTC milliseconds, ISO 8601, or a relative expression such as now-2h. Defaults to now-2h', + }, + to: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: 'End of the timeframe in the same formats as From. Defaults to now', + }, + resolution: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: + 'Number of data points (default 120), a timespan such as 10m or 3w, or Inf for a single aggregated value', + }, + entitySelector: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: 'Entity selector scoping the query, e.g. type("HOST"),tag("env:prod")', + }, + mzSelector: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: 'Management zone selector, e.g. mzName("Production")', + }, + }, + + request: { + url: (params) => + buildDynatraceUrl(params.environmentUrl, '/metrics/query', { + metricSelector: params.metricSelector, + from: params.from, + to: params.to, + resolution: params.resolution, + entitySelector: params.entitySelector, + mzSelector: params.mzSelector, + }), + method: 'GET', + headers: (params) => dynatraceHeaders(params.apiToken), + }, + + transformResponse: async (response: Response) => { + const data = await readJsonBody(response) + const result = Array.isArray(data.result) ? (data.result as Array>) : [] + + return { + success: true, + output: { + result: result.map(mapMetricResult), + resolution: (data.resolution as string) ?? null, + totalCount: (data.totalCount as number) ?? null, + nextPageKey: (data.nextPageKey as string) ?? null, + warnings: mapWarnings(data.warnings), + }, + } + }, + + outputs: { + result: { + type: 'array', + description: 'One entry per queried metric', + items: { + type: 'object', + properties: { + metricId: { type: 'string', description: 'Metric key including transformations' }, + dataPointCountRatio: { + type: 'number', + description: 'Queried data points relative to the query limit', + nullable: true, + }, + dimensionCountRatio: { + type: 'number', + description: 'Queried dimension tuples relative to the query limit', + nullable: true, + }, + appliedOptionalFilters: { + type: 'array', + description: 'Optional filters Dynatrace applied to the query', + items: { type: 'object' }, + }, + dql: { + type: 'json', + description: 'DQL translation of the query, when available', + nullable: true, + }, + warnings: { + type: 'array', + description: 'Warnings for this metric', + items: { type: 'string' }, + }, + data: { + type: 'array', + description: 'Series of the metric, one per dimension tuple', + items: { + type: 'object', + properties: { + dimensions: { + type: 'array', + description: 'Dimension values of the series', + items: { type: 'string' }, + }, + dimensionMap: { + type: 'json', + description: 'Dimension values keyed by dimension key', + }, + timestamps: { + type: 'array', + description: 'Timestamps in UTC milliseconds, one per value', + items: { type: 'number' }, + }, + values: { + type: 'array', + description: 'Metric values. Null where no data exists', + items: { type: 'number' }, + }, + }, + }, + }, + }, + }, + }, + resolution: { + type: 'string', + description: 'Resolution Dynatrace actually used', + nullable: true, + }, + totalCount: totalCountOutput, + nextPageKey: nextPageKeyOutput, + warnings: warningsOutput, + }, +} diff --git a/apps/sim/tools/dynatrace/search_logs.ts b/apps/sim/tools/dynatrace/search_logs.ts new file mode 100644 index 00000000000..1db01a4349b --- /dev/null +++ b/apps/sim/tools/dynatrace/search_logs.ts @@ -0,0 +1,146 @@ +import type { + DynatraceSearchLogsParams, + DynatraceSearchLogsResponse, +} from '@/tools/dynatrace/types' +import { + buildDynatraceUrl, + dynatraceHeaders, + mapLogRecord, + readJsonBody, +} from '@/tools/dynatrace/utils' +import type { ToolConfig } from '@/tools/types' + +export const searchLogsTool: ToolConfig = { + id: 'dynatrace_search_logs', + name: 'Dynatrace Search Logs', + description: + 'Search log records in Dynatrace by query and timeframe, for troubleshooting and incident analysis.', + version: '1.0.0', + + params: { + environmentUrl: { + type: 'string', + required: true, + visibility: 'user-only', + description: + 'Dynatrace environment URL (e.g., https://abc12345.live.dynatrace.com, or https://your-activegate:9999/e/abc12345 for Managed)', + }, + apiToken: { + type: 'string', + required: true, + visibility: 'user-only', + description: + 'Dynatrace access token (dt0c01...) with the logs.read scope, or storage:logs:read and storage:buckets:read on Grail', + }, + query: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: + 'Log search query, e.g. status="ERROR" AND dt.entity.host="HOST-06F288EE2A930951"', + }, + from: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: + 'Start of the timeframe as UTC milliseconds, ISO 8601, or a relative expression such as now-1h. Defaults to now-2w', + }, + to: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: 'End of the timeframe in the same formats as From. Defaults to now', + }, + sort: { + type: 'string', + required: false, + visibility: 'user-or-llm', + description: 'Sort by field with a + or - prefix, e.g. -timestamp for newest first', + }, + limit: { + type: 'number', + required: false, + visibility: 'user-or-llm', + description: 'Number of log records to return (max 1000, default 1000)', + }, + nextSliceKey: { + type: 'string', + required: false, + visibility: 'user-only', + description: 'Cursor for the next slice. All other filters are ignored when it is set', + }, + }, + + request: { + url: (params) => + params.nextSliceKey + ? buildDynatraceUrl(params.environmentUrl, '/logs/search', { + nextSliceKey: params.nextSliceKey, + }) + : buildDynatraceUrl(params.environmentUrl, '/logs/search', { + query: params.query, + from: params.from, + to: params.to, + sort: params.sort, + limit: params.limit, + }), + method: 'GET', + headers: (params) => dynatraceHeaders(params.apiToken), + }, + + transformResponse: async (response: Response) => { + const data = await readJsonBody(response) + const results = Array.isArray(data.results) + ? (data.results as Array>) + : [] + + return { + success: true, + output: { + results: results.map(mapLogRecord), + sliceSize: (data.sliceSize as number) ?? null, + nextSliceKey: (data.nextSliceKey as string) ?? null, + warnings: (data.warnings as string) ?? null, + }, + } + }, + + outputs: { + results: { + type: 'array', + description: 'Matching log records', + items: { + type: 'object', + properties: { + timestamp: { type: 'number', description: 'Log timestamp in UTC milliseconds' }, + status: { + type: 'string', + description: 'Log level: ERROR, WARN, INFO, NONE, or NOT_APPLICABLE', + }, + content: { type: 'string', description: 'Log message content' }, + eventType: { type: 'string', description: 'Event type of the record', nullable: true }, + additionalColumns: { + type: 'json', + description: 'Additional log attributes keyed by column name', + }, + }, + }, + }, + sliceSize: { + type: 'number', + description: 'Number of records in this slice', + nullable: true, + }, + nextSliceKey: { + type: 'string', + description: 'Cursor for the next slice. Null when the result is complete', + nullable: true, + }, + warnings: { + type: 'string', + description: 'Warning raised while searching', + nullable: true, + }, + }, +} diff --git a/apps/sim/tools/dynatrace/types.ts b/apps/sim/tools/dynatrace/types.ts new file mode 100644 index 00000000000..f8483980f1e --- /dev/null +++ b/apps/sim/tools/dynatrace/types.ts @@ -0,0 +1,626 @@ +import type { ToolResponse } from '@/tools/types' + +/** Credentials every Dynatrace Environment API v2 call needs. */ +export interface DynatraceBaseParams { + environmentUrl: string + apiToken: string +} + +/** Short representation of a monitored entity (`EntityStub`), flattened. */ +export interface DynatraceEntityStub { + id: string | null + type: string | null + name: string | null +} + +/** Tag of a monitored entity (`METag`). */ +export interface DynatraceTag { + context: string | null + key: string | null + value: string | null + stringRepresentation: string | null +} + +/** Short representation of a management zone. */ +export interface DynatraceManagementZone { + id: string | null + name: string | null +} + +/** Short representation of an alerting profile (`AlertingProfileStub`). */ +export interface DynatraceProblemFilter { + id: string | null + name: string | null +} + +/** A comment on a problem. */ +export interface DynatraceComment { + id: string | null + authorName: string | null + content: string | null + context: string | null + createdAtTimestamp: number | null +} + +/** A problem as returned by the Problems API v2. */ +export interface DynatraceProblem { + problemId: string | null + displayId: string | null + title: string | null + status: string | null + severityLevel: string | null + impactLevel: string | null + startTime: number | null + endTime: number | null + rootCauseEntity: DynatraceEntityStub | null + affectedEntities: DynatraceEntityStub[] + impactedEntities: DynatraceEntityStub[] + managementZones: DynatraceManagementZone[] + entityTags: DynatraceTag[] + problemFilters: DynatraceProblemFilter[] + linkedProblemInfo: { problemId: string | null; displayId: string | null } | null + evidenceDetails: Record | null + impactAnalysis: Record | null + recentComments: Record | null +} + +/** A monitored entity as returned by the Monitored entities API v2. */ +export interface DynatraceEntity { + entityId: string | null + type: string | null + displayName: string | null + firstSeenTms: number | null + lastSeenTms: number | null + properties: Record + tags: DynatraceTag[] + managementZones: DynatraceManagementZone[] + icon: Record | null + fromRelationships: Record + toRelationships: Record +} + +/** An entity type descriptor. */ +export interface DynatraceEntityType { + type: string | null + displayName: string | null + dimensionKey: string | null + entityLimitExceeded: boolean | null + properties: Array<{ id: string | null; displayName: string | null; type: string | null }> + fromRelationships: Array<{ id: string | null; toTypes: string[] }> + toRelationships: Array<{ id: string | null; fromTypes: string[] }> +} + +/** An event as returned by the Events API v2. */ +export interface DynatraceEvent { + eventId: string | null + eventType: string | null + title: string | null + startTime: number | null + endTime: number | null + status: string | null + correlationId: string | null + frequentEvent: boolean | null + underMaintenance: boolean | null + suppressAlert: boolean | null + suppressProblem: boolean | null + entityId: DynatraceEntityStub | null + properties: Array<{ key: string | null; value: string | null }> + managementZones: DynatraceManagementZone[] + entityTags: DynatraceTag[] +} + +/** One series of a metric query result. */ +export interface DynatraceMetricSeries { + dimensions: string[] + dimensionMap: Record + timestamps: number[] + values: Array +} + +/** One metric of a metric query result. */ +export interface DynatraceMetricResult { + metricId: string | null + dataPointCountRatio: number | null + dimensionCountRatio: number | null + appliedOptionalFilters: unknown[] + dql: Record | null + warnings: string[] + data: DynatraceMetricSeries[] +} + +/** A metric descriptor. */ +export interface DynatraceMetricDescriptor { + metricId: string | null + displayName: string | null + description: string | null + unit: string | null + unitDisplayFormat: string | null + tags: string[] + billable: boolean | null + dduBillable: boolean | null + created: number | null + lastWritten: number | null + aggregationTypes: string[] + defaultAggregation: Record | null + dimensionDefinitions: Array> + dimensionCardinalities: Array> + transformations: string[] + entityType: string[] + minimumValue: number | null + maximumValue: number | null + rootCauseRelevant: boolean | null + impactRelevant: boolean | null + metricValueType: Record | null + latency: number | null + metricSelector: string | null + scalar: boolean | null + resolutionInfSupported: boolean | null + warnings: string[] +} + +/** A service-level objective. */ +export interface DynatraceSlo { + id: string | null + name: string | null + description: string | null + enabled: boolean | null + target: number | null + warning: number | null + timeframe: string | null + filter: string | null + evaluationType: string | null + evaluatedPercentage: number | null + status: string | null + error: string | null + errorBudget: number | null + errorBudgetBurnRate: Record | null + metricKey: string | null + metricName: string | null + metricExpression: string | null + relatedOpenProblems: number | null + relatedTotalProblems: number | null +} + +/** A security problem (vulnerability). */ +export interface DynatraceSecurityProblem { + securityProblemId: string | null + displayId: string | null + status: string | null + muted: boolean | null + title: string | null + technology: string | null + vulnerabilityType: string | null + packageName: string | null + externalVulnerabilityId: string | null + cveIds: string[] + url: string | null + firstSeenTimestamp: number | null + lastUpdatedTimestamp: number | null + lastOpenedTimestamp: number | null + lastResolvedTimestamp: number | null + riskAssessment: Record | null + managementZones: DynatraceManagementZone[] + globalCounts: Record | null + codeLevelVulnerabilityDetails: Record | null +} + +/** A security problem with the detail-only fields the single-problem endpoint adds. */ +export interface DynatraceSecurityProblemDetails extends DynatraceSecurityProblem { + description: string | null + remediationDescription: string | null + muteStateChangeInProgress: boolean | null + affectedEntities: string[] + exposedEntities: string[] + reachableDataAssets: string[] + vulnerableComponents: Array> + filteredCounts: Record | null + events: Array> + entryPoints: Record | null + relatedEntities: Record | null + relatedAttacks: Record | null + relatedContainerImages: Record | null +} + +/** An audit log entry. */ +export interface DynatraceAuditLog { + logId: string | null + eventType: string | null + category: string | null + entityId: string | null + environmentId: string | null + user: string | null + userType: string | null + userOrigin: string | null + timestamp: number | null + success: boolean | null + message: string | null + patch: Record | null + settingsSchemaId: string | null + settingsScopeId: string | null + settingsKey: string | null + settingsObjectId: string | null + settingsObjectSummary: string | null + settingsScopeName: string | null +} + +/** A log record returned by the Log Monitoring API v2 search endpoint. */ +export interface DynatraceLogRecord { + timestamp: number | null + status: string | null + content: string | null + eventType: string | null + additionalColumns: Record +} + +export interface DynatraceListProblemsParams extends DynatraceBaseParams { + from?: string + to?: string + problemSelector?: string + entitySelector?: string + sort?: string + fields?: string + pageSize?: number + nextPageKey?: string +} + +export interface DynatraceListProblemsResponse extends ToolResponse { + output: { + problems: DynatraceProblem[] + totalCount: number | null + pageSize: number | null + nextPageKey: string | null + warnings: string[] + } +} + +export interface DynatraceGetProblemParams extends DynatraceBaseParams { + problemId: string + fields?: string +} + +export interface DynatraceGetProblemResponse extends ToolResponse { + output: { + problem: DynatraceProblem + } +} + +export interface DynatraceCloseProblemParams extends DynatraceBaseParams { + problemId: string + message: string +} + +export interface DynatraceCloseProblemResponse extends ToolResponse { + output: { + problemId: string | null + closeTimestamp: number | null + closing: boolean | null + comment: DynatraceComment | null + } +} + +export interface DynatraceListProblemCommentsParams extends DynatraceBaseParams { + problemId: string + pageSize?: number + nextPageKey?: string +} + +export interface DynatraceListProblemCommentsResponse extends ToolResponse { + output: { + comments: DynatraceComment[] + totalCount: number | null + pageSize: number | null + nextPageKey: string | null + } +} + +export interface DynatraceAddProblemCommentParams extends DynatraceBaseParams { + problemId: string + message: string + context?: string +} + +export interface DynatraceAddProblemCommentResponse extends ToolResponse { + output: { + problemId: string + message: string + context: string | null + } +} + +export interface DynatraceQueryMetricsParams extends DynatraceBaseParams { + metricSelector: string + from?: string + to?: string + resolution?: string + entitySelector?: string + mzSelector?: string +} + +export interface DynatraceQueryMetricsResponse extends ToolResponse { + output: { + result: DynatraceMetricResult[] + resolution: string | null + totalCount: number | null + nextPageKey: string | null + warnings: string[] + } +} + +export interface DynatraceListMetricsParams extends DynatraceBaseParams { + metricSelector?: string + text?: string + fields?: string + writtenSince?: string + writtenSinceMode?: string + metadataSelector?: string + pageSize?: number + nextPageKey?: string +} + +export interface DynatraceListMetricsResponse extends ToolResponse { + output: { + metrics: DynatraceMetricDescriptor[] + totalCount: number | null + nextPageKey: string | null + warnings: string[] + } +} + +export interface DynatraceGetMetricParams extends DynatraceBaseParams { + metricKey: string +} + +export interface DynatraceGetMetricResponse extends ToolResponse { + output: { + metric: DynatraceMetricDescriptor + } +} + +export interface DynatraceIngestMetricsParams extends DynatraceBaseParams { + payload: string +} + +export interface DynatraceIngestMetricsResponse extends ToolResponse { + output: { + linesOk: number | null + linesInvalid: number | null + ingestError: Record | null + warnings: Record | null + } +} + +export interface DynatraceListEntitiesParams extends DynatraceBaseParams { + entitySelector: string + from?: string + to?: string + fields?: string + sort?: string + pageSize?: number + nextPageKey?: string +} + +export interface DynatraceListEntitiesResponse extends ToolResponse { + output: { + entities: DynatraceEntity[] + totalCount: number | null + pageSize: number | null + nextPageKey: string | null + } +} + +export interface DynatraceGetEntityParams extends DynatraceBaseParams { + entityId: string + from?: string + to?: string + fields?: string +} + +export interface DynatraceGetEntityResponse extends ToolResponse { + output: { + entity: DynatraceEntity + } +} + +export interface DynatraceListEntityTypesParams extends DynatraceBaseParams { + pageSize?: number + nextPageKey?: string +} + +export interface DynatraceListEntityTypesResponse extends ToolResponse { + output: { + types: DynatraceEntityType[] + totalCount: number | null + pageSize: number | null + nextPageKey: string | null + } +} + +export interface DynatraceListEventsParams extends DynatraceBaseParams { + from?: string + to?: string + eventSelector?: string + entitySelector?: string + pageSize?: number + nextPageKey?: string +} + +export interface DynatraceListEventsResponse extends ToolResponse { + output: { + events: DynatraceEvent[] + totalCount: number | null + pageSize: number | null + nextPageKey: string | null + warnings: string[] + } +} + +export interface DynatraceGetEventParams extends DynatraceBaseParams { + eventId: string +} + +export interface DynatraceGetEventResponse extends ToolResponse { + output: { + event: DynatraceEvent + } +} + +export interface DynatraceIngestEventParams extends DynatraceBaseParams { + eventType: string + title: string + entitySelector?: string + startTime?: number + endTime?: number + /** + * Dynatrace's event timeout in minutes. Deliberately not named `timeout` — + * the tool transport reserves that param name for the HTTP request timeout. + */ + eventTimeout?: number + properties?: Record +} + +export interface DynatraceIngestEventResponse extends ToolResponse { + output: { + reportCount: number | null + eventIngestResults: Array<{ correlationId: string | null; status: string | null }> + } +} + +export interface DynatraceSearchLogsParams extends DynatraceBaseParams { + query?: string + from?: string + to?: string + sort?: string + limit?: number + nextSliceKey?: string +} + +export interface DynatraceSearchLogsResponse extends ToolResponse { + output: { + results: DynatraceLogRecord[] + sliceSize: number | null + nextSliceKey: string | null + warnings: string | null + } +} + +export interface DynatraceIngestLogsParams extends DynatraceBaseParams { + logs: Record | Array> +} + +export interface DynatraceIngestLogsResponse extends ToolResponse { + output: { + accepted: boolean + statusCode: number + details: Record | null + } +} + +export interface DynatraceListSlosParams extends DynatraceBaseParams { + sloSelector?: string + from?: string + to?: string + timeFrame?: string + sort?: string + enabledSlos?: string + evaluate?: boolean + showGlobalSlos?: boolean + pageSize?: number + nextPageKey?: string +} + +export interface DynatraceListSlosResponse extends ToolResponse { + output: { + slos: DynatraceSlo[] + totalCount: number | null + pageSize: number | null + nextPageKey: string | null + } +} + +export interface DynatraceGetSloParams extends DynatraceBaseParams { + sloId: string + from?: string + to?: string + timeFrame?: string +} + +export interface DynatraceGetSloResponse extends ToolResponse { + output: { + slo: DynatraceSlo + } +} + +export interface DynatraceListSecurityProblemsParams extends DynatraceBaseParams { + securityProblemSelector?: string + from?: string + to?: string + fields?: string + sort?: string + pageSize?: number + nextPageKey?: string +} + +export interface DynatraceListSecurityProblemsResponse extends ToolResponse { + output: { + securityProblems: DynatraceSecurityProblem[] + totalCount: number | null + pageSize: number | null + nextPageKey: string | null + } +} + +export interface DynatraceGetSecurityProblemParams extends DynatraceBaseParams { + securityProblemId: string + fields?: string + managementZoneFilter?: string + from?: string +} + +export interface DynatraceGetSecurityProblemResponse extends ToolResponse { + output: { + securityProblem: DynatraceSecurityProblemDetails + } +} + +export interface DynatraceGetAuditLogsParams extends DynatraceBaseParams { + filter?: string + from?: string + to?: string + sort?: string + pageSize?: number + nextPageKey?: string +} + +export interface DynatraceGetAuditLogsResponse extends ToolResponse { + output: { + auditLogs: DynatraceAuditLog[] + totalCount: number | null + pageSize: number | null + nextPageKey: string | null + } +} + +/** Union of every Dynatrace tool response, used as the block's response type. */ +export type DynatraceResponse = + | DynatraceListProblemsResponse + | DynatraceGetProblemResponse + | DynatraceCloseProblemResponse + | DynatraceListProblemCommentsResponse + | DynatraceAddProblemCommentResponse + | DynatraceQueryMetricsResponse + | DynatraceListMetricsResponse + | DynatraceGetMetricResponse + | DynatraceIngestMetricsResponse + | DynatraceListEntitiesResponse + | DynatraceGetEntityResponse + | DynatraceListEntityTypesResponse + | DynatraceListEventsResponse + | DynatraceGetEventResponse + | DynatraceIngestEventResponse + | DynatraceSearchLogsResponse + | DynatraceIngestLogsResponse + | DynatraceListSlosResponse + | DynatraceGetSloResponse + | DynatraceListSecurityProblemsResponse + | DynatraceGetSecurityProblemResponse + | DynatraceGetAuditLogsResponse diff --git a/apps/sim/tools/dynatrace/utils.ts b/apps/sim/tools/dynatrace/utils.ts new file mode 100644 index 00000000000..ce5ef66b54c --- /dev/null +++ b/apps/sim/tools/dynatrace/utils.ts @@ -0,0 +1,415 @@ +import type { + DynatraceAuditLog, + DynatraceComment, + DynatraceEntity, + DynatraceEntityStub, + DynatraceEntityType, + DynatraceEvent, + DynatraceLogRecord, + DynatraceManagementZone, + DynatraceMetricDescriptor, + DynatraceMetricResult, + DynatraceProblem, + DynatraceProblemFilter, + DynatraceSecurityProblem, + DynatraceSecurityProblemDetails, + DynatraceSlo, + DynatraceTag, +} from '@/tools/dynatrace/types' + +type QueryValue = string | number | boolean | undefined | null + +/** + * Builds an absolute Environment API v2 URL. Tolerates a trailing slash and a + * trailing `/api/v2` segment on the user-supplied environment URL, and omits + * query parameters that are unset or empty. + */ +export function buildDynatraceUrl( + environmentUrl: string, + path: string, + query?: Record +): string { + const base = environmentUrl + .trim() + .replace(/\/+$/, '') + .replace(/\/api\/v2$/, '') + const search = new URLSearchParams() + + for (const [key, value] of Object.entries(query ?? {})) { + if (value === undefined || value === null || value === '') continue + search.set(key, String(value)) + } + + const queryString = search.toString() + return `${base}/api/v2${path}${queryString ? `?${queryString}` : ''}` +} + +/** + * Encodes a path segment, leaving the `:` separators intact that Dynatrace metric + * keys and transformation operators use (`builtin:host.cpu.usage:avg`). + */ +export function encodeDynatracePathSegment(value: string): string { + return encodeURIComponent(value).replace(/%3A/gi, ':') +} + +/** Builds the Dynatrace authorization headers. */ +export function dynatraceHeaders( + apiToken: string, + contentType = 'application/json' +): Record { + return { + Authorization: `Api-Token ${apiToken.trim()}`, + 'Content-Type': contentType, + Accept: 'application/json', + } +} + +/** + * Reads a JSON response body, tolerating the empty bodies Dynatrace returns for + * 201/204 responses. + */ +export async function readJsonBody(response: Response): Promise> { + const text = await response.text() + if (!text.trim()) return {} + try { + return JSON.parse(text) as Record + } catch { + return {} + } +} + +function toRecordArray(value: unknown): Array> { + return Array.isArray(value) ? (value as Array>) : [] +} + +function toStringArray(value: unknown): string[] { + return Array.isArray(value) ? (value as string[]) : [] +} + +function toRecord(value: unknown): Record { + return value && typeof value === 'object' && !Array.isArray(value) + ? (value as Record) + : {} +} + +function toRecordOrNull(value: unknown): Record | null { + return value && typeof value === 'object' && !Array.isArray(value) + ? (value as Record) + : null +} + +/** Flattens an `EntityStub` (`{ entityId: { id, type }, name }`) into a single object. */ +export function mapEntityStub(stub: unknown): DynatraceEntityStub | null { + const record = toRecordOrNull(stub) + if (!record) return null + const entityId = toRecord(record.entityId) + return { + id: (entityId.id as string) ?? null, + type: (entityId.type as string) ?? null, + name: (record.name as string) ?? null, + } +} + +function mapEntityStubs(value: unknown): DynatraceEntityStub[] { + return toRecordArray(value) + .map(mapEntityStub) + .filter((stub): stub is DynatraceEntityStub => stub !== null) +} + +/** Maps a `METag` list. */ +export function mapTags(value: unknown): DynatraceTag[] { + return toRecordArray(value).map((tag) => ({ + context: (tag.context as string) ?? null, + key: (tag.key as string) ?? null, + value: (tag.value as string) ?? null, + stringRepresentation: (tag.stringRepresentation as string) ?? null, + })) +} + +/** Maps a management zone list. */ +export function mapManagementZones(value: unknown): DynatraceManagementZone[] { + return toRecordArray(value).map((zone) => ({ + id: (zone.id as string) ?? null, + name: (zone.name as string) ?? null, + })) +} + +function mapProblemFilters(value: unknown): DynatraceProblemFilter[] { + return toRecordArray(value).map((filter) => ({ + id: (filter.id as string) ?? null, + name: (filter.name as string) ?? null, + })) +} + +/** Maps a single problem comment. */ +export function mapComment(value: unknown): DynatraceComment | null { + const comment = toRecordOrNull(value) + if (!comment) return null + return { + id: (comment.id as string) ?? null, + authorName: (comment.authorName as string) ?? null, + content: (comment.content as string) ?? null, + context: (comment.context as string) ?? null, + createdAtTimestamp: (comment.createdAtTimestamp as number) ?? null, + } +} + +/** Maps a problem from the Problems API v2. */ +export function mapProblem(value: Record): DynatraceProblem { + const linkedProblem = toRecordOrNull(value.linkedProblemInfo) + return { + problemId: (value.problemId as string) ?? null, + displayId: (value.displayId as string) ?? null, + title: (value.title as string) ?? null, + status: (value.status as string) ?? null, + severityLevel: (value.severityLevel as string) ?? null, + impactLevel: (value.impactLevel as string) ?? null, + startTime: (value.startTime as number) ?? null, + endTime: (value.endTime as number) ?? null, + rootCauseEntity: mapEntityStub(value.rootCauseEntity), + affectedEntities: mapEntityStubs(value.affectedEntities), + impactedEntities: mapEntityStubs(value.impactedEntities), + managementZones: mapManagementZones(value.managementZones), + entityTags: mapTags(value.entityTags), + problemFilters: mapProblemFilters(value.problemFilters), + linkedProblemInfo: linkedProblem + ? { + problemId: (linkedProblem.problemId as string) ?? null, + displayId: (linkedProblem.displayId as string) ?? null, + } + : null, + evidenceDetails: toRecordOrNull(value.evidenceDetails), + impactAnalysis: toRecordOrNull(value.impactAnalysis), + recentComments: toRecordOrNull(value.recentComments), + } +} + +/** Maps a monitored entity. */ +export function mapEntity(value: Record): DynatraceEntity { + return { + entityId: (value.entityId as string) ?? null, + type: (value.type as string) ?? null, + displayName: (value.displayName as string) ?? null, + firstSeenTms: (value.firstSeenTms as number) ?? null, + lastSeenTms: (value.lastSeenTms as number) ?? null, + properties: toRecord(value.properties), + tags: mapTags(value.tags), + managementZones: mapManagementZones(value.managementZones), + icon: toRecordOrNull(value.icon), + fromRelationships: toRecord(value.fromRelationships), + toRelationships: toRecord(value.toRelationships), + } +} + +/** Maps an entity type descriptor. */ +export function mapEntityType(value: Record): DynatraceEntityType { + return { + type: (value.type as string) ?? null, + displayName: (value.displayName as string) ?? null, + dimensionKey: (value.dimensionKey as string) ?? null, + entityLimitExceeded: (value.entityLimitExceeded as boolean) ?? null, + properties: toRecordArray(value.properties).map((property) => ({ + id: (property.id as string) ?? null, + displayName: (property.displayName as string) ?? null, + type: (property.type as string) ?? null, + })), + fromRelationships: toRecordArray(value.fromRelationships).map((relationship) => ({ + id: (relationship.id as string) ?? null, + toTypes: toStringArray(relationship.toTypes), + })), + toRelationships: toRecordArray(value.toRelationships).map((relationship) => ({ + id: (relationship.id as string) ?? null, + fromTypes: toStringArray(relationship.fromTypes), + })), + } +} + +/** Maps an event from the Events API v2. */ +export function mapEvent(value: Record): DynatraceEvent { + return { + eventId: (value.eventId as string) ?? null, + eventType: (value.eventType as string) ?? null, + title: (value.title as string) ?? null, + startTime: (value.startTime as number) ?? null, + endTime: (value.endTime as number) ?? null, + status: (value.status as string) ?? null, + correlationId: (value.correlationId as string) ?? null, + frequentEvent: (value.frequentEvent as boolean) ?? null, + underMaintenance: (value.underMaintenance as boolean) ?? null, + suppressAlert: (value.suppressAlert as boolean) ?? null, + suppressProblem: (value.suppressProblem as boolean) ?? null, + entityId: mapEntityStub(value.entityId), + properties: toRecordArray(value.properties).map((property) => ({ + key: (property.key as string) ?? null, + value: (property.value as string) ?? null, + })), + managementZones: mapManagementZones(value.managementZones), + entityTags: mapTags(value.entityTags), + } +} + +/** Maps one metric of a `/metrics/query` result. */ +export function mapMetricResult(value: Record): DynatraceMetricResult { + return { + metricId: (value.metricId as string) ?? null, + dataPointCountRatio: (value.dataPointCountRatio as number) ?? null, + dimensionCountRatio: (value.dimensionCountRatio as number) ?? null, + appliedOptionalFilters: Array.isArray(value.appliedOptionalFilters) + ? value.appliedOptionalFilters + : [], + dql: toRecordOrNull(value.dql), + warnings: toStringArray(value.warnings), + data: toRecordArray(value.data).map((series) => ({ + dimensions: toStringArray(series.dimensions), + dimensionMap: toRecord(series.dimensionMap) as Record, + timestamps: Array.isArray(series.timestamps) ? (series.timestamps as number[]) : [], + values: Array.isArray(series.values) ? (series.values as Array) : [], + })), + } +} + +/** Maps a metric descriptor. */ +export function mapMetricDescriptor(value: Record): DynatraceMetricDescriptor { + return { + metricId: (value.metricId as string) ?? null, + displayName: (value.displayName as string) ?? null, + description: (value.description as string) ?? null, + unit: (value.unit as string) ?? null, + unitDisplayFormat: (value.unitDisplayFormat as string) ?? null, + tags: toStringArray(value.tags), + billable: (value.billable as boolean) ?? null, + dduBillable: (value.dduBillable as boolean) ?? null, + created: (value.created as number) ?? null, + lastWritten: (value.lastWritten as number) ?? null, + aggregationTypes: toStringArray(value.aggregationTypes), + defaultAggregation: toRecordOrNull(value.defaultAggregation), + dimensionDefinitions: toRecordArray(value.dimensionDefinitions), + dimensionCardinalities: toRecordArray(value.dimensionCardinalities), + transformations: toStringArray(value.transformations), + entityType: toStringArray(value.entityType), + minimumValue: (value.minimumValue as number) ?? null, + maximumValue: (value.maximumValue as number) ?? null, + rootCauseRelevant: (value.rootCauseRelevant as boolean) ?? null, + impactRelevant: (value.impactRelevant as boolean) ?? null, + metricValueType: toRecordOrNull(value.metricValueType), + latency: (value.latency as number) ?? null, + metricSelector: (value.metricSelector as string) ?? null, + scalar: (value.scalar as boolean) ?? null, + resolutionInfSupported: (value.resolutionInfSupported as boolean) ?? null, + warnings: toStringArray(value.warnings), + } +} + +/** Maps a service-level objective. */ +export function mapSlo(value: Record): DynatraceSlo { + return { + id: (value.id as string) ?? null, + name: (value.name as string) ?? null, + description: (value.description as string) ?? null, + enabled: (value.enabled as boolean) ?? null, + target: (value.target as number) ?? null, + warning: (value.warning as number) ?? null, + timeframe: (value.timeframe as string) ?? null, + filter: (value.filter as string) ?? null, + evaluationType: (value.evaluationType as string) ?? null, + evaluatedPercentage: (value.evaluatedPercentage as number) ?? null, + status: (value.status as string) ?? null, + error: (value.error as string) ?? null, + errorBudget: (value.errorBudget as number) ?? null, + errorBudgetBurnRate: toRecordOrNull(value.errorBudgetBurnRate), + metricKey: (value.metricKey as string) ?? null, + metricName: (value.metricName as string) ?? null, + metricExpression: (value.metricExpression as string) ?? null, + relatedOpenProblems: (value.relatedOpenProblems as number) ?? null, + relatedTotalProblems: (value.relatedTotalProblems as number) ?? null, + } +} + +/** Maps a security problem (vulnerability). */ +export function mapSecurityProblem(value: Record): DynatraceSecurityProblem { + return { + securityProblemId: (value.securityProblemId as string) ?? null, + displayId: (value.displayId as string) ?? null, + status: (value.status as string) ?? null, + muted: (value.muted as boolean) ?? null, + title: (value.title as string) ?? null, + technology: (value.technology as string) ?? null, + vulnerabilityType: (value.vulnerabilityType as string) ?? null, + packageName: (value.packageName as string) ?? null, + externalVulnerabilityId: (value.externalVulnerabilityId as string) ?? null, + cveIds: toStringArray(value.cveIds), + url: (value.url as string) ?? null, + firstSeenTimestamp: (value.firstSeenTimestamp as number) ?? null, + lastUpdatedTimestamp: (value.lastUpdatedTimestamp as number) ?? null, + lastOpenedTimestamp: (value.lastOpenedTimestamp as number) ?? null, + lastResolvedTimestamp: (value.lastResolvedTimestamp as number) ?? null, + riskAssessment: toRecordOrNull(value.riskAssessment), + managementZones: mapManagementZones(value.managementZones), + globalCounts: toRecordOrNull(value.globalCounts), + codeLevelVulnerabilityDetails: toRecordOrNull(value.codeLevelVulnerabilityDetails), + } +} + +/** Maps a security problem including the detail-only fields. */ +export function mapSecurityProblemDetails( + value: Record +): DynatraceSecurityProblemDetails { + return { + ...mapSecurityProblem(value), + description: (value.description as string) ?? null, + remediationDescription: (value.remediationDescription as string) ?? null, + muteStateChangeInProgress: (value.muteStateChangeInProgress as boolean) ?? null, + affectedEntities: toStringArray(value.affectedEntities), + exposedEntities: toStringArray(value.exposedEntities), + reachableDataAssets: toStringArray(value.reachableDataAssets), + vulnerableComponents: toRecordArray(value.vulnerableComponents), + filteredCounts: toRecordOrNull(value.filteredCounts), + events: toRecordArray(value.events), + entryPoints: toRecordOrNull(value.entryPoints), + relatedEntities: toRecordOrNull(value.relatedEntities), + relatedAttacks: toRecordOrNull(value.relatedAttacks), + relatedContainerImages: toRecordOrNull(value.relatedContainerImages), + } +} + +/** Maps an audit log entry, lifting the dotted `dt.settings.*` keys into camelCase. */ +export function mapAuditLog(value: Record): DynatraceAuditLog { + return { + logId: (value.logId as string) ?? null, + eventType: (value.eventType as string) ?? null, + category: (value.category as string) ?? null, + entityId: (value.entityId as string) ?? null, + environmentId: (value.environmentId as string) ?? null, + user: (value.user as string) ?? null, + userType: (value.userType as string) ?? null, + userOrigin: (value.userOrigin as string) ?? null, + timestamp: (value.timestamp as number) ?? null, + success: (value.success as boolean) ?? null, + message: (value.message as string) ?? null, + patch: toRecordOrNull(value.patch), + settingsSchemaId: (value['dt.settings.schema_id'] as string) ?? null, + settingsScopeId: (value['dt.settings.scope_id'] as string) ?? null, + settingsKey: (value['dt.settings.key'] as string) ?? null, + settingsObjectId: (value['dt.settings.object_id'] as string) ?? null, + settingsObjectSummary: (value['dt.settings.object_summary'] as string) ?? null, + settingsScopeName: (value['dt.settings.scope_name'] as string) ?? null, + } +} + +/** Maps a log record from the Log Monitoring API v2 search endpoint. */ +export function mapLogRecord(value: Record): DynatraceLogRecord { + return { + timestamp: (value.timestamp as number) ?? null, + status: (value.status as string) ?? null, + content: (value.content as string) ?? null, + eventType: (value.eventType as string) ?? null, + additionalColumns: toRecord(value.additionalColumns), + } +} + +/** Normalizes the `warnings` array Dynatrace list endpoints return. */ +export function mapWarnings(value: unknown): string[] { + if (Array.isArray(value)) return value.map((warning) => String(warning)) + if (typeof value === 'string') return [value] + return [] +} diff --git a/apps/sim/tools/generated/tool-ids.ts b/apps/sim/tools/generated/tool-ids.ts index a1494f6b0e0..9197aeeee82 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","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_attach_file","agiloft_attachment_info","agiloft_create_record","agiloft_delete_record","agiloft_get_choice_line_id","agiloft_lock_record","agiloft_read_record","agiloft_remove_attachment","agiloft_retrieve_attachment","agiloft_saved_search","agiloft_search_records","agiloft_select_records","agiloft_update_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_change_application_stage","ashby_create_application","ashby_create_candidate","ashby_create_note","ashby_get_application","ashby_get_candidate","ashby_get_job","ashby_get_job_posting","ashby_get_offer","ashby_list_applications","ashby_list_archive_reasons","ashby_list_candidate_tags","ashby_list_candidates","ashby_list_custom_fields","ashby_list_departments","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_update_candidate","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_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","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_webhook","calendly_delete_webhook","calendly_get_current_user","calendly_get_event_type","calendly_get_scheduled_event","calendly_list_event_invitees","calendly_list_event_types","calendly_list_scheduled_events","calendly_list_webhooks","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_dns_record","cloudflare_create_zone","cloudflare_delete_dns_record","cloudflare_delete_zone","cloudflare_dns_analytics","cloudflare_get_zone","cloudflare_get_zone_settings","cloudflare_list_certificates","cloudflare_list_dns_records","cloudflare_list_zones","cloudflare_purge_cache","cloudflare_update_dns_record","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_get_sensor_aggregates","crowdstrike_get_sensor_details","crowdstrike_query_sensors","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_cancel_downtime","datadog_create_downtime","datadog_create_event","datadog_create_monitor","datadog_get_monitor","datadog_list_downtimes","datadog_list_monitors","datadog_mute_monitor","datadog_query_logs","datadog_query_timeseries","datadog_send_logs","datadog_submit_metrics","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","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","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","evernote_copy_note","evernote_create_note","evernote_create_notebook","evernote_create_tag","evernote_delete_note","evernote_get_note","evernote_get_notebook","evernote_list_notebooks","evernote_list_tags","evernote_search_notes","evernote_update_note","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_decompress","file_fetch","file_get","file_get_content","file_manage_sharing","file_parser","file_parser_v2","file_parser_v3","file_read","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_dashboard","grafana_delete_folder","grafana_get_alert_rule","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_update_alert_rule","grafana_update_annotation","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_get_note","granola_list_folders","granola_list_notes","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","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_list","incidentio_actions_show","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_create","incidentio_escalations_list","incidentio_escalations_show","incidentio_follow_ups_list","incidentio_follow_ups_show","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_schedule_entries_list","incidentio_schedule_overrides_create","incidentio_schedules_create","incidentio_schedules_delete","incidentio_schedules_list","incidentio_schedules_show","incidentio_schedules_update","incidentio_severities_list","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","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","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","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","mem0_add_memories","mem0_get_memories","mem0_search_memories","memory_add","memory_delete","memory_get","memory_get_all","microsoft_ad_add_group_member","microsoft_ad_create_group","microsoft_ad_create_user","microsoft_ad_delete_group","microsoft_ad_delete_user","microsoft_ad_get_group","microsoft_ad_get_user","microsoft_ad_list_group_members","microsoft_ad_list_groups","microsoft_ad_list_users","microsoft_ad_remove_group_member","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_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","millionverifier_get_credits","millionverifier_verify_email","mistral_parser","mistral_parser_v2","mistral_parser_v3","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","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","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_user","okta_add_user_to_group","okta_create_group","okta_create_user","okta_deactivate_user","okta_delete_group","okta_delete_user","okta_get_group","okta_get_user","okta_list_group_members","okta_list_groups","okta_list_users","okta_remove_user_from_group","okta_reset_password","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","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","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","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","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_aggregate","servicenow_create_record","servicenow_delete_record","servicenow_download_attachment","servicenow_list_attachments","servicenow_read_record","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_conversation","slack_schedule_message","slack_set_conversation_purpose","slack_set_conversation_topic","slack_set_status","slack_set_suggested_prompts","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","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","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","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","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_attach_file","agiloft_attachment_info","agiloft_create_record","agiloft_delete_record","agiloft_get_choice_line_id","agiloft_lock_record","agiloft_read_record","agiloft_remove_attachment","agiloft_retrieve_attachment","agiloft_saved_search","agiloft_search_records","agiloft_select_records","agiloft_update_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_change_application_stage","ashby_create_application","ashby_create_candidate","ashby_create_note","ashby_get_application","ashby_get_candidate","ashby_get_job","ashby_get_job_posting","ashby_get_offer","ashby_list_applications","ashby_list_archive_reasons","ashby_list_candidate_tags","ashby_list_candidates","ashby_list_custom_fields","ashby_list_departments","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_update_candidate","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_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","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_webhook","calendly_delete_webhook","calendly_get_current_user","calendly_get_event_type","calendly_get_scheduled_event","calendly_list_event_invitees","calendly_list_event_types","calendly_list_scheduled_events","calendly_list_webhooks","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_dns_record","cloudflare_create_zone","cloudflare_delete_dns_record","cloudflare_delete_zone","cloudflare_dns_analytics","cloudflare_get_zone","cloudflare_get_zone_settings","cloudflare_list_certificates","cloudflare_list_dns_records","cloudflare_list_zones","cloudflare_purge_cache","cloudflare_update_dns_record","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_get_sensor_aggregates","crowdstrike_get_sensor_details","crowdstrike_query_sensors","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_cancel_downtime","datadog_create_downtime","datadog_create_event","datadog_create_monitor","datadog_get_monitor","datadog_list_downtimes","datadog_list_monitors","datadog_mute_monitor","datadog_query_logs","datadog_query_timeseries","datadog_send_logs","datadog_submit_metrics","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_close_problem","dynatrace_get_audit_logs","dynatrace_get_entity","dynatrace_get_event","dynatrace_get_metric","dynatrace_get_problem","dynatrace_get_security_problem","dynatrace_get_slo","dynatrace_ingest_event","dynatrace_ingest_logs","dynatrace_ingest_metrics","dynatrace_list_entities","dynatrace_list_entity_types","dynatrace_list_events","dynatrace_list_metrics","dynatrace_list_problem_comments","dynatrace_list_problems","dynatrace_list_security_problems","dynatrace_list_slos","dynatrace_query_metrics","dynatrace_search_logs","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","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","evernote_copy_note","evernote_create_note","evernote_create_notebook","evernote_create_tag","evernote_delete_note","evernote_get_note","evernote_get_notebook","evernote_list_notebooks","evernote_list_tags","evernote_search_notes","evernote_update_note","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_decompress","file_fetch","file_get","file_get_content","file_manage_sharing","file_parser","file_parser_v2","file_parser_v3","file_read","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_dashboard","grafana_delete_folder","grafana_get_alert_rule","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_update_alert_rule","grafana_update_annotation","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_get_note","granola_list_folders","granola_list_notes","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","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_list","incidentio_actions_show","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_create","incidentio_escalations_list","incidentio_escalations_show","incidentio_follow_ups_list","incidentio_follow_ups_show","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_schedule_entries_list","incidentio_schedule_overrides_create","incidentio_schedules_create","incidentio_schedules_delete","incidentio_schedules_list","incidentio_schedules_show","incidentio_schedules_update","incidentio_severities_list","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","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","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","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","mem0_add_memories","mem0_get_memories","mem0_search_memories","memory_add","memory_delete","memory_get","memory_get_all","microsoft_ad_add_group_member","microsoft_ad_create_group","microsoft_ad_create_user","microsoft_ad_delete_group","microsoft_ad_delete_user","microsoft_ad_get_group","microsoft_ad_get_user","microsoft_ad_list_group_members","microsoft_ad_list_groups","microsoft_ad_list_users","microsoft_ad_remove_group_member","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_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","millionverifier_get_credits","millionverifier_verify_email","mistral_parser","mistral_parser_v2","mistral_parser_v3","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","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","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_user","okta_add_user_to_group","okta_create_group","okta_create_user","okta_deactivate_user","okta_delete_group","okta_delete_user","okta_get_group","okta_get_user","okta_list_group_members","okta_list_groups","okta_list_users","okta_remove_user_from_group","okta_reset_password","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","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","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","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","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_aggregate","servicenow_create_record","servicenow_delete_record","servicenow_download_attachment","servicenow_list_attachments","servicenow_read_record","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_conversation","slack_schedule_message","slack_set_conversation_purpose","slack_set_conversation_topic","slack_set_status","slack_set_suggested_prompts","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","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","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","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 d0acb6126d7..1588acee972 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)"}}},"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)"}}},"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)"}}},"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)"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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)"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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)"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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)"}}},"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"}}},"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"}}},"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"}}},"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)"}}},"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)"}}},"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)"}}},"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)"}}},"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)"}}},"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)"}}},"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"}}},"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"}}},"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."}}},"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"}}},"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."}}},"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":false,"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)"}}},"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"}}},"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\\"})"}}},"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"}}},"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\\")"}}},"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\\""}}},"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"}}},"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)"}}},"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)"}}},"agiloft_saved_search":{"id":"agiloft_saved_search","name":"Agiloft Saved Search","description":"List 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":"Table name to list saved searches for (e.g., \\"contracts\\")"}}},"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":true,"visibility":"user-or-llm","description":"Search query using Agiloft query syntax (e.g., \\"status=\'Active\'\\" or \\"company_name~=\'Acme\'\\")"},"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_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\'\\")"}}},"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\\"})"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}}},"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"}}},"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)"}}},"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"}}},"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"}}},"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."}}},"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"}}},"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"}}},"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"}}},"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"}}},"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\\"."}}},"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"}}},"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"}}},"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)"}}},"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)"}}},"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"}}},"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)"}}},"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\\""}}},"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\\""}}},"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\\""}}},"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\\""}}},"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\\""}}},"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\\""}}},"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\\""}}},"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\\""}}},"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\\""}}},"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\\""}}},"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\\""}}},"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)"}}},"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\\""}}},"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\\""}}},"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\\""}}},"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\\""}}},"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\\""}}},"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\\""}}},"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)"}}},"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."}}},"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"}}},"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)"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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)"}}},"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"}}},"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)"}}},"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"}}},"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\\")"}}},"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)"}}},"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"}}},"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\\"])"}}},"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\\")"}}},"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)"}}},"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)"}}},"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)"}}},"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)"}}},"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"}}},"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)"}}},"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"}}},"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)"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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"}}},"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)"}}},"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\\")"}}},"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)"}}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"}},"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"},"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"}}},"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"},"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"}}},"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"},"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 (defaults to 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)"}}},"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"},"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\\"]"}}},"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"},"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: , , , ,