diff --git a/public/data/agent-tools-index.json b/public/data/agent-tools-index.json index 97ce0328a..910cbe15f 100644 --- a/public/data/agent-tools-index.json +++ b/public/data/agent-tools-index.json @@ -2964,6 +2964,581 @@ "name": "alphaxivmcp_read_files_from_github_repository", "description": "Reads the contents of a file or directory from the paper's codebase repository. Returns repository structure for '/', directory listing for directories, or file contents for files." }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_bulk_assign_annotation_category", + "description": "Assign an existing annotation category to multiple annotations at once." + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_create_annotation", + "description": "Create a chart annotation marking a single date or a date range, either globally visible on all charts or scoped to one chart. CONFIRMED (live-tested): category and chart_id are both validated against real resources already known to Amplitude — an unrecognized category name or c…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_create_annotation_category", + "description": "Create a new category for organizing chart annotations in Amplitude." + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_create_dsar_request", + "description": "Create a Data Subject Access Request (DSAR) job that collects all of a specific user's data from Amplitude for a given date range. Requires a connected account whose API Key/Secret Key fields hold Amplitude's ORGANIZATION-level credentials, not the project-level credentials most…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_create_event_category", + "description": "Create a new event category in Amplitude's taxonomy, used to group related event types." + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_create_event_property", + "description": "Create a new event property in Amplitude's taxonomy. If event_type is set, this creates an event-specific property override for that event type; if omitted, this creates a shared property used across all events." + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_create_event_type", + "description": "Create a new event type in Amplitude's taxonomy, optionally assigning it a category, description, tags, owner, and visibility flags." + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_create_group_property", + "description": "Create a new group property in Amplitude's Taxonomy — a custom property scoped to a specific group type (e.g. 'org', 'company') rather than to users or events. Only group_property and group_type are explicitly confirmed by Amplitude's group-property docs; the remaining descripti…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_create_release", + "description": "Create a release annotation in Amplitude, marking a version rollout with a start (and optionally end) time. When chart_visibility is true (the default), the release appears as an annotation on charts. Amplitude's docs only document a 200 success response and a 400 bad-request re…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_create_user_property", + "description": "Create a new user property in Amplitude's taxonomy. Unlike event properties, user properties have no event_type or is_required field — they always apply globally to the user profile, not to a specific event." + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_delete_annotation", + "description": "Permanently delete a chart annotation from Amplitude." + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_delete_annotation_category", + "description": "Permanently delete a chart annotation category from Amplitude. This does not delete the annotations that used this category, only the category grouping itself." + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_delete_event_category", + "description": "Permanently delete an event category from Amplitude's taxonomy." + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_delete_event_property", + "description": "Delete an event property from Amplitude's taxonomy. amplitudeanalytics_restore_event_property can undo this, but CONFIRMED (live-tested) only for properties that were previously 'live' (actually seen on ingested events) — deleting a purely taxonomy-declared property that was nev…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_delete_event_type", + "description": "Delete an event type from Amplitude's taxonomy. Deletion is state-machine driven: a 'live' event type is marked deleted; an 'unexpected' event type is first added to the tracking plan then deleted; a 'planned' event type is simply removed from the plan; a 'transformed' event typ…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_delete_user_property", + "description": "Delete a custom user property from Amplitude's taxonomy. Amplitude-owned (built-in) user properties cannot be deleted through this API and will return an error. amplitudeanalytics_restore_user_property can undo this, but CONFIRMED (live-tested) only for properties that were prev…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_export_events", + "description": "Export raw event data uploaded to Amplitude within a date range as a zip archive of NDJSON files. The response is a binary zip file, not JSON — save it to disk rather than parsing it as JSON. start and end use the YYYYMMDDTHH format (e.g. 20220201T05), and the start-end range ca…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_get_annotation", + "description": "Retrieve a single chart annotation by its ID." + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_get_annotation_category", + "description": "Retrieve a single chart annotation category by its ID." + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_get_cohort_membership_file", + "description": "Download the completed cohort membership export started with amplitudeanalytics_request_cohort_membership, once amplitudeanalytics_get_cohort_membership_status reports it complete. Small cohorts return the gzip-compressed member data directly; large cohorts return an HTTP 302 re…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_get_cohort_membership_status", + "description": "Check the status of an asynchronous cohort membership export previously started with amplitudeanalytics_request_cohort_membership. Once the status reports completion, call amplitudeanalytics_get_cohort_membership_file to download the data. Note: Amplitude's documented async_stat…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_get_cohort_usage", + "description": "Check how much of the Behavioral Cohorts Download API's monthly quota has been used. Growth and Enterprise plans are limited to 500 download requests per month; this shows the current usage count and when it resets." + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_get_dsar_output_file", + "description": "Download a single completed output file from a Data Subject Access Request (DSAR) job. Requires a connected account whose API Key/Secret Key fields hold Amplitude's ORGANIZATION-level credentials, not the project-level credentials most other tools in this connector use — use the…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_get_dsar_request_status", + "description": "Check the status of a Data Subject Access Request (DSAR) job previously created with amplitudeanalytics_create_dsar_request. Requires a connected account whose API Key/Secret Key fields hold Amplitude's ORGANIZATION-level credentials, not the project-level credentials most other…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_get_event_category", + "description": "Retrieve a single event category from Amplitude's taxonomy, looked up by its category_name. Unlike amplitudeanalytics_update_event_category and amplitudeanalytics_delete_event_category (which are keyed by category_id), this endpoint is keyed by category_name — this matches Ampli…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_get_event_segmentation", + "description": "Pull Event Segmentation chart data from the Amplitude Dashboard REST API: measure an event (uniques, totals, or another metric) over a date range, with optional segment filters and up to two group-by properties. Rate limits: 5 concurrent requests shared with other Amplitude Dash…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_get_event_streaming_metrics", + "description": "Get the delivery-metrics summary for an Amplitude Event Streaming sync over a time window. The response includes timePeriod, eventsDelivered, eventsNotDelivered, deliveryRate, latencyInSeconds (p95), successOnFirstAttempt, successAfterRetry, eventsExpired, and eventsDiscarded. A…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_get_event_type", + "description": "Retrieve a single event type from Amplitude's taxonomy by its event_type name. CONFIRMED (live-tested): if the event type has is_hidden_from_dropdowns set to true, this single-item lookup returns 'Not found' even though the event type still fully exists and appears in amplitudea…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_get_funnel_results", + "description": "Pull Funnel Analysis chart data from the Amplitude Dashboard REST API: step-by-step conversion and drop-off for an ordered (or unordered/sequential) sequence of two or more events over a date range. Rate limits: 5 concurrent requests shared with other Amplitude Dashboard/Cohort …" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_get_group_property", + "description": "Retrieve a single group property from Amplitude's Taxonomy by name." + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_get_session_replay_files", + "description": "Get download links for a single Amplitude session replay's recorded event files. Returns a files array of presigned S3 URLs — these URLs expire after 15 minutes, so download the files promptly after calling this." + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_get_user_mapping", + "description": "Look up user identity mappings (aliases) for one or more Amplitude user IDs. The response is an object keyed by each requested user_id, where each value has mapped_from[] and mapped_to[] arrays of {amplitude_id, user_id} pairs describing merged/aliased identities. This is the on…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_get_user_property", + "description": "Retrieve a single user property by name from Amplitude's taxonomy. CONFIRMED (live-tested): Amplitude auto-prepends 'gp:' to custom user property names on creation regardless of what name amplitudeanalytics_create_user_property was called with — use amplitudeanalytics_list_user_…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_list_annotation_categories", + "description": "List all chart annotation categories in the Amplitude project, or filter to a single category by name." + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_list_annotations", + "description": "List chart annotations, optionally filtered by category, by chart, or by a date range. CONFIRMED (live-tested): category and chart_id do NOT combine as a logical AND, and Amplitude does NOT error if both are set — category silently wins and chart_id is dropped entirely, even whe…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_list_cohorts", + "description": "List all behavioral cohorts defined in the Amplitude project. Returns each cohort's id, name, description, size, published/archived state, owners, viewers, definition, and last-computed time. Use this to find a cohort's id before calling amplitudeanalytics_request_cohort_members…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_list_event_categories", + "description": "List all event categories defined in Amplitude's taxonomy." + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_list_event_properties", + "description": "Get the event properties defined in Amplitude's taxonomy — either the shared properties used across all events, or (if event_type is set) the properties specific to one event type. Note: per Amplitude's documentation, this parameter is sent as a JSON request body on a GET reques…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_list_event_types", + "description": "List event types defined in Amplitude's taxonomy, optionally including deleted ones." + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_list_group_properties", + "description": "List group properties defined in Amplitude's Taxonomy. Pass group_type to scope the list to that group type (e.g. 'org'); omit it to list properties shared across group types rather than any single type's properties." + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_list_session_replays", + "description": "List Amplitude Session Replay recordings, optionally filtered by time range, Amplitude user ID, or an explicit set of replay IDs, with pagination and sort order control. amplitude_id and replay_id are mutually exclusive filters, and replay_id is also mutually exclusive with page…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_list_user_deletion_jobs", + "description": "List Amplitude user-deletion jobs submitted within a date range. The start_day-end_day range cannot exceed 6 months. Returns an array of job objects, each with day, status (Staging, Submitted, or Done), amplitude_ids (the Amplitude user IDs in that day's job), app, and active_sc…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_list_user_properties", + "description": "List user properties in Amplitude's taxonomy, optionally including previously deleted ones." + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_remove_user_from_deletion", + "description": "Remove a single user from a pending Amplitude user-deletion job before it locks, preventing their data from being deleted. This is a protective/cancel action, not a destructive one. It only works while the job is still in Staging status (within the roughly 3-day window after amp…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_request_cohort_membership", + "description": "Start an asynchronous export of an Amplitude cohort's membership (the users/devices in the cohort). Returns a request_id — poll amplitudeanalytics_get_cohort_membership_status with that id until it reports completion, then call amplitudeanalytics_get_cohort_membership_file to do…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_restore_event_property", + "description": "Restore a previously deleted event property back to active status. CONFIRMED (live-tested): this only works for properties that were 'live' (actually seen on ingested events) before being soft-deleted. For a purely taxonomy-declared property that was never ingested, amplitudeana…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_restore_event_type", + "description": "Restore a previously deleted event type back to active/tracked status. CONFIRMED (live-tested): this only works for event types that were 'live' (actually ingested) before being soft-deleted. For a purely taxonomy-declared 'planned' event type that was deleted with amplitudeanal…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_restore_user_property", + "description": "Restore a previously deleted user property back to active status. CONFIRMED (live-tested): this only works for properties that were 'live' (actually seen on ingested events) before being soft-deleted. For a purely taxonomy-declared property that was never ingested, amplitudeanal…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_submit_user_deletion", + "description": "Submit a batch job to permanently delete users' data from Amplitude. Provide amplitude_ids, user_ids, or both — at least one is required; the API rejects a request with neither, which this input schema cannot enforce on its own. A single request accepts a maximum of 100 IDs comb…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_update_annotation", + "description": "Partially update an existing chart annotation. Only the fields you provide are changed; omitted fields keep their current value. Set chart_id to null to make a chart-scoped annotation global again. KNOWN AMPLITUDE API BUG (live-tested): setting end to null does NOT clear the end…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_update_annotation_category", + "description": "Rename an existing chart annotation category." + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_update_cohort_membership", + "description": "Add or remove individual members from an existing Amplitude cohort, without replacing the whole membership list. To create a cohort or replace its full membership list, use amplitudeanalytics_upload_cohort instead. CONFIRMED (live-tested): routing, auth, and the memberships arra…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_update_event_category", + "description": "Rename an existing event category in Amplitude's taxonomy." + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_update_event_property", + "description": "Partially update an existing event property in Amplitude's taxonomy. Only the fields you provide are changed; omitted fields keep their current value. Use overrideScope to control whether the update applies to an event-specific override or the shared property definition, and new…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_update_event_type", + "description": "Partially update an existing event type in Amplitude's taxonomy. Only the fields you provide are changed; omitted fields keep their current value. Set new_event_type to rename the event type." + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_update_group_property", + "description": "Partially update an existing Amplitude Taxonomy group property. Amplitude's update-group-property docs list no body fields at all beyond the path variable, so every field below — including group_type — is inferred by analogy with the create endpoint and the sibling event/user pr…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_update_user_property", + "description": "Partially update an existing user property in Amplitude's taxonomy. Only the fields you provide are changed; omitted fields keep their current value. CONFIRMED BUG (live-tested, reproduced independently twice): new_event_property_value does NOT actually rename a user property — …" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_upload_cohort", + "description": "Create a new Amplitude behavioral cohort from an explicit list of user or Amplitude IDs, or update an existing cohort's membership list wholesale by passing existing_cohort_id. To add/remove individual members from an already-created cohort instead, use amplitudeanalytics_update…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_add_experiment_variant_cohorts", + "description": "Add specific cohorts to this experiment variant's targeting inclusions. This adds to the variant's existing cohort inclusions; it does not replace them. CONFIRMED from Amplitude's docs: POST /api/1/experiments/{id}/variants/{variantKey}/cohorts with body {\"inclusions\": [...]}, a…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_add_experiment_variant_users", + "description": "Force-bucket specific users or devices into this experiment variant — identified by user ID, device ID, or an email-style identifier — bypassing the experiment's normal allocation. This adds to the variant's existing inclusions; it does not replace them. CONFIRMED from Amplitude…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_add_flag_variant_cohorts", + "description": "Add specific cohorts as inclusions on a variant of an Amplitude Experiment feature flag — explicitly assigning these cohorts to this variant regardless of the variant's rollout weight. UNCONFIRMED: unlike the users endpoint, Amplitude's docs don't mention any documented maximum …" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_add_flag_variant_users", + "description": "Add specific users, devices, or emails as individual inclusions on a variant of an Amplitude Experiment feature flag — explicitly assigning these identities to this variant regardless of the variant's rollout weight. Amplitude allows up to 2,000 total inclusions per variant; exc…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_bulk_delete_experiment_variant_cohorts", + "description": "Remove a specific set of cohorts (by ID) from an experiment variant's targeting, leaving other included cohorts untouched. Limited to 100 IDs per request — split larger lists across multiple calls.\n\nCONFIRMED from Amplitude's docs: despite being a DELETE request, cohort IDs are …" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_bulk_delete_experiment_variant_users", + "description": "Remove a specific set of users or devices (by ID) from an experiment variant's inclusion list, leaving all other included users untouched. This is distinct from the remove-all-users tool, which wipes the entire inclusion list regardless of which IDs exist. Limited to 100 user/de…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_bulk_delete_flag_variant_cohorts", + "description": "Remove a specific set of cohorts (by ID) from a flag variant's individual-inclusion list — the cohort analog of Bulk Delete Flag Variant Users.\n\nCONFIRMED from Amplitude's docs: despite being a DELETE request, cohort IDs are sent as a JSON body (not query params). The body field…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_bulk_delete_flag_variant_users", + "description": "Remove a specific SET of users (by user/device ID) from a flag variant's individual-inclusion list — distinct from Remove All Flag Variant Users, which unconditionally clears every user regardless of ID. Per Amplitude's official docs (verified via two independent doc fetches), t…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_create_deployment", + "description": "Create a new deployment in a project. Required fields per Amplitude's docs: projectId, label, and type. A deployment represents one SDK key / environment (for example \"Production\" or \"Development\") that flags and experiments get deployed to. A successful call returns a 200 OK wi…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_create_experiment", + "description": "Create a new Amplitude experiment. Required: project_id, key. name is technically optional per this tool (Amplitude's docs disagree), but supply it anyway — every documented example includes it.\n\ndeliveryMethod and rolloutPercentage are not create-time fields — only projectId, k…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_create_experiment_deployment", + "description": "Deploy an experiment to one or more deployments. CONFIRMED directly from Amplitude's official docs (exact JSON example: {\"deployments\": [\"\"]}): the request body field is the plural array 'deployments', not a singular 'deploymentId' — pass a one-element array to dep…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_create_experiment_variant", + "description": "Add a new variant to an experiment. CONFIRMED from Amplitude's official docs (verified against the page's raw rendered source, not just its visible text): POST /api/1/experiments/{id}/variants with body {key, name, description, payload, rolloutWeight} — key is the only required …" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_create_flag", + "description": "Create a new Amplitude Experiment feature flag. Required: projectId, key. All other fields are optional at creation.\n\nCONFIRMED from Amplitude's docs: tags, rolloutPercentage, enabled, and archive are NOT settable here — set them afterward via update_flag. parentDependencies isn…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_create_flag_deployment", + "description": "Deploy a flag to one or more deployments. Per Amplitude's official docs, the request body takes a deployments array of deployment ID strings — {\"deployments\": [\"\"]} — not a single deploymentId field, so this tool accepts deployment_ids as an array (pass one ID to d…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_create_flag_variant", + "description": "Create a new variant for an Amplitude Experiment feature flag. Only the variant key is required — name, description, payload, and rollout weight are all optional. CONFIRMED (live-tested): this org has Feature Experimentation entitlement. Per Amplitude's docs, a successful call r…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_create_holdout_group", + "description": "Create a new holdout group. Required: projectId, name, holdoutPercentage. \\`individualInclusion\\`/\\`individualExclusion\\` are named from the holdout's own point of view — inclusion in the holdout means exclusion from experiments, and vice versa.\n\nFIXED (confirmed live both regio…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_create_mutex_group", + "description": "Create a new mutex group. Required: projectId, name, slots (JSON-encoded string — see that field's description for shape).\n\nFIXED (confirmed live both regions): this field was previously sent as a raw string instead of a parsed array via body_json_mapping — now uses jsonnet_temp…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_delete_experiment_deployment", + "description": "Undeploy an experiment from a specific deployment — the experiment is removed from that deployment only; any other deployments it's on are unaffected. A successful call returns 200 OK with the literal text 'OK' (not a JSON body); this tool reports success from the status code, n…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_delete_experiment_variant", + "description": "Permanently remove a variant from an experiment. CONFIRMED from Amplitude's docs: DELETE /api/1/experiments/{id}/variants/{variantKey}, no request body. A successful call returns 200 OK with the literal text \"OK\" — Amplitude does not use 204 No Content here, unlike many REST API…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_delete_flag_deployment", + "description": "Undeploy a flag from a specific deployment, identified by deploymentId. This does not delete the deployment itself — a deployment is a shared target that other flags and experiments may also use — it only removes this one flag's association with that deployment. Use List Flag De…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_delete_flag_variant", + "description": "Permanently remove a variant from an Amplitude Experiment feature flag. This deletes the variant definition itself — its key, name, description, payload, and rollout weight — not just its user or cohort inclusions. This is irreversible; any experiment allocations or targeting ru…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_get_experiment", + "description": "Get complete details for a single Amplitude experiment by its ID. Returns the full experiment object — its shape is CONFIRMED via a live-tested list_experiments call against this org (list_experiments returns objects of this same type): id, projectId, deployments[], key, name, d…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_get_experiment_variant", + "description": "Get a single variant's details from an Amplitude experiment, by experiment ID and variant key (the variants[].key value, e.g. \"control\" or \"treatment\"). Use list_experiment_variants or the parent experiment's variants[] array to find valid keys. Amplitude's docs give no example …" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_get_experiment_variant_cohorts", + "description": "List the cohorts explicitly included in this experiment variant's targeting. CONFIRMED from Amplitude's docs: GET /api/1/experiments/{id}/variants/{variantKey}/cohorts, no query parameters documented (no pagination). Response is 200 OK with an array of cohort ID strings (not obj…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_get_experiment_variant_users", + "description": "List the users and devices explicitly force-bucketed into this experiment variant via inclusions — separate from, and in addition to, the experiment's normal allocation/targeting rules. CONFIRMED from Amplitude's docs: GET /api/1/experiments/{id}/variants/{variantKey}/users, no …" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_get_experiment_version", + "description": "Get a single historical version snapshot of an Amplitude experiment, by experiment ID and version ID. Use a version ID returned from list_experiment_versions. Amplitude's docs describe this endpoint only as returning \"details of a specific version of an experiment\" — no example …" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_get_flag", + "description": "Get the full configuration of a single Amplitude Experiment feature flag by its ID. Returns the flag's complete details as documented by Amplitude: id, projectId, deployments, key, name, description, enabled, evaluationMode, bucketingKey, bucketingSalt, bucketingUnit, variants, …" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_get_flag_variant", + "description": "Get a single variant's details from an Amplitude Experiment feature flag. Returns a JSON object with key (required), and optional payload, name, and description fields. Variant keys may contain letters, numbers, underscores, and hyphens (per Amplitude's docs). This org has confi…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_get_flag_variant_cohorts", + "description": "List the cohorts individually assigned (included) to a specific variant of an Amplitude Experiment feature flag. No query parameters, filters, or pagination are documented for this endpoint. Per Amplitude's docs, a successful call returns a 200 OK response with \"the variant's co…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_get_flag_variant_users", + "description": "List the users and devices individually assigned (included) to a specific variant of an Amplitude Experiment feature flag — the explicit targeting list, separate from the variant's percentage-based rollout weight. No query parameters, filters, or pagination are documented for th…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_get_flag_version", + "description": "Get a single version snapshot of an Amplitude Experiment feature flag. Returns a JSON object with createdAt, createdBy, version (a number), and flagConfig (the full flag configuration as it existed at that version — id, projectId, deployments, key, name, description, enabled, ev…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_get_holdout_group", + "description": "Retrieve a single holdout group's full configuration by ID — expected to mirror the shape accepted by Create Holdout Group (name, description, holdoutPercentage, evaluationMode, bucketingKey, experiments, individualInclusion, individualExclusion). UNCONFIRMED (doc gap): Amplitud…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_get_mutex_group", + "description": "Retrieve a single mutex group's full configuration by ID — expected to include its slots and which experiments, holdouts, or individuals occupy each one, mirroring the shape accepted by Create Mutex Group (name, description, evaluationMode, bucketingKey, bucketingSalt, and a slo…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_list_all_versions", + "description": "List version history across ALL flags and experiments the API key can access, in one global, paginated feed — distinct from amplitudeexperimentmanagement_list_flag_versions and amplitudeexperimentmanagement_list_experiment_versions, which return the version history for one speci…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_list_deployments", + "description": "List all deployments in the project. A deployment represents one SDK key / environment (for example \"Production\" or \"Development\") that flags and experiments get deployed to. CONFIRMED from Amplitude's docs: the response follows {\"deployments\": [{\"id\": ..., \"projectId\": ..., \"la…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_list_experiment_deployments", + "description": "List the deployments that an experiment is currently deployed to. Amplitude's docs for this endpoint describe the response only as a '200 OK response and an array of JSON objects with the experiment's deployment details', without a concrete field-level example on this specific p…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_list_experiment_variants", + "description": "List all variants defined on a single Amplitude experiment. Amplitude's docs document no query parameters and give no example response JSON for this endpoint — expect an array of variant objects matching the variants[] entries embedded in the experiment resource. A live-tested l…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_list_experiment_versions", + "description": "List the version history for a single Amplitude experiment — one entry per saved change. Amplitude's docs state versions are \"ordered by creation time, descending\" but document no query parameters for this endpoint (no limit/cursor/date-range filtering) and give no example respo…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_list_experiments", + "description": "List Amplitude experiments for the project. Supports cursor-based pagination — pass the response's nextCursor value back as cursor to get the next page — and optional filters. CONFIRMED (live-tested): the real response shape is {\"experiments\": [...], \"nextCursor\": ...} — Amplitu…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_list_flag_deployments", + "description": "List the deployments a flag is currently deployed to. Per Amplitude's official docs, a successful call returns 200 OK with an array of JSON objects describing each deployment. UNCONFIRMED: Amplitude's docs don't show a raw JSON response example for this specific flag-scoped endp…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_list_flag_variants", + "description": "List all variants defined on a single Amplitude Experiment feature flag. Returns a JSON array of variant objects, each with key (required), and optional payload, name, and description fields. CONFIRMED from Amplitude's docs: no cursor/limit pagination parameters are documented f…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_list_flag_versions", + "description": "List the version history for a single Amplitude Experiment feature flag. Returns a JSON array of version objects, each containing createdAt, createdBy, version (a number), and flagConfig (a full snapshot of the flag's configuration at that version, including id, projectId, deplo…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_list_flags", + "description": "List Amplitude Experiment feature flags for the project. Supports cursor-based pagination — pass the response's nextCursor value back as cursor to get the next page — and optional filters. CONFIRMED (live-tested): this org has Feature Experimentation entitlement — a real call re…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_list_holdout_groups", + "description": "List all holdout groups in the project. A holdout group excludes a fixed percentage of users from every experiment associated with it, so you can measure the overall product impact of those experiments against a clean control population. UNCONFIRMED (doc gap): Amplitude's own AP…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_list_mutex_groups", + "description": "List all mutex groups in the project. A mutex group defines a set of \"slots\" so that the experiments, flags, holdouts, and/or individuals assigned to the same slot never run simultaneously for the same user — useful for guaranteeing exclusivity between conflicting tests. UNCONFI…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_remove_all_experiment_variant_users", + "description": "Remove ALL users and devices from an experiment variant's inclusion list in a single call — this clears the entire list, not one entry. To remove only one specific user, use the single-user removal tool (DELETE .../users/{userIndex}) instead. To remove a specific named set of us…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_remove_all_flag_variant_users", + "description": "Remove ALL users from a flag variant's individual-inclusion list in a single call. This clears the ENTIRE user list for that variant unconditionally — every individually-included user is removed, not just one. There is no way to keep a subset with this endpoint. To remove only o…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_remove_experiment_variant_user", + "description": "Remove one specific user or device (by its zero-indexed position) from an experiment variant's inclusion list. Per Amplitude's docs, the userIndex value should come from the 'Get variant inclusions' endpoint's response (GET /api/1/experiments/{id}/variants/{variantKey}/users) — …" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_remove_flag_variant_user", + "description": "Remove one specific user from a flag variant's individual-inclusion list, identified by the user's zero-indexed position in that list — not by user ID. Per Amplitude's official docs (confirmed via direct doc fetch), userIndex is documented as type string (e.g. \"0\", \"1\", \"2\"); ge…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_update_deployment", + "description": "Edit an existing deployment's label, or archive/restore it. Only the provided fields are changed; omitted fields remain unchanged. CONFIRMED from Amplitude's docs: a successful call returns 200 OK with the literal text \"OK\" as the body, not a JSON object — this tool treats the r…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_update_experiment", + "description": "Update an existing Amplitude experiment — partial update; only provided fields change (except end_date, see below). Editable fields: name, description, bucketing_key, bucketing_salt, bucketing_unit, evaluation_mode (remote|local), rollout_percentage (0-100), target_segments (JSO…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_update_experiment_variant", + "description": "Edit an existing experiment variant — rename its key, or update name, description, payload, or rolloutWeight. All body fields are optional; omit a field to leave its current value unchanged. CONFIRMED FROM RAW PAGE SOURCE (not just visible rendered text): this endpoint is PATCH,…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_update_flag", + "description": "Edit an existing Amplitude Experiment feature flag — partial update, only provided fields change.\n\nCONFIRMED editable: name, description, bucketingKey, bucketingSalt, bucketingUnit, evaluationMode, rolloutPercentage, targetSegments, enabled, archive, tags. CONFIRMED NOT editable…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_update_flag_variant", + "description": "Edit an existing flag variant — partial update; a provided \\`payload\\` fully replaces the existing one rather than merging.\n\nAmplitude's docs are self-contradictory on the HTTP method: the endpoint heading says POST, but the runnable curl example uses PATCH against the same URL.…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_update_holdout_group", + "description": "Edit an existing holdout group — partial update, only provided fields change. \\`individualInclusion\\`/\\`individualExclusion\\` are named from the holdout's own point of view — inclusion in the holdout means exclusion from experiments, and vice versa. UNCONFIRMED whether array fie…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_update_mutex_group", + "description": "Edit an existing mutex group's name, description, or archived state. Only the provided fields are changed; omitted fields remain unchanged. This endpoint does NOT edit slots — to change which experiments, holdouts, or individuals occupy a slot, use amplitudeexperimentmanagement_…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_update_mutex_group_slot", + "description": "Edit which experiments, holdouts, and/or individuals occupy one slot in a mutex group, without touching the slot's percentage or any other slot. Complex fields are JSON-encoded strings, not native arrays. UNCONFIRMED whether omitting one of experiments/holdouts/individuals leave…" + }, { "slug": "anakinmcp", "name": "anakinmcp_agentic_search", @@ -18208,16 +18783,66 @@ "name": "digitsmcp_select_business", "description": "Select a business to work with. After calling this tool, use the returned business ID as business_id in subsequent tool calls." }, + { + "slug": "discord", + "name": "discord_consume_entitlement", + "description": "For one-time purchase consumable SKUs, mark a given entitlement for the user as consumed. The entitlement will have consumed: true when listed afterward. This action cannot be undone. Returns 204 No Content on success. Per Discord's official OpenAPI spec, this endpoint also acce…" + }, + { + "slug": "discord", + "name": "discord_create_lobby_channel_invite_for_self", + "description": "Create a single-use guild invite to a lobby's linked channel, targeted at the calling user. The lobby must have a linked channel and the caller must be a member of the lobby. The invite expires after one hour. Uses a Bearer token with the sdk.social_layer scope. Per Discord's of…" + }, + { + "slug": "discord", + "name": "discord_create_or_join_lobby", + "description": "Create a new lobby identified by a secret, or join the calling user to the existing lobby with that secret if one already exists. Updates lobby metadata and the calling member's metadata on join. Uses a Bearer token with the sdk.social_layer scope. Per Discord's official OpenAPI…" + }, + { + "slug": "discord", + "name": "discord_delete_current_user_application_role_connection", + "description": "Deletes the application role connection for the current user and the given application. Requires an OAuth2 access token with the role_connections.write scope for the application specified in the path." + }, + { + "slug": "discord", + "name": "discord_delete_test_entitlement", + "description": "Delete a currently-active test entitlement. Discord will act as though that user or guild no longer has entitlement to your premium offering. Returns 204 No Content on success. Per Discord's official OpenAPI spec, this endpoint also accepts an OAuth2 Bearer token with the \\`appl…" + }, + { + "slug": "discord", + "name": "discord_edit_application_command_permissions", + "description": "Edit the permissions for a specific application command in a guild. Requires OAuth2 bearer token with applications.commands.permissions.update scope. Returns a guild application command permissions object." + }, + { + "slug": "discord", + "name": "discord_get_application_command_permissions", + "description": "Fetch permissions for a specific application command in a guild. Returns a guild application command permissions object." + }, { "slug": "discord", "name": "discord_get_current_user_application_entitlements", "description": "Retrieves entitlements for the current user for a given application. Use when you need to check what premium offerings or subscriptions the authenticated user has access to. Requires the applications.entitlements OAuth2 scope." }, + { + "slug": "discord", + "name": "discord_get_current_user_application_role_connection", + "description": "Returns the application role connection for the current user and the given application. Requires an OAuth2 access token with the role_connections.write scope for the application specified in the path." + }, + { + "slug": "discord", + "name": "discord_get_entitlement", + "description": "Retrieve a single entitlement for an application by ID. Use to check whether a specific entitlement is active, its type, and its expiration window. Per Discord's official OpenAPI spec, this endpoint also accepts an OAuth2 Bearer token with the \\`applications.entitlements\\` scope…" + }, { "slug": "discord", "name": "discord_get_gateway", "description": "Retrieves a valid WebSocket (wss) URL for establishing a Gateway connection to Discord. Use when you need to connect to the Discord Gateway for real-time events. No authentication required." }, + { + "slug": "discord", + "name": "discord_get_guild_application_command_permissions", + "description": "Fetch permissions for all commands in a guild. Returns an array of guild application command permissions objects. Per Discord's official OpenAPI spec, this endpoint also accepts an OAuth2 Bearer token with the \\`applications.commands.permissions.update\\` scope (in addition to Bo…" + }, { "slug": "discord", "name": "discord_get_guild_template", @@ -18236,7 +18861,12 @@ { "slug": "discord", "name": "discord_get_invite_deprecated", - "description": "DEPRECATED: Use discord_resolve_invite instead. Retrieves information about a specific invite code including guild and channel details. This endpoint is deprecated — prefer the Resolve Invite tool for new integrations." + "description": "Retrieves information about a specific invite code, including guild and channel details. Use discord_resolve_invite instead, which supports additional query parameters such as guild_scheduled_event_id." + }, + { + "slug": "discord", + "name": "discord_get_lobby_messages", + "description": "Retrieve the most recent messages in a Discord lobby. The calling user must be a member of the lobby. Uses a Bearer token with the sdk.social_layer scope. Per Discord's official OpenAPI spec, this endpoint also accepts a Bot Token (in addition to OAuth2) — use this tool for user…" }, { "slug": "discord", @@ -18263,16 +18893,41 @@ "name": "discord_get_public_keys", "description": "Retrieves Discord OAuth2 public keys (JWKS). Use when you need to verify OAuth2 tokens or access public keys for cryptographic operations such as signature verification." }, + { + "slug": "discord", + "name": "discord_get_sku_subscription", + "description": "Retrieve a single subscription for a SKU by its ID. Returns a subscription object with its status, current billing period, and the entitlements it grants. Per Discord's official OpenAPI spec, this endpoint also accepts an OAuth2 Bearer token (in addition to Bot Token) — use this…" + }, { "slug": "discord", "name": "discord_get_user", "description": "Retrieve information about a Discord user. With OAuth Bearer token, use '@me' as user_id to return the authenticated user's information. With a Bot token, you can query any user by their ID. Returns username, avatar, discriminator, locale, premium status, and email (if email sco…" }, + { + "slug": "discord", + "name": "discord_leave_lobby", + "description": "Remove the calling user from the specified Discord lobby. Safe to call even if the user is no longer a member, but fails if the lobby does not exist. Uses a Bearer token for authorization. Per Discord's official OpenAPI spec, this endpoint also accepts a Bot Token (in addition t…" + }, + { + "slug": "discord", + "name": "discord_link_channel_to_lobby", + "description": "Link an existing guild text channel to a Discord lobby, or unlink any currently linked channel by omitting channel_id. Uses a Bearer token for authorization; the caller must be a lobby member with the CanLinkLobby lobby member flag. Per Discord's official OpenAPI spec, this endp…" + }, + { + "slug": "discord", + "name": "discord_list_guild_channels", + "description": "Retrieve all channels in a Discord guild (server). Returns a list of channel objects including text channels, voice channels, categories, and threads. Per Discord's official OpenAPI spec, this endpoint also accepts a plain OAuth2 Bearer token (no specific scope required beyond a…" + }, { "slug": "discord", "name": "discord_list_my_guilds", "description": "Lists the current user's guilds, returning partial data (id, name, icon, owner, permissions, features) for each. Primarily used for displaying server lists or verifying guild memberships. Requires the 'guilds' OAuth2 scope." }, + { + "slug": "discord", + "name": "discord_list_sku_subscriptions", + "description": "Retrieve all subscriptions containing a given SKU, filtered by user. Returns a list of subscription objects representing recurring payments for that SKU. Per Discord's official OpenAPI spec, this endpoint also accepts an OAuth2 Bearer token (in addition to Bot Token) — use this …" + }, { "slug": "discord", "name": "discord_list_sticker_packs", @@ -18288,6 +18943,1041 @@ "name": "discord_retrieve_user_connections", "description": "Retrieves a list of the authenticated user's connected third-party accounts on Discord, such as Twitch, YouTube, GitHub, Steam, and others. Requires the 'connections' OAuth2 scope." }, + { + "slug": "discord", + "name": "discord_send_lobby_message", + "description": "Send a message to a Discord lobby. The calling user must be a member of the lobby. Uses a Bearer token with the sdk.social_layer scope. Per Discord's official OpenAPI spec, this endpoint also accepts a Bot Token (in addition to OAuth2) — use this tool for user-authorized OAuth c…" + }, + { + "slug": "discord", + "name": "discord_update_current_user_application_role_connection", + "description": "Updates and returns the application role connection for the current user and the given application. Requires an OAuth2 access token with the role_connections.write scope for the application specified in the path." + }, + { + "slug": "discordbot", + "name": "discordbot_add_guild_member", + "description": "Add a user to a guild using their OAuth2 access token with the guilds.join scope. Returns 201 if the user was added, or 204 if already a member." + }, + { + "slug": "discordbot", + "name": "discordbot_add_guild_member_role", + "description": "Add a role to a guild member. Requires MANAGE_ROLES permission. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_add_lobby_member", + "description": "Add the specified user to a Discord lobby. If the user is already a member, updates their metadata and flags instead. Returns the lobby member object." + }, + { + "slug": "discordbot", + "name": "discordbot_add_thread_member", + "description": "Add another user to a thread. Requires the thread to not be archived. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_begin_guild_prune", + "description": "Begin a prune operation to kick inactive members. Requires KICK_MEMBERS permission. Returns a pruned object with the count of kicked members (or null if compute_prune_count is false)." + }, + { + "slug": "discordbot", + "name": "discordbot_bulk_delete_messages", + "description": "Delete multiple messages in a Discord channel in a single request (2-100 messages). Messages older than 2 weeks cannot be deleted this way. Requires MANAGE_MESSAGES permission." + }, + { + "slug": "discordbot", + "name": "discordbot_bulk_guild_ban", + "description": "Ban up to 200 users from a guild and optionally delete their recent messages. Requires both BAN_MEMBERS and MANAGE_GUILD permissions. Returns object with banned_users and failed_users arrays." + }, + { + "slug": "discordbot", + "name": "discordbot_bulk_overwrite_global_application_commands", + "description": "Bulk overwrite all global application commands. Takes a full list of commands to replace existing ones. Any commands not included will be deleted. Returns an array of application command objects." + }, + { + "slug": "discordbot", + "name": "discordbot_bulk_overwrite_guild_application_commands", + "description": "Bulk overwrite all application commands registered in a guild. Commands not included will be deleted. Returns an array of application command objects." + }, + { + "slug": "discordbot", + "name": "discordbot_bulk_update_lobby_members", + "description": "Add, update, or remove up to 25 members from a Discord lobby in a single request. Members with remove_member false (the default) are upserted; members with remove_member true are removed. Users unknown to Discord return a 404 error. Users that fail permission checks, or that alr…" + }, + { + "slug": "discordbot", + "name": "discordbot_consume_entitlement", + "description": "For one-time purchase consumable SKUs, mark a given entitlement for the user as consumed. The entitlement will have consumed: true when listed afterward. This action cannot be undone. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_create_application_emoji", + "description": "Create a new emoji owned by a Discord application (app emoji). Returns the new emoji object." + }, + { + "slug": "discordbot", + "name": "discordbot_create_auto_moderation_rule", + "description": "Create a new Auto Moderation rule for a guild. Requires the MANAGE_GUILD permission. Fires an Auto Moderation Rule Create Gateway event. Returns the new auto moderation rule object on success." + }, + { + "slug": "discordbot", + "name": "discordbot_create_channel_invite", + "description": "Create a new invite for a Discord channel. Requires CREATE_INSTANT_INVITE permission. Returns an invite object." + }, + { + "slug": "discordbot", + "name": "discordbot_create_dm", + "description": "Create a new DM channel with a user. Returns a DM channel object. If a DM channel already exists with the user, it is returned." + }, + { + "slug": "discordbot", + "name": "discordbot_create_global_application_command", + "description": "Create a new global application command. If a command with the same name already exists, it will be overwritten. Returns the created command object." + }, + { + "slug": "discordbot", + "name": "discordbot_create_group_dm", + "description": "Create a new group DM channel with multiple users using their OAuth2 access tokens (granted the gdm.join scope). Returns a DM channel object. This endpoint was intended to be used with the now-deprecated GameBridge SDK and is limited to 10 active group DMs. Fires a Channel Creat…" + }, + { + "slug": "discordbot", + "name": "discordbot_create_guild_application_command", + "description": "Create a new application command for a specific guild. Guild commands are only available in the guild they are created in. Returns the created command object." + }, + { + "slug": "discordbot", + "name": "discordbot_create_guild_ban", + "description": "Ban a user from a Discord guild. Requires BAN_MEMBERS permission. Optionally delete recent messages from the banned user." + }, + { + "slug": "discordbot", + "name": "discordbot_create_guild_channel", + "description": "Create a new channel in a guild. Requires MANAGE_CHANNELS permission. Returns the new channel object. Each permission_overwrites entry may specify 'allow_names'/'deny_names' (arrays of named permission flags) instead of raw 'allow'/'deny' integers — the correct bitfield is compu…" + }, + { + "slug": "discordbot", + "name": "discordbot_create_guild_emoji", + "description": "Create a new emoji for a guild. Requires CREATE_GUILD_EXPRESSIONS permission. Returns the new emoji object." + }, + { + "slug": "discordbot", + "name": "discordbot_create_guild_role", + "description": "Create a new role for a guild. Requires MANAGE_ROLES permission. Returns the new role object. Full permission flag reference (name=decimal value, OR multiple together): CREATE_INSTANT_INVITE=1, KICK_MEMBERS=2, BAN_MEMBERS=4, ADMINISTRATOR=8, MANAGE_CHANNELS=16, MANAGE_GUILD=32, …" + }, + { + "slug": "discordbot", + "name": "discordbot_create_guild_scheduled_event", + "description": "Create a new scheduled event in a Discord guild. Entity type determines the event location: 1=STAGE_INSTANCE, 2=VOICE (requires channel_id), 3=EXTERNAL (requires entity_metadata with location and scheduled_end_time)." + }, + { + "slug": "discordbot", + "name": "discordbot_create_guild_soundboard_sound", + "description": "Create a new soundboard sound for the guild. Requires the CREATE_GUILD_EXPRESSIONS permission. Sounds have a max file size of 512kb and a max duration of 5.2 seconds. Fires a Guild Soundboard Sound Create Gateway event. Returns the new soundboard sound object on success." + }, + { + "slug": "discordbot", + "name": "discordbot_create_guild_template", + "description": "Create a template from a guild's current state. Requires the MANAGE_GUILD permission. Returns the created guild template object on success." + }, + { + "slug": "discordbot", + "name": "discordbot_create_interaction_response", + "description": "Respond to an interaction from Discord. Must be called within 3 seconds of receiving the interaction. Type determines the response kind: 1=PONG, 4=CHANNEL_MESSAGE_WITH_SOURCE, 5=DEFERRED_CHANNEL_MESSAGE_WITH_SOURCE, 6=DEFERRED_UPDATE_MESSAGE, 7=UPDATE_MESSAGE, 8=APPLICATION_COMM…" + }, + { + "slug": "discordbot", + "name": "discordbot_create_lobby", + "description": "Create a new Discord lobby for matchmaking, optionally adding members to it. Discord Social SDK clients cannot join or leave a lobby created via this API. Returns a lobby object." + }, + { + "slug": "discordbot", + "name": "discordbot_create_lobby_channel_invite_for_self", + "description": "Create a single-use guild invite to a lobby's linked channel, targeted at the calling user. The lobby must have a linked channel and the caller must be a member of the lobby. The invite expires after one hour. Returns a lobby invite object." + }, + { + "slug": "discordbot", + "name": "discordbot_create_lobby_channel_invite_for_user", + "description": "Create a single-use guild invite to a lobby's linked channel on behalf of an application, targeted at the specified user. The lobby must have a linked channel. The invite expires after one hour. Uses a Bot token for authorization. Returns a lobby invite object." + }, + { + "slug": "discordbot", + "name": "discordbot_create_message", + "description": "Send a message to a Discord channel. At least one of content, embeds, sticker_ids, or components must be provided. Supports rich embeds, message references for replies, and components." + }, + { + "slug": "discordbot", + "name": "discordbot_create_or_join_lobby", + "description": "Create a new lobby identified by a secret, or join the calling user to the existing lobby with that secret if one already exists. Updates lobby metadata and the calling member's metadata on join. Returns a lobby object." + }, + { + "slug": "discordbot", + "name": "discordbot_create_reaction", + "description": "Add a reaction to a message in a Discord channel. The emoji parameter should be URL-encoded (e.g., a Unicode emoji like %F0%9F%94%A5 for 🔥, or name:id for custom emojis)." + }, + { + "slug": "discordbot", + "name": "discordbot_create_stage_instance", + "description": "Create a new Stage instance associated with a Stage channel, making the channel go live. Requires the user to be a moderator of the Stage channel (MANAGE_CHANNELS, MUTE_MEMBERS, and MOVE_MEMBERS permissions). Fires a Stage Instance Create Gateway event. Returns the new Stage ins…" + }, + { + "slug": "discordbot", + "name": "discordbot_create_test_entitlement", + "description": "Create a test entitlement to a given SKU for a given guild or user. Discord will act as though that user or guild has entitlement to your premium offering. After creating a test entitlement, reload your Discord client to see the server or user gain premium access. Returns a part…" + }, + { + "slug": "discordbot", + "name": "discordbot_create_webhook", + "description": "Create a new webhook for a Discord channel. Requires MANAGE_WEBHOOKS permission. Returns the newly created webhook object with its token." + }, + { + "slug": "discordbot", + "name": "discordbot_crosspost_message", + "description": "Crosspost a message in an announcement channel to all following channels. Requires SEND_MESSAGES permission if the current user wrote the message, or MANAGE_MESSAGES if they did not." + }, + { + "slug": "discordbot", + "name": "discordbot_delete_all_reactions", + "description": "Delete all reactions on a message. Requires MANAGE_MESSAGES permission. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_delete_all_reactions_for_emoji", + "description": "Delete all reactions for a specific emoji on a message. Requires MANAGE_MESSAGES permission. Use URL-encoded emoji format. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_delete_application_emoji", + "description": "Delete an emoji owned by a Discord application. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_delete_auto_moderation_rule", + "description": "Delete an Auto Moderation rule for a guild. Requires the MANAGE_GUILD permission. Fires an Auto Moderation Rule Delete Gateway event. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_delete_channel", + "description": "Delete a channel or close a private message. For guild channels, requires MANAGE_CHANNELS permission. Deleting a category does not delete its child channels. Returns the deleted channel object." + }, + { + "slug": "discordbot", + "name": "discordbot_delete_channel_invite", + "description": "Delete an invite by its code. Requires MANAGE_CHANNELS permission for guild channel invites or MANAGE_GUILD. Returns the deleted invite object." + }, + { + "slug": "discordbot", + "name": "discordbot_delete_channel_permission", + "description": "Delete a channel permission overwrite for a user or role in a channel. Requires MANAGE_ROLES permission. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_delete_global_application_command", + "description": "Delete a global application command. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_delete_guild_application_command", + "description": "Delete a guild application command. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_delete_guild_emoji", + "description": "Delete a guild emoji. Requires MANAGE_GUILD_EXPRESSIONS permission. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_delete_guild_integration", + "description": "Delete an attached integration for a guild. Deletes any associated webhooks and kicks the associated bot if there is one. Requires MANAGE_GUILD permission. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_delete_guild_invite", + "description": "Delete an invite by its code. Requires the MANAGE_CHANNELS permission on the channel this invite belongs to, or MANAGE_GUILD to remove any invite across the guild. Discord's invite-deletion endpoint is not guild-scoped in the URL — the invite code alone identifies it. Returns th…" + }, + { + "slug": "discordbot", + "name": "discordbot_delete_guild_role", + "description": "Delete a guild role. Requires MANAGE_ROLES permission. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_delete_guild_scheduled_event", + "description": "Delete a guild scheduled event. Requires MANAGE_EVENTS permission. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_delete_guild_soundboard_sound", + "description": "Delete the given guild soundboard sound. For sounds created by the current user, requires either the CREATE_GUILD_EXPRESSIONS or MANAGE_GUILD_EXPRESSIONS permission. For other sounds, requires the MANAGE_GUILD_EXPRESSIONS permission. Fires a Guild Soundboard Sound Delete Gateway…" + }, + { + "slug": "discordbot", + "name": "discordbot_delete_guild_sticker", + "description": "Delete a guild sticker. Requires MANAGE_GUILD_EXPRESSIONS permission. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_delete_guild_template", + "description": "Delete a guild template. Requires the MANAGE_GUILD permission. Returns the deleted guild template object on success." + }, + { + "slug": "discordbot", + "name": "discordbot_delete_lobby", + "description": "Delete a Discord lobby if it exists. Safe to call even if the lobby is already deleted. Returns nothing." + }, + { + "slug": "discordbot", + "name": "discordbot_delete_message", + "description": "Permanently delete a message from a Discord channel. This action is irreversible. Requires MANAGE_MESSAGES permission for messages sent by others." + }, + { + "slug": "discordbot", + "name": "discordbot_delete_original_interaction_response", + "description": "Delete the initial response to an interaction. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_delete_own_reaction", + "description": "Remove the current user's own reaction from a Discord message. The emoji parameter should be URL-encoded." + }, + { + "slug": "discordbot", + "name": "discordbot_delete_stage_instance", + "description": "Delete the Stage instance for a Stage channel, ending the live Stage. Requires the user to be a moderator of the Stage channel (MANAGE_CHANNELS, MUTE_MEMBERS, and MOVE_MEMBERS permissions). Fires a Stage Instance Delete Gateway event. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_delete_test_entitlement", + "description": "Delete a currently-active test entitlement. Discord will act as though that user or guild no longer has entitlement to your premium offering. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_delete_user_reaction", + "description": "Delete a reaction made by a specific user on a message. Requires MANAGE_MESSAGES permission. Use URL-encoded emoji format (e.g., %F0%9F%94%A5 for fire emoji, or name:id for custom emoji)." + }, + { + "slug": "discordbot", + "name": "discordbot_delete_webhook", + "description": "Permanently delete a Discord webhook. Requires MANAGE_WEBHOOKS permission. This action is irreversible." + }, + { + "slug": "discordbot", + "name": "discordbot_delete_webhook_message", + "description": "Delete a previously sent webhook message. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_delete_webhook_with_token", + "description": "Delete a webhook using its token instead of OAuth authentication. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_edit_channel_permissions", + "description": "Edit the channel permission overwrites for a user or role in a channel. Only usable for guild channels. Requires MANAGE_ROLES permission. Returns 204 No Content on success. Full permission flag reference (name=decimal value, OR multiple together): CREATE_INSTANT_INVITE=1, KICK_M…" + }, + { + "slug": "discordbot", + "name": "discordbot_edit_current_application", + "description": "Edit properties of the app associated with the requesting bot user. Only properties that are passed are updated. Returns the updated application object on success." + }, + { + "slug": "discordbot", + "name": "discordbot_edit_global_application_command", + "description": "Edit a global application command. Returns the updated command object." + }, + { + "slug": "discordbot", + "name": "discordbot_edit_guild_application_command", + "description": "Edit a guild application command. Returns the updated command object." + }, + { + "slug": "discordbot", + "name": "discordbot_edit_message", + "description": "Edit a previously sent message in a Discord channel. Only the author of the message can edit it. Supports updating content, embeds, flags, allowed mentions, components, and attachments." + }, + { + "slug": "discordbot", + "name": "discordbot_edit_original_interaction_response", + "description": "Edit the initial response to an interaction. Returns the updated message object." + }, + { + "slug": "discordbot", + "name": "discordbot_edit_webhook_message", + "description": "Edit a previously sent webhook message. Returns the updated message object." + }, + { + "slug": "discordbot", + "name": "discordbot_end_poll", + "description": "Immediately end an active poll in a Discord message. You cannot end polls created by other users." + }, + { + "slug": "discordbot", + "name": "discordbot_execute_github_compatible_webhook", + "description": "Send a GitHub webhook event payload to a Discord webhook, for use as the Payload URL when configuring a GitHub repository webhook. Supports the commit_comment, create, delete, fork, issue_comment, issues, member, public, pull_request, pull_request_review, pull_request_review_com…" + }, + { + "slug": "discordbot", + "name": "discordbot_execute_slack_compatible_webhook", + "description": "Send a message to a Discord webhook using a Slack-compatible payload format, so tools that only speak Slack's incoming webhook format can post into Discord. Discord does not support Slack's channel, icon_emoji, mrkdwn, or mrkdwn_in properties." + }, + { + "slug": "discordbot", + "name": "discordbot_execute_webhook", + "description": "Send a message via a Discord webhook. Supports custom username, avatar, embeds, and components. File attachments (multipart/form-data) are not supported by this tool. Use the wait query parameter to receive the created message object in the response." + }, + { + "slug": "discordbot", + "name": "discordbot_follow_announcement_channel", + "description": "Follow an announcement channel to send messages to a target channel. Requires MANAGE_WEBHOOKS permission in the target channel. Returns a followed channel object." + }, + { + "slug": "discordbot", + "name": "discordbot_get_answer_voters", + "description": "Retrieve a list of users who voted for a specific answer in a Discord poll." + }, + { + "slug": "discordbot", + "name": "discordbot_get_application_activity_instance", + "description": "Retrieve a serialized activity instance for an application, if it exists. Useful for preventing unwanted activity sessions." + }, + { + "slug": "discordbot", + "name": "discordbot_get_application_emoji", + "description": "Retrieve a specific emoji owned by a Discord application by its emoji ID." + }, + { + "slug": "discordbot", + "name": "discordbot_get_application_role_connection_metadata", + "description": "Fetch the list of application role connection metadata records configured for an application. Returns an array of application role connection metadata objects, each describing a comparison type, dictionary key, name, and description used to verify a user's role connection." + }, + { + "slug": "discordbot", + "name": "discordbot_get_auto_moderation_rule", + "description": "Get a single Auto Moderation rule for a guild by its ID. Requires the MANAGE_GUILD permission. Returns an auto moderation rule object." + }, + { + "slug": "discordbot", + "name": "discordbot_get_channel", + "description": "Retrieve a Discord channel by its ID. Returns channel information including type, name, topic, permissions, and other metadata." + }, + { + "slug": "discordbot", + "name": "discordbot_get_channel_invites", + "description": "Retrieve a list of invites for a Discord channel. Requires MANAGE_CHANNELS permission. Returns invite objects with metadata." + }, + { + "slug": "discordbot", + "name": "discordbot_get_channel_message", + "description": "Retrieve a specific message from a Discord channel by its message ID." + }, + { + "slug": "discordbot", + "name": "discordbot_get_channel_webhooks", + "description": "Retrieve all webhooks for a Discord channel. Requires MANAGE_WEBHOOKS permission." + }, + { + "slug": "discordbot", + "name": "discordbot_get_current_application", + "description": "Retrieve the full application object associated with the requesting bot user, including installation settings, integration type configuration, and webhook event configuration." + }, + { + "slug": "discordbot", + "name": "discordbot_get_current_bot_application", + "description": "Retrieve the bot's own application object, including its public Client ID, name, icon, and description. Per Discord's official OpenAPI spec, this endpoint is Bot Token only." + }, + { + "slug": "discordbot", + "name": "discordbot_get_current_user_voice_state", + "description": "Retrieve the current user's (the bot's) voice state in a guild, including the connected voice channel, mute and deafen status, and stage speaking request timestamp." + }, + { + "slug": "discordbot", + "name": "discordbot_get_entitlement", + "description": "Retrieve a single entitlement for an application by ID. Use to check whether a specific entitlement is active, its type, and its expiration window." + }, + { + "slug": "discordbot", + "name": "discordbot_get_global_application_command", + "description": "Fetch a specific global application command. Returns the application command object." + }, + { + "slug": "discordbot", + "name": "discordbot_get_global_application_commands", + "description": "Fetch all global commands for an application. Returns an array of application command objects." + }, + { + "slug": "discordbot", + "name": "discordbot_get_guild", + "description": "Retrieve a Discord guild (server) by its ID. Optionally include approximate member and presence counts." + }, + { + "slug": "discordbot", + "name": "discordbot_get_guild_application_command", + "description": "Fetch a specific application command registered in a guild. Returns the application command object." + }, + { + "slug": "discordbot", + "name": "discordbot_get_guild_application_command_permissions", + "description": "Fetch permissions for all commands in a guild. Returns an array of guild application command permissions objects." + }, + { + "slug": "discordbot", + "name": "discordbot_get_guild_application_commands", + "description": "Fetch all application commands registered in a specific guild. Returns an array of application command objects." + }, + { + "slug": "discordbot", + "name": "discordbot_get_guild_audit_log", + "description": "Retrieve the audit log for a Discord guild. Returns a list of audit log entries with details about administrative actions. Requires VIEW_AUDIT_LOG permission." + }, + { + "slug": "discordbot", + "name": "discordbot_get_guild_ban", + "description": "Retrieve the ban record for a specific user in a Discord guild. Requires BAN_MEMBERS permission." + }, + { + "slug": "discordbot", + "name": "discordbot_get_guild_bans", + "description": "Retrieve a list of ban objects for users banned from a Discord guild. Requires BAN_MEMBERS permission. Supports pagination via before and after." + }, + { + "slug": "discordbot", + "name": "discordbot_get_guild_emoji", + "description": "Retrieve a specific custom emoji from a Discord guild by its emoji ID." + }, + { + "slug": "discordbot", + "name": "discordbot_get_guild_integrations", + "description": "Retrieve a list of integration objects for a Discord guild. Requires MANAGE_GUILD permission. Returns a maximum of 50 integrations." + }, + { + "slug": "discordbot", + "name": "discordbot_get_guild_invites", + "description": "Retrieve a list of all active invites for a Discord guild. Requires MANAGE_GUILD permission. Returns invite objects with metadata." + }, + { + "slug": "discordbot", + "name": "discordbot_get_guild_member", + "description": "Retrieve a specific member of a Discord guild by their user ID. Returns the guild member object including roles, nickname, and join date." + }, + { + "slug": "discordbot", + "name": "discordbot_get_guild_onboarding", + "description": "Get the onboarding configuration for a guild. Returns the guild onboarding object." + }, + { + "slug": "discordbot", + "name": "discordbot_get_guild_preview", + "description": "Retrieve a preview of a Discord guild. For public guilds this is accessible without being a member. Returns guild name, description, icon, emojis, stickers, and approximate counts." + }, + { + "slug": "discordbot", + "name": "discordbot_get_guild_prune_count", + "description": "Get the number of members that would be removed by a prune operation. Requires KICK_MEMBERS permission." + }, + { + "slug": "discordbot", + "name": "discordbot_get_guild_role", + "description": "Retrieve a specific role object from a Discord guild by its role ID." + }, + { + "slug": "discordbot", + "name": "discordbot_get_guild_role_member_counts", + "description": "Retrieve a map of role IDs to the number of guild members with that role. Does not include the @everyone role." + }, + { + "slug": "discordbot", + "name": "discordbot_get_guild_scheduled_event", + "description": "Retrieve a specific scheduled event in a Discord guild by its event ID." + }, + { + "slug": "discordbot", + "name": "discordbot_get_guild_scheduled_event_users", + "description": "Get a list of users subscribed to a guild scheduled event. Returns a list of guild scheduled event user objects." + }, + { + "slug": "discordbot", + "name": "discordbot_get_guild_soundboard_sound", + "description": "Retrieve a soundboard sound object for the given sound id in a guild. Includes the user field if the bot has the CREATE_GUILD_EXPRESSIONS or MANAGE_GUILD_EXPRESSIONS permission." + }, + { + "slug": "discordbot", + "name": "discordbot_get_guild_sticker", + "description": "Retrieve a specific custom sticker from a Discord guild by its sticker ID." + }, + { + "slug": "discordbot", + "name": "discordbot_get_guild_vanity_url", + "description": "Get the vanity URL for a guild. Requires MANAGE_GUILD permission. The guild must have the VANITY_URL feature enabled. Returns a partial invite object with code and uses." + }, + { + "slug": "discordbot", + "name": "discordbot_get_guild_voice_regions", + "description": "Get a list of voice regions available for a guild. Returns optimal regions that can be used when updating a guild or voice channel's region." + }, + { + "slug": "discordbot", + "name": "discordbot_get_guild_webhooks", + "description": "Retrieve all webhooks for a Discord guild. Requires MANAGE_WEBHOOKS permission." + }, + { + "slug": "discordbot", + "name": "discordbot_get_guild_welcome_screen", + "description": "Retrieve the welcome screen for a Discord guild. The welcome screen is shown to new members when they join." + }, + { + "slug": "discordbot", + "name": "discordbot_get_guild_widget_settings", + "description": "Get the widget settings for a guild. Requires MANAGE_GUILD permission. Returns the guild widget settings object." + }, + { + "slug": "discordbot", + "name": "discordbot_get_invite_target_users", + "description": "Get the users allowed to see and accept an invite. Response is a CSV file with the header user_id and each user ID from the file originally passed to invite create, one per line. Requires the caller to be the inviter, or have MANAGE_GUILD permission, or have VIEW_AUDIT_LOG permi…" + }, + { + "slug": "discordbot", + "name": "discordbot_get_invite_target_users_job_status", + "description": "Check the status of the asynchronous job that processes target users from a CSV when creating or updating an invite. Requires the caller to be the inviter, or have MANAGE_GUILD permission, or have VIEW_AUDIT_LOG permission. Status values: 0=UNSPECIFIED, 1=PROCESSING, 2=COMPLETED…" + }, + { + "slug": "discordbot", + "name": "discordbot_get_lobby", + "description": "Retrieve a Discord lobby object for the specified lobby id, if it exists." + }, + { + "slug": "discordbot", + "name": "discordbot_get_lobby_messages", + "description": "Retrieve the most recent messages in a Discord lobby. The calling user must be a member of the lobby. Returns an array of lobby message objects." + }, + { + "slug": "discordbot", + "name": "discordbot_get_original_interaction_response", + "description": "Get the initial response to an interaction. Returns the message object." + }, + { + "slug": "discordbot", + "name": "discordbot_get_pinned_messages", + "description": "Retrieve pinned messages in a Discord channel using Discord's current paginated pins endpoint (introduced June 2025, replacing the deprecated /channels/{channel.id}/pins). Returns pinned messages ordered most-recently-pinned first." + }, + { + "slug": "discordbot", + "name": "discordbot_get_reactions", + "description": "Retrieve a list of users who reacted to a Discord message with a specific emoji." + }, + { + "slug": "discordbot", + "name": "discordbot_get_sku_subscription", + "description": "Retrieve a single subscription for a SKU by its ID. Returns a subscription object with its status, current billing period, and the entitlements it grants." + }, + { + "slug": "discordbot", + "name": "discordbot_get_stage_instance", + "description": "Retrieve the Stage instance associated with a Stage channel, if one exists (the channel is currently live)." + }, + { + "slug": "discordbot", + "name": "discordbot_get_sticker", + "description": "Retrieve a Discord sticker by its ID. Returns sticker information including name, description, format type, and pack details." + }, + { + "slug": "discordbot", + "name": "discordbot_get_sticker_pack", + "description": "Retrieve a Discord standard sticker pack by its ID. Returns the sticker pack including its name, description, contained stickers, cover sticker, and banner asset." + }, + { + "slug": "discordbot", + "name": "discordbot_get_thread_member", + "description": "Get a member of a thread. Returns a thread member object." + }, + { + "slug": "discordbot", + "name": "discordbot_get_user", + "description": "Retrieve information about any Discord user by ID. Pass '@me' as user_id to fetch the bot's own user profile. Returns username, avatar, discriminator, locale, and premium status." + }, + { + "slug": "discordbot", + "name": "discordbot_get_user_voice_state", + "description": "Retrieve the specified user's voice state in a guild, including the connected voice channel, mute and deafen status, and stage speaking request timestamp. If the user is connected to a voice channel, the bot must have permission to connect to that channel." + }, + { + "slug": "discordbot", + "name": "discordbot_get_webhook", + "description": "Retrieve a Discord webhook by its ID. Returns the webhook object including name, channel, guild, and token." + }, + { + "slug": "discordbot", + "name": "discordbot_get_webhook_message", + "description": "Get a previously sent webhook message. Returns the message object." + }, + { + "slug": "discordbot", + "name": "discordbot_get_webhook_with_token", + "description": "Retrieve a Discord webhook using both its ID and token. Does not require bot authentication. Returns the webhook object without the user field." + }, + { + "slug": "discordbot", + "name": "discordbot_group_dm_add_recipient", + "description": "Add a recipient to a Group DM using their OAuth2 access token, which must have been granted the gdm.join scope. Returns 201 if the user was added, or 204 if already a recipient." + }, + { + "slug": "discordbot", + "name": "discordbot_group_dm_remove_recipient", + "description": "Remove a recipient from a Group DM. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_join_thread", + "description": "Add the current user to a thread. Requires the thread to not be archived. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_kick_guild_member", + "description": "Remove (kick) a member from a Discord guild. The user can rejoin via a new invite. Requires KICK_MEMBERS permission." + }, + { + "slug": "discordbot", + "name": "discordbot_leave_guild", + "description": "Remove the bot from a guild it belongs to. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_leave_lobby", + "description": "Remove the calling user from the specified Discord lobby. Safe to call even if the user is no longer a member, but fails if the lobby does not exist. Returns nothing." + }, + { + "slug": "discordbot", + "name": "discordbot_leave_thread", + "description": "Remove the current user from a thread. Requires the thread to not be archived. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_link_channel_to_lobby", + "description": "Link an existing guild text channel to a Discord lobby, or unlink any currently linked channel by omitting channel_id. The caller must be a lobby member with the CanLinkLobby lobby member flag. Returns the updated lobby object." + }, + { + "slug": "discordbot", + "name": "discordbot_list_active_guild_threads", + "description": "List all active threads in a guild, including public and private threads. Returns a list of channel objects and thread member objects for the current user." + }, + { + "slug": "discordbot", + "name": "discordbot_list_application_emojis", + "description": "Retrieve all emojis owned by a Discord application (app emojis). Returns an object containing a list of emoji objects under the items key." + }, + { + "slug": "discordbot", + "name": "discordbot_list_auto_moderation_rules", + "description": "Get a list of all Auto Moderation rules currently configured for a guild. Requires the MANAGE_GUILD permission. Returns a list of auto moderation rule objects." + }, + { + "slug": "discordbot", + "name": "discordbot_list_channel_messages", + "description": "Retrieve a list of messages from a Discord channel. Supports pagination using around, before, and after message IDs with a configurable limit." + }, + { + "slug": "discordbot", + "name": "discordbot_list_default_soundboard_sounds", + "description": "Retrieve an array of default soundboard sound objects that can be used by all users." + }, + { + "slug": "discordbot", + "name": "discordbot_list_guild_channels", + "description": "Retrieve all channels in a Discord guild (server). Returns a list of channel objects including text channels, voice channels, categories, and threads." + }, + { + "slug": "discordbot", + "name": "discordbot_list_guild_emojis", + "description": "Retrieve all custom emojis for a Discord guild. Returns a list of emoji objects." + }, + { + "slug": "discordbot", + "name": "discordbot_list_guild_members", + "description": "Retrieve a list of members in a Discord guild. Requires the GUILD_MEMBERS privileged intent or appropriate bot permissions. Supports pagination via the after parameter." + }, + { + "slug": "discordbot", + "name": "discordbot_list_guild_roles", + "description": "Retrieve all roles in a Discord guild. Returns a list of role objects including permissions, color, and position." + }, + { + "slug": "discordbot", + "name": "discordbot_list_guild_scheduled_events", + "description": "Retrieve a list of scheduled events for a Discord guild. Optionally include user subscription counts." + }, + { + "slug": "discordbot", + "name": "discordbot_list_guild_soundboard_sounds", + "description": "Retrieve the guild's soundboard sounds. Includes user fields if the bot has the CREATE_GUILD_EXPRESSIONS or MANAGE_GUILD_EXPRESSIONS permission. Returns an object with an items array of soundboard sound objects." + }, + { + "slug": "discordbot", + "name": "discordbot_list_guild_stickers", + "description": "Retrieve all custom stickers for a Discord guild. Returns a list of sticker objects." + }, + { + "slug": "discordbot", + "name": "discordbot_list_guild_templates", + "description": "Retrieve all guild templates for a guild. Requires the MANAGE_GUILD permission. Returns a list of guild template objects." + }, + { + "slug": "discordbot", + "name": "discordbot_list_joined_private_archived_threads", + "description": "List private archived threads in a channel that the current user has joined. Returns threads in descending order of archive timestamp." + }, + { + "slug": "discordbot", + "name": "discordbot_list_private_archived_threads", + "description": "List all private archived threads in a channel. Requires MANAGE_THREADS permission and READ_MESSAGE_HISTORY permission. Returns threads in descending order of archive timestamp." + }, + { + "slug": "discordbot", + "name": "discordbot_list_public_archived_threads", + "description": "List all public archived threads in a channel. Returns threads in descending order of archive timestamp. Requires READ_MESSAGE_HISTORY permission." + }, + { + "slug": "discordbot", + "name": "discordbot_list_sku_subscriptions", + "description": "Retrieve all subscriptions containing a given SKU, filtered by user. Returns a list of subscription objects representing recurring payments for that SKU. With Bot Token auth, user_id is required since the bot has no implicit 'current user' context. Supports cursor-based paginati…" + }, + { + "slug": "discordbot", + "name": "discordbot_list_skus", + "description": "Retrieve all SKUs (stock-keeping units) for a given Discord application. SKUs represent premium offerings, such as subscriptions, that can be made available to the application's users or guilds. Returns an array of SKU objects." + }, + { + "slug": "discordbot", + "name": "discordbot_list_thread_members", + "description": "List all members of a thread. Returns an array of thread member objects. When with_member is true, results are paginated using after and limit." + }, + { + "slug": "discordbot", + "name": "discordbot_list_threads", + "description": "Retrieve archived public threads in a Discord channel. Returns threads in descending order by archive timestamp. Requires READ_MESSAGE_HISTORY permission. Note: Discord has no single endpoint that lists every thread type at once — this tool calls the same public-archived-threads…" + }, + { + "slug": "discordbot", + "name": "discordbot_list_voice_regions", + "description": "Retrieve a list of all available voice regions on Discord. Returns region IDs, names, and whether they are optimal or deprecated." + }, + { + "slug": "discordbot", + "name": "discordbot_modify_application_emoji", + "description": "Modify the name of an emoji owned by a Discord application. Returns the updated emoji object." + }, + { + "slug": "discordbot", + "name": "discordbot_modify_auto_moderation_rule", + "description": "Modify an existing Auto Moderation rule for a guild. Requires the MANAGE_GUILD permission. All parameters are optional. Fires an Auto Moderation Rule Update Gateway event. Returns the updated auto moderation rule object on success." + }, + { + "slug": "discordbot", + "name": "discordbot_modify_channel", + "description": "Modify a channel's settings. Supports text, voice, announcement, stage, and forum channels. Returns the updated channel object. Each permission_overwrites entry may specify 'allow_names'/'deny_names' (arrays of named permission flags) instead of raw 'allow'/'deny' integers — the…" + }, + { + "slug": "discordbot", + "name": "discordbot_modify_current_member", + "description": "Modify the current user's guild member attributes. Returns the updated guild member object." + }, + { + "slug": "discordbot", + "name": "discordbot_modify_current_user", + "description": "Modify the bot's own username, avatar, or banner. Returns the updated user object." + }, + { + "slug": "discordbot", + "name": "discordbot_modify_current_user_nick", + "description": "Deprecated in favor of Modify Current Member. Modifies the nickname of the current user in a guild. Requires CHANGE_NICKNAME permission. Returns a 200 with the nickname on success." + }, + { + "slug": "discordbot", + "name": "discordbot_modify_current_user_voice_state", + "description": "Update the current user's (the bot's) voice state in a stage channel. Returns 204 No Content on success. channel_id must currently point to a stage channel the bot has already joined. MUTE_MEMBERS permission is required to unsuppress; REQUEST_TO_SPEAK permission is required to r…" + }, + { + "slug": "discordbot", + "name": "discordbot_modify_guild", + "description": "Modify a guild's settings. Requires MANAGE_GUILD permission. Returns the updated guild object." + }, + { + "slug": "discordbot", + "name": "discordbot_modify_guild_channel_positions", + "description": "Modify the positions of channels in a guild. Requires MANAGE_CHANNELS permission. Only channels to be modified need to be included. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_modify_guild_emoji", + "description": "Modify a guild emoji. Requires MANAGE_GUILD_EXPRESSIONS permission. Returns the updated emoji object." + }, + { + "slug": "discordbot", + "name": "discordbot_modify_guild_incident_actions", + "description": "Modify the incident actions of a guild, used to temporarily disable invites or direct messages during a raid or spam incident. Requires MANAGE_GUILD permission. Both fields can be enabled for a maximum of 24 hours in the future; supplying null disables the action. Returns the up…" + }, + { + "slug": "discordbot", + "name": "discordbot_modify_guild_member", + "description": "Modify attributes of a guild member. Returns the updated guild member object." + }, + { + "slug": "discordbot", + "name": "discordbot_modify_guild_onboarding", + "description": "Modify the onboarding configuration of a guild. Requires MANAGE_GUILD and MANAGE_ROLES permissions. Onboarding enforces constraints when enabled: at least 7 default channels, at least 5 of which allow sending messages to @everyone. Returns the updated guild onboarding object." + }, + { + "slug": "discordbot", + "name": "discordbot_modify_guild_role", + "description": "Modify a guild role's settings. Requires MANAGE_ROLES permission. Returns the updated role object. Full permission flag reference (name=decimal value, OR multiple together): CREATE_INSTANT_INVITE=1, KICK_MEMBERS=2, BAN_MEMBERS=4, ADMINISTRATOR=8, MANAGE_CHANNELS=16, MANAGE_GUILD…" + }, + { + "slug": "discordbot", + "name": "discordbot_modify_guild_role_positions", + "description": "Modify the positions of roles in a guild. Requires MANAGE_ROLES permission. Returns a list of all guild role objects." + }, + { + "slug": "discordbot", + "name": "discordbot_modify_guild_scheduled_event", + "description": "Modify a guild scheduled event. Requires MANAGE_EVENTS permission. To start or end an event, modify the status field. Returns the modified scheduled event object." + }, + { + "slug": "discordbot", + "name": "discordbot_modify_guild_soundboard_sound", + "description": "Modify the given guild soundboard sound. For sounds created by the current user, requires either the CREATE_GUILD_EXPRESSIONS or MANAGE_GUILD_EXPRESSIONS permission. For other sounds, requires the MANAGE_GUILD_EXPRESSIONS permission. All parameters are optional. Fires a Guild So…" + }, + { + "slug": "discordbot", + "name": "discordbot_modify_guild_sticker", + "description": "Modify a guild sticker's details. Requires MANAGE_GUILD_EXPRESSIONS permission. Returns the updated sticker object." + }, + { + "slug": "discordbot", + "name": "discordbot_modify_guild_template", + "description": "Modify a guild template's metadata. Requires the MANAGE_GUILD permission. Returns the guild template object on success." + }, + { + "slug": "discordbot", + "name": "discordbot_modify_guild_welcome_screen", + "description": "Modify the welcome screen of a Community guild. Requires MANAGE_GUILD permission. Returns the updated welcome screen object." + }, + { + "slug": "discordbot", + "name": "discordbot_modify_guild_widget", + "description": "Modify the widget settings for a guild. Requires MANAGE_GUILD permission. Returns the updated guild widget settings object." + }, + { + "slug": "discordbot", + "name": "discordbot_modify_lobby", + "description": "Modify a Discord lobby with new values, if provided. When members is provided, it replaces the full member list — any current member not included is removed from the lobby. Returns the updated lobby object." + }, + { + "slug": "discordbot", + "name": "discordbot_modify_stage_instance", + "description": "Update fields of an existing Stage instance. Requires the user to be a moderator of the Stage channel (MANAGE_CHANNELS, MUTE_MEMBERS, and MOVE_MEMBERS permissions). Fires a Stage Instance Update Gateway event. Returns the updated Stage instance object." + }, + { + "slug": "discordbot", + "name": "discordbot_modify_user_voice_state", + "description": "Update another user's voice state in a stage channel. Returns 204 No Content on success. channel_id must currently point to a stage channel the user has already joined. Requires the MUTE_MEMBERS permission. When unsuppressed, non-bot users have their request_to_speak_timestamp s…" + }, + { + "slug": "discordbot", + "name": "discordbot_modify_webhook", + "description": "Modify a webhook. Requires MANAGE_WEBHOOKS permission. Returns the updated webhook object." + }, + { + "slug": "discordbot", + "name": "discordbot_modify_webhook_with_token", + "description": "Modify a webhook using its token instead of OAuth authentication. Does not support channel_id field. Returns the updated webhook object (without token)." + }, + { + "slug": "discordbot", + "name": "discordbot_pin_message", + "description": "Pin a message in a Discord channel using Discord's current pins endpoint (introduced June 2025, replacing the deprecated /channels/{channel.id}/pins/{message.id}). Requires PIN_MESSAGES permission. A channel can have up to 50 pinned messages." + }, + { + "slug": "discordbot", + "name": "discordbot_remove_guild_ban", + "description": "Remove a ban for a user in a Discord guild, allowing them to rejoin. Requires BAN_MEMBERS permission." + }, + { + "slug": "discordbot", + "name": "discordbot_remove_guild_member_role", + "description": "Remove a role from a guild member. Requires MANAGE_ROLES permission. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_remove_lobby_member", + "description": "Remove the specified user from a Discord lobby. Safe to call even if the user is no longer a member of the lobby, but fails if the lobby does not exist. Returns nothing." + }, + { + "slug": "discordbot", + "name": "discordbot_remove_thread_member", + "description": "Remove a user from a thread. Requires MANAGE_THREADS permission or that the current user is the creator of the thread. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_search_guild_members", + "description": "Search for guild members in a Discord guild whose username or nickname starts with the given query string." + }, + { + "slug": "discordbot", + "name": "discordbot_search_guild_messages", + "description": "Search for messages matching a query across a Discord guild. Returns matching messages without the reactions key. Requires the READ_MESSAGE_HISTORY permission and access is restricted according to whether the MESSAGE_CONTENT privileged intent is enabled for the application. If t…" + }, + { + "slug": "discordbot", + "name": "discordbot_send_lobby_message", + "description": "Send a message to a Discord lobby. The calling user must be a member of the lobby. If the lobby has a linked channel, the message is also forwarded there; if forwarding fails (for example due to AutoMod), the lobby message is still delivered to other lobby members. Returns the c…" + }, + { + "slug": "discordbot", + "name": "discordbot_send_soundboard_sound", + "description": "Send a soundboard sound to a voice channel the user is connected to. Requires the SPEAK and USE_SOUNDBOARD permissions, and also USE_EXTERNAL_SOUNDS if the sound is from a different guild. The user must be connected to the voice channel with a voice state that has deaf, self_dea…" + }, + { + "slug": "discordbot", + "name": "discordbot_set_voice_channel_status", + "description": "Set a voice channel's status. Requires the SET_VOICE_CHANNEL_STATUS permission, and additionally the MANAGE_CHANNELS permission if the current user is not connected to the voice channel. Returns 204 No Content on success. Fires a Voice Channel Status Update Gateway event." + }, + { + "slug": "discordbot", + "name": "discordbot_start_thread_from_message", + "description": "Create a new thread from an existing message in a channel. The thread is a public thread by default. Requires CREATE_PUBLIC_THREADS permission. Returns the new thread channel object." + }, + { + "slug": "discordbot", + "name": "discordbot_start_thread_in_forum_channel", + "description": "Create a new post (thread) in a forum or media channel, along with its first message. At least one of content, embeds, or sticker_ids must be provided for the message. The current user must have the SEND_MESSAGES permission. Returns the new thread channel object with a nested me…" + }, + { + "slug": "discordbot", + "name": "discordbot_start_thread_without_message", + "description": "Create a new thread that is not attached to an existing message. Type 10=ANNOUNCEMENT_THREAD (in announcement channel), 11=PUBLIC_THREAD, 12=PRIVATE_THREAD. Returns the new thread channel object." + }, + { + "slug": "discordbot", + "name": "discordbot_sync_guild_template", + "description": "Sync a template to the guild's current state. Requires the MANAGE_GUILD permission. Returns the guild template object on success." + }, + { + "slug": "discordbot", + "name": "discordbot_trigger_typing", + "description": "Post a typing indicator to a Discord channel. The typing indicator lasts for 10 seconds or until a message is sent. Useful for indicating that a bot is processing a request." + }, + { + "slug": "discordbot", + "name": "discordbot_unpin_message", + "description": "Unpin a previously pinned message from a Discord channel using Discord's current pins endpoint (introduced June 2025, replacing the deprecated /channels/{channel.id}/pins/{message.id}). Requires PIN_MESSAGES permission." + }, + { + "slug": "discordbot", + "name": "discordbot_update_application_role_connection_metadata", + "description": "Update and return the list of application role connection metadata records for an application. Takes a full list of metadata objects to replace the existing ones; any records not included are removed. An application can have a maximum of 5 metadata records." + }, + { + "slug": "discordbot", + "name": "discordbot_update_lobby_message_moderation_metadata", + "description": "Set the moderation metadata for a lobby message. The metadata is app-scoped and delivered to active game clients via the Social SDK as a realtime message update. Uses a Bot token for authorization. Returns HTTP 204 No Content on success." + }, { "slug": "docsautomatormcp", "name": "docsautomatormcp_cancel_esign_session", @@ -38941,6 +40631,341 @@ "name": "mixmaxmcp_sequences", "description": "Query and inspect Mixmax email sequences. Supports actions: list_sequences, get_sequence, get_sequence_insights, find_contact_in_sequences, get_daily_send_count, validate_sequence." }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_activity_stream", + "description": "Get the raw event stream (activity feed) for one or more specific users over a date range — every event each user did, in order. Useful for inspecting an individual user's journey rather than aggregate analytics. Rate limited to 60 queries/hour and 5 concurrent queries." + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_cohorts_list", + "description": "List every saved cohort in a Mixpanel project, including each cohort's numeric id, name, member count, description, and creation date. Use the id with 'mixpanelanalytics_profiles_query' (filter_by_cohort) to fetch the profiles in a cohort." + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_event_properties", + "description": "Get a time series broken down by the values of a single event property, e.g. purchase count per day segmented by product_category. Similar to segmentation, but focused on exploring one property's values rather than an arbitrary 'on' expression." + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_event_top_properties", + "description": "List the property names most commonly sent with a given event, along with how many times each appears. Useful for discovering what properties are available before writing a segmentation query or property-values lookup." + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_event_top_property_values", + "description": "List the most common values seen for a given event property, e.g. the top product_category values sent with the 'purchase' event. Useful for discovering what filter/segment values are available before writing a query." + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_events_query", + "description": "Get aggregate counts for one or more events over time, without any property segmentation. Faster and simpler than 'mixpanelanalytics_segmentation_query' when you just need raw counts for a set of events, e.g. daily counts of 'login' and 'signup' side by side." + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_events_top_names", + "description": "List the most common event names tracked in the project over its lifetime, ranked by the given analysis type. Useful for discovering what events exist before writing a segmentation or funnel query." + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_events_top_today", + "description": "Get the top events for today, ranked by count, along with their percent change compared to the same time yesterday. Useful for a quick 'what's happening right now' snapshot." + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_funnels_list_saved", + "description": "List all saved funnels in a Mixpanel project, returning each funnel's numeric funnel_id and name. Use the funnel_id with 'mixpanelanalytics_funnels_query' to fetch its conversion data." + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_funnels_query", + "description": "Get conversion data for an existing saved funnel by its funnel_id, showing per-step counts and conversion ratios over time. Use 'mixpanelanalytics_funnels_list_saved' to find a funnel_id. Note: Mixpanel considers this endpoint in maintenance mode and recommends building the funn…" + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_insights_query", + "description": "Get the computed data for an existing saved Insights report by its bookmark_id. This is Mixpanel's recommended, actively maintained way to pull report data (in place of the older segmentation/funnels/retention query endpoints), but it can only run a report that already exists in…" + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_jql_query", + "description": "Run a custom JQL (JavaScript Query Language) script against raw Mixpanel event/profile data for analysis that the standard segmentation/funnel/retention/insights endpoints can't express, e.g. custom aggregations, joins across events and profiles, or arbitrary groupBy/reduce pipe…" + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_profiles_query", + "description": "Query Mixpanel user (or group) profiles and return a paginated list of profiles matching the given filters. Supports filtering by a specific list of distinct_ids, a free-form 'where' expression, or a saved cohort. Rate limited to 60 queries/hour and 5 concurrent queries." + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_retention_frequency_query", + "description": "Measure how frequently users return to do an event within a period, broken into fine-grained buckets (e.g. how many of the hours in each day a user was active). Useful for engagement/'stickiness' analysis." + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_retention_query", + "description": "Measure how many users who did a 'born' event came back to do a later event, bucketed into cohorts. Supports 'birth' retention (users grouped by when they first did the born event) or 'compounded' retention (users grouped by every time they did the born event)." + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_schema_delete", + "description": "Permanently delete the Lexicon schema for a single event or profile property, identified by entity type and name. This removes only the Lexicon schema definition; the underlying event or profile property is not deleted and will show as un-schematized until a new schema is upload…" + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_schema_get", + "description": "Retrieve the Lexicon schema for a single event or profile property, identified by entity type and name. Returns the schema's description, JSON-schema-style property definitions, and Lexicon metadata such as display name, tags, and owners. Returns an error if no schema exists for…" + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_schema_upload", + "description": "Create or replace the Lexicon schema for a single event or profile property, identified by entity type and name. Any existing schema for this entity type and name is fully overwritten with the fields you provide. Use 'description' for a human-readable summary of the entity, 'pro…" + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_schemas_delete_all", + "description": "Permanently delete every schema in the project's Lexicon data dictionary, for both event and profile-property entity types. This removes only the Lexicon schema definitions (descriptions, JSON-schema property definitions, and metadata); the underlying events and profile properti…" + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_schemas_delete_by_entity", + "description": "Permanently delete every Lexicon schema for one entity type ('event' or 'profile') in a Mixpanel project, leaving schemas for the other entity type untouched. Pass 'entity_name' to narrow this to a single schema by name instead of deleting all schemas for the entity type. This r…" + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_schemas_list", + "description": "List all schemas (data dictionary entries) defined in a Mixpanel project's Lexicon, across both event and profile-property entity types. Each schema includes the entity's description, JSON-schema-style property definitions, and Lexicon metadata such as display name, tags, and ow…" + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_schemas_list_by_entity", + "description": "List the Lexicon schemas for one entity type ('event' or 'profile') in a Mixpanel project. Optionally pass 'entity_name' to filter the results down to a single schema by name. Only entities that already have an associated schema are returned. Use 'mixpanelanalytics_schemas_list'…" + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_schemas_upload_batch", + "description": "Create or replace multiple Lexicon schemas in a single call. Each object in 'entries' defines one event or profile property's schema (entity type, name, and JSON-schema definition) and is merged into the project's existing data dictionary. Set 'truncate' to true to first remove …" + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_segmentation_average_query", + "description": "Get the average value of a numeric property expression per unit time for a single event, e.g. average order value per day. Note: in maintenance mode per Mixpanel — prefer 'mixpanelanalytics_insights_query' for new use cases where possible." + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_segmentation_numeric_query", + "description": "Get event counts for a single event, bucketed by the numeric value of a property expression (e.g. distribution of purchase amounts). Note: in maintenance mode per Mixpanel — prefer 'mixpanelanalytics_insights_query' for new use cases where possible." + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_segmentation_query", + "description": "Get event counts for a single event over time, optionally segmented and filtered by properties. Note: Mixpanel's Query API team considers this endpoint in maintenance mode and recommends 'mixpanelanalytics_insights_query' (against a saved Insights report) for new use cases, but …" + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_segmentation_sum_query", + "description": "Get the sum of a numeric property expression per unit time for a single event, e.g. total revenue per day. Note: in maintenance mode per Mixpanel — prefer 'mixpanelanalytics_insights_query' for new use cases where possible." + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_warehouse_import_create_event_stream", + "description": "Create a new warehouse import that streams warehouse rows into Mixpanel as events. Maps a warehouse table to Mixpanel's Events dataset using 'table_params' to select the source table/columns and 'time_column_name' (plus 'event_name' or 'event_column_name') to derive each event's…" + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_warehouse_import_create_groups", + "description": "Create a new warehouse import that syncs warehouse rows into Mixpanel as group profile updates, analogous to 'mixpanelanalytics_warehouse_import_create_people' but for group analytics (e.g. company/account-level profiles) instead of individual users. Maps a warehouse table using…" + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_warehouse_import_create_lookup_table", + "description": "Create a new warehouse import that syncs a warehouse table into Mixpanel as a Lookup Table, joining additional properties onto events or user profiles by a shared key (similar in effect to 'mixpanelingestion_lookup_table_replace', but kept continuously in sync from the warehouse…" + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_warehouse_import_create_people", + "description": "Create a new warehouse import that syncs warehouse rows into Mixpanel as user profile updates (equivalent to Engage '$set'). Maps a warehouse table to Mixpanel user profiles using 'table_params' to select the source table/columns and 'user_column_name' to identify which column h…" + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_warehouse_import_delete", + "description": "Delete a warehouse import's sync configuration, stopping future syncs. By default this only removes the connector configuration — data already imported into Mixpanel is kept. Set 'delete_data' to true to also permanently delete the data previously imported by this connector. Use…" + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_warehouse_import_get", + "description": "Get the full configuration and current status of a single warehouse import by id, including its sync schedule ('run_every'), pause state, and warehouse-specific parameters. Use 'mixpanelanalytics_warehouse_imports_list' first to find the import_id." + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_warehouse_import_history", + "description": "Get the history of past sync runs for a warehouse import, e.g. to check when it last ran, whether recent runs succeeded, and how long each run took. Use 'mixpanelanalytics_warehouse_imports_list' to find the import_id first." + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_warehouse_import_run_sync", + "description": "Manually trigger an immediate sync run for a warehouse import, outside its configured schedule ('run_every'). Use this to pull the latest warehouse data on demand instead of waiting for the next scheduled run, e.g. after fixing an upstream data issue. Use 'mixpanelanalytics_ware…" + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_warehouse_import_update", + "description": "Pause, resume, or reschedule an existing warehouse import. Use this to stop a sync temporarily ('paused': true), resume it ('paused': false), change how often it runs ('run_every'), or update Databricks-specific cluster settings. Use 'mixpanelanalytics_warehouse_imports_list' or…" + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_warehouse_imports_list", + "description": "List all warehouse import connectors configured for a Mixpanel project, across every warehouse source (Snowflake, BigQuery, Databricks, Redshift). Each entry includes its import id, import type (event stream, people, groups, or lookup table), warehouse source, and current sync s…" + }, + { + "slug": "mixpanelcompliance", + "name": "mixpanelcompliance_gdpr_deletion_cancel", + "description": "Cancel a pending GDPR/CCPA data deletion request before Mixpanel begins permanently erasing the data. Returns no content on success. Cancellation can fail once the deletion has already progressed too far to stop — check 'mixpanelcompliance_gdpr_deletion_status' first if you're u…" + }, + { + "slug": "mixpanelcompliance", + "name": "mixpanelcompliance_gdpr_deletion_create", + "description": "Permanently delete ALL data Mixpanel holds for the given distinct_ids — every event and profile property, across all time. This is irreversible once processing completes, and per Mixpanel's GDPR/CCPA documentation it can take up to 30 days to fully propagate through Mixpanel's s…" + }, + { + "slug": "mixpanelcompliance", + "name": "mixpanelcompliance_gdpr_deletion_status", + "description": "Check the status of a GDPR/CCPA data deletion request previously created with 'mixpanelcompliance_gdpr_deletion_create'. The response's status field is one of: PENDING, STAGING, STARTED, SUCCESS, FAILURE, REVOKED, NOT_FOUND, or UNKNOWN. Deletions can take up to 30 days to reach …" + }, + { + "slug": "mixpanelcompliance", + "name": "mixpanelcompliance_gdpr_retrieval_create", + "description": "Create a GDPR or CCPA Subject Access Request (SAR) for one or more Mixpanel distinct_ids. Mixpanel asynchronously compiles an export of every event and profile property it holds for the given distinct_ids so you can fulfill a data subject's access request. This call only queues …" + }, + { + "slug": "mixpanelcompliance", + "name": "mixpanelcompliance_gdpr_retrieval_status", + "description": "Check the status of a GDPR/CCPA data retrieval (Subject Access Request) previously created with 'mixpanelcompliance_gdpr_retrieval_create'. The response's status field is one of: PENDING, STAGING, STARTED, SUCCESS, FAILURE, REVOKED, NOT_FOUND, or UNKNOWN. Poll this until the sta…" + }, + { + "slug": "mixpanelingestion", + "name": "mixpanelingestion_feature_flags_definitions", + "description": "Get the full definitions of every feature flag/experiment configured in a Mixpanel project, including each flag's variants, rollout rules, and linked experiment. Provide either 'project_token' or 'project_id' to authenticate (project_id uses your Service Account credentials)." + }, + { + "slug": "mixpanelingestion", + "name": "mixpanelingestion_feature_flags_evaluate", + "description": "Evaluate all enabled Mixpanel feature flags and experiments for a given user, returning the variant each flag assigns them. Provide either 'project_token' or 'project_id' to authenticate (project_id uses your Service Account credentials)." + }, + { + "slug": "mixpanelingestion", + "name": "mixpanelingestion_group_batch_update", + "description": "Send a batch of mixed group-profile updates to Mixpanel in a single call, analogous to 'mixpanelingestion_profile_batch_update' for user profiles. Each item in 'updates' is a fully-formed update object with its own \"$token\", \"$group_key\", \"$group_id\", and one operation key ($set…" + }, + { + "slug": "mixpanelingestion", + "name": "mixpanelingestion_group_delete", + "description": "Permanently delete a Mixpanel group profile and all of its properties, analogous to 'mixpanelingestion_profile_delete' for user profiles. This does not delete historical events associated with the group." + }, + { + "slug": "mixpanelingestion", + "name": "mixpanelingestion_group_remove", + "description": "Remove a specific value from a list-valued property on a Mixpanel group profile, analogous to 'mixpanelingestion_profile_remove' for user profiles. If the value is not present, no change is made." + }, + { + "slug": "mixpanelingestion", + "name": "mixpanelingestion_group_set", + "description": "Set (overwrite) properties on a Mixpanel group profile (e.g. a company or team account), analogous to 'mixpanelingestion_profile_set' for user profiles. Creates the group profile if it does not already exist. Requires Group Analytics to be enabled on your Mixpanel project." + }, + { + "slug": "mixpanelingestion", + "name": "mixpanelingestion_group_set_once", + "description": "Set properties on a Mixpanel group profile only if they are not already set — existing values are never overwritten, analogous to 'mixpanelingestion_profile_set_once' for user profiles. Creates the group profile if it does not already exist." + }, + { + "slug": "mixpanelingestion", + "name": "mixpanelingestion_group_union", + "description": "Add values to a list-valued property on a Mixpanel group profile, ensuring each value only appears once, analogous to 'mixpanelingestion_profile_union' for user profiles. Creates the group profile if it does not already exist." + }, + { + "slug": "mixpanelingestion", + "name": "mixpanelingestion_group_unset", + "description": "Permanently remove one or more named properties (and their values) from a Mixpanel group profile, analogous to 'mixpanelingestion_profile_unset' for user profiles." + }, + { + "slug": "mixpanelingestion", + "name": "mixpanelingestion_identity_create", + "description": "Link an anonymous distinct_id to a known, identified distinct_id by sending a Mixpanel $identify event via /track. Use this the first time you learn a user's real identifier (e.g. after login or signup) so that pre-login and post-login activity is merged onto one profile. Return…" + }, + { + "slug": "mixpanelingestion", + "name": "mixpanelingestion_identity_create_alias", + "description": "Create a legacy alias linking a new distinct_id to an existing one by sending a Mixpanel $create_alias event via /track. This is the legacy identity-linking mechanism; for new integrations prefer 'mixpanelingestion_identity_create' ($identify) or 'mixpanelingestion_identity_merg…" + }, + { + "slug": "mixpanelingestion", + "name": "mixpanelingestion_identity_merge", + "description": "Merge two distinct_ids into a single identity using Mixpanel's modern Identity Merge API (a $merge event sent through /import, authenticated with your Service Account). All historical events and profile data from both distinct_ids are combined under one identity. Use this instea…" + }, + { + "slug": "mixpanelingestion", + "name": "mixpanelingestion_import_events", + "description": "Import a batch of up to 2000 events into Mixpanel via the modern, Service Account-authenticated /import endpoint. This is Mixpanel's recommended way to send events from a trusted server-side integration (unlike the classic /track endpoint). Each event needs an 'event' name and a…" + }, + { + "slug": "mixpanelingestion", + "name": "mixpanelingestion_lookup_table_replace", + "description": "Replace the entire contents of a Mixpanel Lookup Table with new CSV data. This overwrites all existing rows in the table — use 'mixpanelingestion_lookup_tables_list' first to find the table's id. The first column of the CSV must be the table's key (matching the property it enric…" + }, + { + "slug": "mixpanelingestion", + "name": "mixpanelingestion_lookup_tables_list", + "description": "List the Lookup Tables defined in a Mixpanel project. Returns each table's id and name. Use the id with 'mixpanelingestion_lookup_table_replace' to update a table's contents, or find it in Lexicon under the lookup table's details." + }, + { + "slug": "mixpanelingestion", + "name": "mixpanelingestion_profile_append", + "description": "Append a value to a list-valued property on a Mixpanel user profile via Engage $append. If the property does not yet exist, it is created as a single-element list. Unlike $union, duplicate values are allowed. Useful for ordered logs like \"Recent Searches\"." + }, + { + "slug": "mixpanelingestion", + "name": "mixpanelingestion_profile_batch_update", + "description": "Send a batch of mixed user-profile updates to Mixpanel Engage in a single call. Each item in 'updates' is a fully-formed update object with its own \"$token\", \"$distinct_id\", and one operation key ($set, $set_once, $add, $union, $append, $remove, $unset, or $delete) — the same sh…" + }, + { + "slug": "mixpanelingestion", + "name": "mixpanelingestion_profile_delete", + "description": "Permanently delete a Mixpanel user profile and all of its properties via Engage $delete. This does not delete the user's historical events, only their profile. If duplicate profiles exist due to identity merging, set 'ignore_alias' to true so you don't accidentally delete the or…" + }, + { + "slug": "mixpanelingestion", + "name": "mixpanelingestion_profile_increment", + "description": "Increment (or decrement, using a negative value) numeric properties on a Mixpanel user profile via Engage $add. The given amounts are added to the existing values; if a property is not yet present it is treated as 0. Useful for counters such as \"Number of Logins\" or \"Files Uploa…" + }, + { + "slug": "mixpanelingestion", + "name": "mixpanelingestion_profile_remove", + "description": "Remove a specific value from a list-valued property on a Mixpanel user profile via Engage $remove. If the value is not present, no change is made. The opposite of 'mixpanelingestion_profile_append'." + }, + { + "slug": "mixpanelingestion", + "name": "mixpanelingestion_profile_set", + "description": "Set (overwrite) properties on a Mixpanel user profile via Engage $set. Creates the profile if it does not already exist. Use this for properties that should always reflect the latest value, such as \"Plan\" or \"Last Login\". For properties that should only be set the first time, us…" + }, + { + "slug": "mixpanelingestion", + "name": "mixpanelingestion_profile_set_once", + "description": "Set properties on a Mixpanel user profile via Engage $set_once, but only if they are not already set — existing values are never overwritten. Creates the profile if it does not already exist. Useful for properties like \"First Login Date\" that should be recorded once and never ch…" + }, + { + "slug": "mixpanelingestion", + "name": "mixpanelingestion_profile_union", + "description": "Add values to a list-valued property on a Mixpanel user profile via Engage $union, ensuring each value only appears once in the resulting list. Creates the profile if it does not already exist. Useful for properties like \"Purchased Categories\" that accumulate unique values over …" + }, + { + "slug": "mixpanelingestion", + "name": "mixpanelingestion_profile_unset", + "description": "Permanently remove one or more named properties (and their values) from a Mixpanel user profile via Engage $unset. This deletes the properties themselves, not the profile — use 'mixpanelingestion_profile_delete' to delete the whole profile." + }, + { + "slug": "mixpanelingestion", + "name": "mixpanelingestion_track_event", + "description": "Send a single event to Mixpanel via the classic /track endpoint, authenticated with your Mixpanel Project Token (not your Service Account). Use this for lightweight, fire-and-forget event tracking. For reliable server-side ingestion with validation and duplicate protection, pref…" + }, { "slug": "mobbinmcp", "name": "mobbinmcp_search_flows", @@ -50174,6 +52199,536 @@ "name": "storeleadsmcp_search_technologies", "description": "Search technologies used by e-commerce stores. Filter by install count." }, + { + "slug": "stripe", + "name": "stripe_accept_quote_dahlia", + "description": "Accept a finalized Quote. Converts it into a subscription or invoice." + }, + { + "slug": "stripe", + "name": "stripe_attach_payment_method_dahlia", + "description": "Attach a PaymentMethod to a Customer." + }, + { + "slug": "stripe", + "name": "stripe_cancel_payment_intent_dahlia", + "description": "Cancels a PaymentIntent object when it's in a cancellable state. Depending on the payment method, it may be possible to cancel a PaymentIntent once it has been confirmed and is in requires_capture state." + }, + { + "slug": "stripe", + "name": "stripe_cancel_payout_dahlia", + "description": "Cancel a payout that has not yet been paid out. Only cancels payouts with status 'pending'." + }, + { + "slug": "stripe", + "name": "stripe_cancel_quote_dahlia", + "description": "Cancel a Quote that has been finalized but not yet accepted." + }, + { + "slug": "stripe", + "name": "stripe_cancel_setup_intent_dahlia", + "description": "Cancel a SetupIntent that has not been confirmed." + }, + { + "slug": "stripe", + "name": "stripe_cancel_subscription_dahlia", + "description": "Cancels a customer's subscription immediately. The customer will not be charged again for the subscription. By default the subscription is canceled immediately but if prorate is set, any remaining charges are refunded." + }, + { + "slug": "stripe", + "name": "stripe_close_dispute_dahlia", + "description": "Close a dispute and accept the chargeback. This cannot be undone." + }, + { + "slug": "stripe", + "name": "stripe_confirm_payment_intent_dahlia", + "description": "Confirm that your customer intends to pay with current or provided payment method. Upon confirmation, the PaymentIntent will attempt to initiate a payment. If the payment method requires action (3DS, redirect), the PaymentIntent will move to requires_action." + }, + { + "slug": "stripe", + "name": "stripe_confirm_setup_intent_dahlia", + "description": "Confirm a SetupIntent and attempt to collect a payment method for future use." + }, + { + "slug": "stripe", + "name": "stripe_create_checkout_session_dahlia", + "description": "Create a Checkout Session to accept one-time or subscription payments via Stripe-hosted page." + }, + { + "slug": "stripe", + "name": "stripe_create_coupon_dahlia", + "description": "Create a coupon that can be redeemed for a discount on subscriptions or one-time charges." + }, + { + "slug": "stripe", + "name": "stripe_create_customer_dahlia", + "description": "Creates a new customer object. Use this to store a customer's payment and billing details. The customer object allows you to perform recurring charges and track multiple charges associated with the same customer." + }, + { + "slug": "stripe", + "name": "stripe_create_customer_portal_session_dahlia", + "description": "Creates a session of the customer portal. A portal session describes the instantiation of the customer portal for a particular customer. By visiting the session's URL, the customer can manage their subscriptions and billing details. Portal sessions are short-lived and will expir…" + }, + { + "slug": "stripe", + "name": "stripe_create_invoice_dahlia", + "description": "This endpoint creates a draft invoice for a given customer. The draft invoice created pulls in all pending invoice items on that customer, including prorations. The invoice remains a draft until you finalize the invoice, which allows you to pay, send, and delete the invoice." + }, + { + "slug": "stripe", + "name": "stripe_create_invoice_item_dahlia", + "description": "Create an invoice item to be added to a pending invoice." + }, + { + "slug": "stripe", + "name": "stripe_create_payment_intent_dahlia", + "description": "Creates a PaymentIntent object. After the PaymentIntent is created, attach a payment method and confirm to continue the payment. You can also create and confirm a PaymentIntent in a single step by using the confirm parameter." + }, + { + "slug": "stripe", + "name": "stripe_create_payment_method_dahlia", + "description": "Create a PaymentMethod object. Attach it to a Customer to enable reusable payment." + }, + { + "slug": "stripe", + "name": "stripe_create_payout_dahlia", + "description": "Create a payout to send funds to a bank account or debit card." + }, + { + "slug": "stripe", + "name": "stripe_create_plan_dahlia", + "description": "Create a Plan (legacy billing API). Consider using Prices instead for new integrations." + }, + { + "slug": "stripe", + "name": "stripe_create_price_dahlia", + "description": "Creates a new price for an existing product. Prices define how much and how often to charge for products. This includes one-time prices and recurring prices for subscriptions." + }, + { + "slug": "stripe", + "name": "stripe_create_product_dahlia", + "description": "Creates a new product object. Products describe the specific goods or services you offer to your customers. Products are used in conjunction with Prices to configure how much and how often you charge customers." + }, + { + "slug": "stripe", + "name": "stripe_create_promotion_code_dahlia", + "description": "Create a promotion code for a coupon that customers can redeem." + }, + { + "slug": "stripe", + "name": "stripe_create_quote_dahlia", + "description": "Create a Quote for a subscription or one-time payment, which can be sent to customers for approval." + }, + { + "slug": "stripe", + "name": "stripe_create_refund_dahlia", + "description": "Create a refund for a charge or payment intent. Refunds a charge that has previously been created, with optional partial amount." + }, + { + "slug": "stripe", + "name": "stripe_create_setup_intent_dahlia", + "description": "Create a SetupIntent to collect payment method details for future off-session payments." + }, + { + "slug": "stripe", + "name": "stripe_create_subscription_dahlia", + "description": "Creates a new subscription on an existing customer. Each customer can have multiple active subscriptions if needed." + }, + { + "slug": "stripe", + "name": "stripe_create_subscription_item_dahlia", + "description": "Add a new item to an existing subscription." + }, + { + "slug": "stripe", + "name": "stripe_create_tax_rate_dahlia", + "description": "Create a tax rate that can be applied to invoices and subscriptions." + }, + { + "slug": "stripe", + "name": "stripe_create_transfer_dahlia", + "description": "Create a transfer to send funds to a connected Stripe account (Connect platforms)." + }, + { + "slug": "stripe", + "name": "stripe_create_webhook_endpoint_dahlia", + "description": "Create a webhook endpoint to receive Stripe event notifications at your HTTPS URL. Supports subscribing to any number of event types (or use * to receive all events)." + }, + { + "slug": "stripe", + "name": "stripe_delete_coupon_dahlia", + "description": "Delete a coupon. Customers that have already applied this coupon are not affected." + }, + { + "slug": "stripe", + "name": "stripe_delete_customer_dahlia", + "description": "Permanently deletes a customer. It cannot be undone. Also immediately cancels any active subscriptions on the customer." + }, + { + "slug": "stripe", + "name": "stripe_delete_invoice_item_dahlia", + "description": "Delete an invoice item. Can only delete items that have not been finalized in an invoice." + }, + { + "slug": "stripe", + "name": "stripe_delete_plan_dahlia", + "description": "Delete a Plan. Customers subscribed to this plan are not affected." + }, + { + "slug": "stripe", + "name": "stripe_delete_subscription_item_dahlia", + "description": "Delete a subscription item, removing it from the subscription." + }, + { + "slug": "stripe", + "name": "stripe_delete_webhook_endpoint_dahlia", + "description": "Delete a webhook endpoint. Once deleted, the endpoint will no longer receive events from Stripe." + }, + { + "slug": "stripe", + "name": "stripe_detach_payment_method_dahlia", + "description": "Detach a PaymentMethod from a Customer, making it reusable for other customers." + }, + { + "slug": "stripe", + "name": "stripe_expire_checkout_session_dahlia", + "description": "Expire a Checkout Session before it has been completed. Can only expire sessions in 'open' status." + }, + { + "slug": "stripe", + "name": "stripe_finalize_invoice_dahlia", + "description": "Stripe automatically finalizes drafts before sending them. However, if you'd like to finalize a draft invoice manually, you can do so using this method. After an invoice is finalized, it can be paid or sent to customers." + }, + { + "slug": "stripe", + "name": "stripe_finalize_quote_dahlia", + "description": "Finalize a Quote to make it ready to be accepted by the customer." + }, + { + "slug": "stripe", + "name": "stripe_get_account_dahlia", + "description": "Retrieve the details of the current Stripe account." + }, + { + "slug": "stripe", + "name": "stripe_get_balance_dahlia", + "description": "Retrieve the current balance of the Stripe account, showing available and pending amounts by currency." + }, + { + "slug": "stripe", + "name": "stripe_get_balance_transaction_dahlia", + "description": "Retrieve a balance transaction by ID. Balance transactions represent funds moving through the Stripe account." + }, + { + "slug": "stripe", + "name": "stripe_get_charge_dahlia", + "description": "Retrieves the details of a charge that has previously been created. Supply the unique charge ID that was returned from your previous request, and Stripe will return the corresponding charge information." + }, + { + "slug": "stripe", + "name": "stripe_get_checkout_session_dahlia", + "description": "Retrieve a Checkout Session by ID." + }, + { + "slug": "stripe", + "name": "stripe_get_coupon_dahlia", + "description": "Retrieve a coupon by its ID." + }, + { + "slug": "stripe", + "name": "stripe_get_customer_dahlia", + "description": "Retrieves the details of an existing customer. You need only supply the unique customer identifier that was returned upon customer creation." + }, + { + "slug": "stripe", + "name": "stripe_get_dispute_dahlia", + "description": "Retrieve a dispute by ID. A dispute occurs when a customer questions a charge with their card issuer." + }, + { + "slug": "stripe", + "name": "stripe_get_event_dahlia", + "description": "Retrieve an event by ID. Events are Stripe's way of notifying your application about changes." + }, + { + "slug": "stripe", + "name": "stripe_get_invoice_dahlia", + "description": "Retrieves the invoice with the given ID. Supply the unique invoice identifier that was returned from your previous request, and Stripe will return the corresponding invoice information." + }, + { + "slug": "stripe", + "name": "stripe_get_invoice_item_dahlia", + "description": "Retrieves the invoice item with the given ID. Supply the unique invoice item identifier and Stripe will return the corresponding invoice item information." + }, + { + "slug": "stripe", + "name": "stripe_get_payment_intent_dahlia", + "description": "Retrieves the details of a PaymentIntent that was previously created. Supply the unique PaymentIntent ID and Stripe will return the corresponding PaymentIntent information." + }, + { + "slug": "stripe", + "name": "stripe_get_payment_method_dahlia", + "description": "Retrieve a PaymentMethod object." + }, + { + "slug": "stripe", + "name": "stripe_get_payout_dahlia", + "description": "Retrieve a payout by ID." + }, + { "slug": "stripe", "name": "stripe_get_plan_dahlia", "description": "Retrieve a Plan by ID." }, + { + "slug": "stripe", + "name": "stripe_get_price_dahlia", + "description": "Retrieves the price with the given ID." + }, + { + "slug": "stripe", + "name": "stripe_get_product_dahlia", + "description": "Retrieves the details of an existing product. Supply the unique product ID from either a product creation request or the product list, and Stripe will return the corresponding product information." + }, + { + "slug": "stripe", + "name": "stripe_get_promotion_code_dahlia", + "description": "Retrieve a promotion code by ID." + }, + { "slug": "stripe", "name": "stripe_get_quote_dahlia", "description": "Retrieve a Quote by ID." }, + { + "slug": "stripe", + "name": "stripe_get_refund_dahlia", + "description": "Retrieve the details of an existing refund." + }, + { + "slug": "stripe", + "name": "stripe_get_setup_intent_dahlia", + "description": "Retrieve a SetupIntent by ID." + }, + { + "slug": "stripe", + "name": "stripe_get_subscription_dahlia", + "description": "Retrieves the subscription with the given ID. Supply the unique subscription identifier that was returned from your previous request, and Stripe will return the corresponding subscription information." + }, + { + "slug": "stripe", + "name": "stripe_get_subscription_item_dahlia", + "description": "Retrieves the subscription item with the given ID. Supply the unique subscription item identifier and Stripe will return the corresponding subscription item information." + }, + { + "slug": "stripe", + "name": "stripe_get_tax_rate_dahlia", + "description": "Retrieve a tax rate by ID." + }, + { + "slug": "stripe", + "name": "stripe_get_transfer_dahlia", + "description": "Retrieve a transfer by ID." + }, + { + "slug": "stripe", + "name": "stripe_get_webhook_endpoint_dahlia", + "description": "Retrieve a webhook endpoint by ID." + }, + { + "slug": "stripe", + "name": "stripe_list_accounts_dahlia", + "description": "List all connected accounts on your platform (Connect platforms only)." + }, + { + "slug": "stripe", + "name": "stripe_list_balance_transactions_dahlia", + "description": "List all balance transactions, optionally filtered by currency, source, or type." + }, + { + "slug": "stripe", + "name": "stripe_list_charges_dahlia", + "description": "Returns a list of charges you've previously created. The charges are returned in sorted order, with the most recent charges appearing first." + }, + { + "slug": "stripe", + "name": "stripe_list_checkout_sessions_dahlia", + "description": "List all Checkout Sessions." + }, + { "slug": "stripe", "name": "stripe_list_coupons_dahlia", "description": "List all coupons." }, + { + "slug": "stripe", + "name": "stripe_list_customer_payment_methods_dahlia", + "description": "List all PaymentMethods attached to a specific customer." + }, + { + "slug": "stripe", + "name": "stripe_list_customers_dahlia", + "description": "Returns a list of your customers. The customers are returned sorted by creation date, with the most recent customers appearing first. Supports filtering by email and pagination for large customer lists." + }, + { + "slug": "stripe", + "name": "stripe_list_disputes_dahlia", + "description": "List all disputes, optionally filtered by charge or payment intent." + }, + { + "slug": "stripe", + "name": "stripe_list_events_dahlia", + "description": "List all events. Events represent noteworthy activity on your Stripe account." + }, + { + "slug": "stripe", + "name": "stripe_list_invoice_items_dahlia", + "description": "Returns a list of your invoice items. Invoice items are returned sorted by creation date, with the most recent invoice items appearing first." + }, + { + "slug": "stripe", + "name": "stripe_list_invoice_line_items_dahlia", + "description": "When retrieving an invoice, you'll get a lines property containing the total count of line items and the first handful of those items. There is also a URL where you can retrieve the full (paginated) list of line items." + }, + { + "slug": "stripe", + "name": "stripe_list_invoices_dahlia", + "description": "Returns a list of your invoices. The invoices are returned sorted by creation date, with the most recent invoices appearing first." + }, + { + "slug": "stripe", + "name": "stripe_list_payment_intents_dahlia", + "description": "Returns a list of PaymentIntents. The PaymentIntents are returned sorted by creation date, with the most recent PaymentIntents appearing first." + }, + { + "slug": "stripe", + "name": "stripe_list_payment_methods_dahlia", + "description": "List PaymentMethods for a customer." + }, + { + "slug": "stripe", + "name": "stripe_list_payouts_dahlia", + "description": "List all payouts, with optional filters by status and arrival date." + }, + { "slug": "stripe", "name": "stripe_list_plans_dahlia", "description": "List all Plans." }, + { + "slug": "stripe", + "name": "stripe_list_prices_dahlia", + "description": "Returns a list of your active prices, excluding inline prices. For the list of inactive prices, set active to false." + }, + { + "slug": "stripe", + "name": "stripe_list_products_dahlia", + "description": "Returns a list of your products. The products are returned sorted by creation date, with the most recent products appearing first." + }, + { + "slug": "stripe", + "name": "stripe_list_promotion_codes_dahlia", + "description": "List all promotion codes." + }, + { "slug": "stripe", "name": "stripe_list_quotes_dahlia", "description": "List all Quotes." }, + { + "slug": "stripe", + "name": "stripe_list_refunds_dahlia", + "description": "List all refunds, optionally filtered by charge or payment intent." + }, + { + "slug": "stripe", + "name": "stripe_list_setup_intents_dahlia", + "description": "List all SetupIntents." + }, + { + "slug": "stripe", + "name": "stripe_list_subscription_items_dahlia", + "description": "Returns a list of subscription items for a given subscription. Subscription items represent the component lines of a subscription." + }, + { + "slug": "stripe", + "name": "stripe_list_subscriptions_dahlia", + "description": "Returns a list of your subscriptions. The subscriptions are returned sorted by creation date, with the most recent subscriptions appearing first." + }, + { + "slug": "stripe", + "name": "stripe_list_tax_rates_dahlia", + "description": "List all tax rates." + }, + { + "slug": "stripe", + "name": "stripe_list_transfers_dahlia", + "description": "List all transfers to connected accounts." + }, + { + "slug": "stripe", + "name": "stripe_list_webhook_endpoints_dahlia", + "description": "List all webhook endpoints." + }, + { + "slug": "stripe", + "name": "stripe_pay_invoice_dahlia", + "description": "Stripe automatically creates and then attempts to collect payment on invoices for customers on subscriptions according to your subscriptions settings. However, if you'd like to attempt payment on an invoice out of the normal collection schedule or for some other reason, you use …" + }, + { + "slug": "stripe", + "name": "stripe_update_coupon_dahlia", + "description": "Update a coupon's name or metadata." + }, + { + "slug": "stripe", + "name": "stripe_update_customer_dahlia", + "description": "Updates the specified customer by setting the values of the parameters passed. Any parameters not provided will be left unchanged." + }, + { + "slug": "stripe", + "name": "stripe_update_dispute_dahlia", + "description": "Update a dispute to submit evidence to the card issuer and potentially win the chargeback." + }, + { + "slug": "stripe", + "name": "stripe_update_invoice_item_dahlia", + "description": "Update an invoice item's amount, description, or metadata." + }, + { + "slug": "stripe", + "name": "stripe_update_plan_dahlia", + "description": "Update a Plan's nickname, active status, or metadata." + }, + { + "slug": "stripe", + "name": "stripe_update_product_dahlia", + "description": "Updates the specific product by setting the values of the parameters passed. Any parameters not provided will be left unchanged." + }, + { + "slug": "stripe", + "name": "stripe_update_promotion_code_dahlia", + "description": "Update a promotion code's active status or metadata." + }, + { + "slug": "stripe", + "name": "stripe_update_quote_dahlia", + "description": "Update a draft Quote." + }, + { + "slug": "stripe", + "name": "stripe_update_refund_dahlia", + "description": "Update the metadata on a refund." + }, + { + "slug": "stripe", + "name": "stripe_update_subscription_dahlia", + "description": "Updates an existing subscription to match the specified parameters. When updating a subscription, any parameters not provided will be left unchanged." + }, + { + "slug": "stripe", + "name": "stripe_update_subscription_item_dahlia", + "description": "Update a subscription item, for example to change the price or quantity." + }, + { + "slug": "stripe", + "name": "stripe_update_tax_rate_dahlia", + "description": "Update a tax rate's display name, description, or active status." + }, + { + "slug": "stripe", + "name": "stripe_update_transfer_dahlia", + "description": "Update a transfer's metadata." + }, + { + "slug": "stripe", + "name": "stripe_update_webhook_endpoint_dahlia", + "description": "Update a webhook endpoint's URL, enabled events, or disabled status." + }, + { + "slug": "stripe", + "name": "stripe_void_invoice_dahlia", + "description": "Mark a finalized invoice as void. This cannot be undone. Voiding an invoice is similar to deletion, however it only applies to finalized invoices and maintains a papertrail where the invoice can still be found." + }, { "slug": "stripemcp", "name": "stripemcp_cancel_subscription", diff --git a/src/assets/docs/agent-connectors/amplitudeanalytics/api-keys.png b/src/assets/docs/agent-connectors/amplitudeanalytics/api-keys.png new file mode 100644 index 000000000..ff1b49ce2 Binary files /dev/null and b/src/assets/docs/agent-connectors/amplitudeanalytics/api-keys.png differ diff --git a/src/assets/docs/agent-connectors/amplitudeanalytics/secret-keys.png b/src/assets/docs/agent-connectors/amplitudeanalytics/secret-keys.png new file mode 100644 index 000000000..0b316520a Binary files /dev/null and b/src/assets/docs/agent-connectors/amplitudeanalytics/secret-keys.png differ diff --git a/src/assets/docs/agent-connectors/amplitudeexperimentmanagement/management-api-keys.png b/src/assets/docs/agent-connectors/amplitudeexperimentmanagement/management-api-keys.png new file mode 100644 index 000000000..66b68c82a Binary files /dev/null and b/src/assets/docs/agent-connectors/amplitudeexperimentmanagement/management-api-keys.png differ diff --git a/src/assets/docs/agent-connectors/discord/bot-permissions.png b/src/assets/docs/agent-connectors/discord/bot-permissions.png new file mode 100644 index 000000000..ee817067d Binary files /dev/null and b/src/assets/docs/agent-connectors/discord/bot-permissions.png differ diff --git a/src/assets/docs/agent-connectors/discordbot/bot-tab.png b/src/assets/docs/agent-connectors/discordbot/bot-tab.png new file mode 100644 index 000000000..972d2236e Binary files /dev/null and b/src/assets/docs/agent-connectors/discordbot/bot-tab.png differ diff --git a/src/assets/docs/agent-connectors/mixpanelanalytics/add-service-account.png b/src/assets/docs/agent-connectors/mixpanelanalytics/add-service-account.png new file mode 100644 index 000000000..146f0eac8 Binary files /dev/null and b/src/assets/docs/agent-connectors/mixpanelanalytics/add-service-account.png differ diff --git a/src/assets/docs/agent-connectors/mixpanelcompliance/gdpr-token.png b/src/assets/docs/agent-connectors/mixpanelcompliance/gdpr-token.png new file mode 100644 index 000000000..7fd8f8328 Binary files /dev/null and b/src/assets/docs/agent-connectors/mixpanelcompliance/gdpr-token.png differ diff --git a/src/assets/docs/agent-connectors/mixpanelingestion/add-service-account.png b/src/assets/docs/agent-connectors/mixpanelingestion/add-service-account.png new file mode 100644 index 000000000..146f0eac8 Binary files /dev/null and b/src/assets/docs/agent-connectors/mixpanelingestion/add-service-account.png differ diff --git a/src/components/templates/agent-connectors/_setup-amplitudeanalytics.mdx b/src/components/templates/agent-connectors/_setup-amplitudeanalytics.mdx new file mode 100644 index 000000000..0881ca661 --- /dev/null +++ b/src/components/templates/agent-connectors/_setup-amplitudeanalytics.mdx @@ -0,0 +1,112 @@ +import { Steps, Aside, Tabs, TabItem } from '@astrojs/starlight/components' + +Register your Amplitude API Key and Secret Key with Scalekit so it can authenticate and proxy requests on behalf of your users. Amplitude uses HTTP Basic Auth — the API Key is the username and the Secret Key is the password. There is no redirect URI or OAuth flow. + + +1. ### Find your Amplitude data residency region + + Amplitude runs two separate data residency regions with different credentials and API hosts. Before generating keys, confirm which region your project (or organization) lives in: + + | Region | API host | + |--------|----------| + | US (default) | `amplitude.com` | + | EU | `analytics.eu.amplitude.com` | + + + +2. ### Get your API Key + + - Sign in to Amplitude and go to **Settings** → **Agent Connectors** (or **API and Secret Keys**) → **API Keys**. + - Click **Generate API Key**, or copy an existing key's value. + + ![Amplitude API and Secret Keys page showing the API Keys tab with a generated key](@/assets/docs/agent-connectors/amplitudeanalytics/api-keys.png) + +3. ### Get your Secret Key + + - Click the **Secret Keys** tab. + - Click **Show** next to the secret key that matches the API key you copied in step 2, and copy it. + + ![Amplitude API and Secret Keys page showing the Secret Keys tab with a hidden secret key](@/assets/docs/agent-connectors/amplitudeanalytics/secret-keys.png) + + + +4. ### Create a connection in Scalekit + + - In the [Scalekit dashboard](https://app.scalekit.com), go to **AgentKit** → **Connections** → **Create Connection**. + - Search for **Amplitude Analytics** and click **Create**. + - Note the **Connection name** — use this as `connection_name` in your code (e.g., `amplitudeanalytics`). + +5. ### Add a connected account + + Connected accounts link a specific user identifier in your system to an Amplitude API Key, Secret Key, and region. Add them via the dashboard for testing, or via the Scalekit API in production. + + **Via dashboard (for testing)** + + - Open the connection and click the **Connected Accounts** tab → **Add account**. + - Fill in **Your User's ID**, **API Key**, **Secret Key**, and select the **Data Residency Region** that matches your keys. + - Click **Save**. + + **Via API (for production)** + + + + ```ts + // US region (default) — omit `domain` or set it to 'amplitude.com' + await scalekit.connect.upsertConnectedAccount({ + connectionName: 'amplitudeanalytics', + identifier: 'user@example.com', + credentials: { + username: 'your-amplitude-api-key', + password: 'your-amplitude-secret-key', + domain: 'amplitude.com', + }, + }) + + // EU region + await scalekit.connect.upsertConnectedAccount({ + connectionName: 'amplitudeanalytics', + identifier: 'eu-user@example.com', + credentials: { + username: 'your-eu-amplitude-api-key', + password: 'your-eu-amplitude-secret-key', + domain: 'analytics.eu.amplitude.com', + }, + }) + ``` + + + ```python + # US region (default) — omit domain or set it to "amplitude.com" + scalekit_client.connect.upsert_connected_account( + connection_name="amplitudeanalytics", + identifier="user@example.com", + credentials={ + "username": "your-amplitude-api-key", + "password": "your-amplitude-secret-key", + "domain": "amplitude.com", + }, + ) + + # EU region + scalekit_client.connect.upsert_connected_account( + connection_name="amplitudeanalytics", + identifier="eu-user@example.com", + credentials={ + "username": "your-eu-amplitude-api-key", + "password": "your-eu-amplitude-secret-key", + "domain": "analytics.eu.amplitude.com", + }, + ) + ``` + + + + + + diff --git a/src/components/templates/agent-connectors/_setup-amplitudeexperimentmanagement.mdx b/src/components/templates/agent-connectors/_setup-amplitudeexperimentmanagement.mdx new file mode 100644 index 000000000..3ba1563b9 --- /dev/null +++ b/src/components/templates/agent-connectors/_setup-amplitudeexperimentmanagement.mdx @@ -0,0 +1,106 @@ +import { Steps, Aside, Tabs, TabItem } from '@astrojs/starlight/components' + +Register your Amplitude Experiment Management API key with Scalekit so it can authenticate and proxy requests on behalf of your users. This connector uses a Bearer token — there is no redirect URI or OAuth flow. + + +1. ### Find your Amplitude Experiment data residency region + + Amplitude Experiment runs two separate data residency regions with different keys and API hosts. Before generating a key, confirm which region your project lives in: + + | Region | API host | + |--------|----------| + | US (default) | `experiment.amplitude.com` | + | EU | `experiment.eu.amplitude.com` | + + + + + +2. ### Get your Management API key + + - Sign in to Amplitude and go to **Experiment** → **Management API** in the left sidebar. + - Select the **Project** you want a key for. + - Click **Create key for project**, or copy an existing key's value from the list. + + ![Amplitude Experiment Management API page showing existing keys per project](@/assets/docs/agent-connectors/amplitudeexperimentmanagement/management-api-keys.png) + + + +3. ### Create a connection in Scalekit + + - In the [Scalekit dashboard](https://app.scalekit.com), go to **AgentKit** → **Connections** → **Create Connection**. + - Search for **Amplitude Experiment Management** and click **Create**. + - Note the **Connection name** — use this as `connection_name` in your code (e.g., `amplitudeexperimentmanagement`). + +4. ### Add a connected account + + Connected accounts link a specific user identifier in your system to a Management API key and region. Add them via the dashboard for testing, or via the Scalekit API in production. + + **Via dashboard (for testing)** + + - Open the connection and click the **Connected Accounts** tab → **Add account**. + - Fill in **Your User's ID**, the **Management API Key**, and select the **Data Residency Region** that matches the key. + - Click **Save**. + + **Via API (for production)** + + + + ```ts + // US region (default) — omit `domain` or set it to 'experiment.amplitude.com' + await scalekit.connect.upsertConnectedAccount({ + connectionName: 'amplitudeexperimentmanagement', + identifier: 'user@example.com', + credentials: { + token: 'your-management-api-key', + domain: 'experiment.amplitude.com', + }, + }) + + // EU region + await scalekit.connect.upsertConnectedAccount({ + connectionName: 'amplitudeexperimentmanagement', + identifier: 'eu-user@example.com', + credentials: { + token: 'your-eu-management-api-key', + domain: 'experiment.eu.amplitude.com', + }, + }) + ``` + + + ```python + # US region (default) — omit domain or set it to "experiment.amplitude.com" + scalekit_client.connect.upsert_connected_account( + connection_name="amplitudeexperimentmanagement", + identifier="user@example.com", + credentials={ + "token": "your-management-api-key", + "domain": "experiment.amplitude.com", + }, + ) + + # EU region + scalekit_client.connect.upsert_connected_account( + connection_name="amplitudeexperimentmanagement", + identifier="eu-user@example.com", + credentials={ + "token": "your-eu-management-api-key", + "domain": "experiment.eu.amplitude.com", + }, + ) + ``` + + + + + + diff --git a/src/components/templates/agent-connectors/_setup-discord.mdx b/src/components/templates/agent-connectors/_setup-discord.mdx index 416c947e6..2a9a2ca23 100644 --- a/src/components/templates/agent-connectors/_setup-discord.mdx +++ b/src/components/templates/agent-connectors/_setup-discord.mdx @@ -59,4 +59,20 @@ Register your Scalekit environment with the Discord connector so Scalekit handle + +5. ### Configure the bot scope (optional) + + If your agent needs to act as a bot in a server — sending messages, managing channels, or reacting to events — include the `bot` scope when you request authorization. Discord then asks the installing user to also grant a set of **bot permissions**. + + - In the Scalekit connection settings, set: + - **Bot Permissions** — a bitfield describing what your bot can do in the server. Use the [permissions calculator](https://discord.com/developers/applications) on your application's **Bot** page to generate this value, or use the recommended default `2260657982483703` for common read/write access. + - **Pre-selected Guild ID** — optional. Pre-fills Discord's server picker with a specific server ID during authorization. + - **Disable Guild Select** — optional. When enabled with a **Pre-selected Guild ID**, the user cannot pick a different server. + - **Installation Context** — optional. Controls whether `applications.commands` installs to a server or to the authorizing user's account. + + ![Discord Bot Permissions page showing General, Text, and Voice permission checkboxes](@/assets/docs/agent-connectors/discord/bot-permissions.png) + + diff --git a/src/components/templates/agent-connectors/_setup-discordbot.mdx b/src/components/templates/agent-connectors/_setup-discordbot.mdx new file mode 100644 index 000000000..2f3f8824d --- /dev/null +++ b/src/components/templates/agent-connectors/_setup-discordbot.mdx @@ -0,0 +1,70 @@ +import { Steps, Aside, Tabs, TabItem } from '@astrojs/starlight/components' + +Register your Discord bot token with Scalekit so it can authenticate and proxy requests on behalf of your users. Discord Bot uses Bearer Token authentication — there is no redirect URI or OAuth flow. + + +1. ### Create a Discord application and bot user + + - Go to the [Discord Developer Portal](https://discord.com/developers/applications) and sign in with your Discord account. + - Click **New Application**, enter a name (for example, `Agent Auth`), accept the terms, and click **Create**. + - Open your application and go to **Bot** in the left sidebar. + +2. ### Get your bot token + + - On the **Bot** page, under **Token**, click **Reset Token** to generate a new bot token and copy it immediately — Discord shows the full token only once. + + ![Discord application Bot page showing the Username, Token, and Authorization Flow settings](@/assets/docs/agent-connectors/discordbot/bot-tab.png) + + + +3. ### Invite the bot to a server + + - Go to **OAuth2** > **URL Generator** in the left sidebar. + - Under **Scopes**, select **bot**. + - Under **Bot Permissions**, select the permissions your agent needs. + + ![Discord Bot Permissions page showing General, Text, and Voice permission checkboxes](@/assets/docs/agent-connectors/discord/bot-permissions.png) + + - Copy the generated URL at the bottom of the page, open it in a browser, and select a server to add the bot to. + +4. ### Create a connection in Scalekit + + - In the [Scalekit dashboard](https://app.scalekit.com), go to **AgentKit** → **Connections** → **Create Connection**. + - Search for **Discord Bot** and click **Create**. + - Note the **Connection name** — use this as `connection_name` in your code (e.g., `discordbot`). + +5. ### Add a connected account + + Connected accounts link a specific user identifier in your system to a Discord bot token. Add them via the dashboard for testing, or via the Scalekit API in production. + + **Via dashboard (for testing)** + + - Open the connection and click the **Connected Accounts** tab → **Add account**. + - Fill in **Your User's ID** and **Bot Token**, then click **Save**. + + **Via API (for production)** + + + + ```ts + await scalekit.connect.upsertConnectedAccount({ + connectionName: 'discordbot', + identifier: 'user@example.com', + credentials: { apiKey: 'your-discord-bot-token' }, + }) + ``` + + + ```python + scalekit_client.connect.upsert_connected_account( + connection_name="discordbot", + identifier="user@example.com", + credentials={"api_key": "your-discord-bot-token"}, + ) + ``` + + + + diff --git a/src/components/templates/agent-connectors/_setup-mixpanelanalytics.mdx b/src/components/templates/agent-connectors/_setup-mixpanelanalytics.mdx new file mode 100644 index 000000000..a14937224 --- /dev/null +++ b/src/components/templates/agent-connectors/_setup-mixpanelanalytics.mdx @@ -0,0 +1,107 @@ +import { Steps, Aside, Tabs, TabItem } from '@astrojs/starlight/components' + +Register your Mixpanel Service Account username and secret with Scalekit so it can authenticate and proxy requests on behalf of your users. Mixpanel uses HTTP Basic Auth — the Service Account username is the username and the secret is the password. There is no redirect URI or OAuth flow. + + +1. ### Find your Mixpanel data residency region + + Mixpanel hosts projects in three separate data residency regions. Before generating a Service Account, confirm which region your project lives in: + + | Region | API host | + |--------|----------| + | United States (default) | `mixpanel.com/api` | + | European Union | `eu.mixpanel.com/api` | + | India | `in.mixpanel.com/api` | + + + +2. ### Create a Service Account + + - Sign in to Mixpanel and go to **Settings** → **Project** → **Service Accounts**. + - Click **Add Service Account**, give it a name (for example, `Agent Auth`), and choose a role. + - Copy the generated **Username** and **Secret** immediately — Mixpanel shows the secret only once. + + ![Mixpanel Add Service Account modal showing the generated Username and Secret fields](@/assets/docs/agent-connectors/mixpanelanalytics/add-service-account.png) + + + +3. ### Create a connection in Scalekit + + - In the [Scalekit dashboard](https://app.scalekit.com), go to **AgentKit** → **Connections** → **Create Connection**. + - Search for **Mixpanel Analytics** and click **Create**. + - Note the **Connection name** — use this as `connection_name` in your code (e.g., `mixpanelanalytics`). + +4. ### Add a connected account + + Connected accounts link a specific user identifier in your system to a Mixpanel Service Account and region. Add them via the dashboard for testing, or via the Scalekit API in production. + + **Via dashboard (for testing)** + + - Open the connection and click the **Connected Accounts** tab → **Add account**. + - Fill in **Your User's ID**, the **Username**, **Secret**, and select the matching **Data Residency**. + - Click **Save**. + + **Via API (for production)** + + + + ```ts + // US region (default) — omit `domain` or set it to 'mixpanel.com/api' + await scalekit.connect.upsertConnectedAccount({ + connectionName: 'mixpanelanalytics', + identifier: 'user@example.com', + credentials: { + username: 'your-service-account-username', + password: 'your-service-account-secret', + domain: 'mixpanel.com/api', + }, + }) + + // EU region + await scalekit.connect.upsertConnectedAccount({ + connectionName: 'mixpanelanalytics', + identifier: 'eu-user@example.com', + credentials: { + username: 'your-eu-service-account-username', + password: 'your-eu-service-account-secret', + domain: 'eu.mixpanel.com/api', + }, + }) + ``` + + + ```python + # US region (default) — omit domain or set it to "mixpanel.com/api" + scalekit_client.connect.upsert_connected_account( + connection_name="mixpanelanalytics", + identifier="user@example.com", + credentials={ + "username": "your-service-account-username", + "password": "your-service-account-secret", + "domain": "mixpanel.com/api", + }, + ) + + # EU region + scalekit_client.connect.upsert_connected_account( + connection_name="mixpanelanalytics", + identifier="eu-user@example.com", + credentials={ + "username": "your-eu-service-account-username", + "password": "your-eu-service-account-secret", + "domain": "eu.mixpanel.com/api", + }, + ) + ``` + + + + + + diff --git a/src/components/templates/agent-connectors/_setup-mixpanelcompliance.mdx b/src/components/templates/agent-connectors/_setup-mixpanelcompliance.mdx new file mode 100644 index 000000000..ffcf7f3b6 --- /dev/null +++ b/src/components/templates/agent-connectors/_setup-mixpanelcompliance.mdx @@ -0,0 +1,106 @@ +import { Steps, Aside, Tabs, TabItem } from '@astrojs/starlight/components' + +Register your Mixpanel GDPR/CCPA compliance token with Scalekit so it can authenticate and proxy data deletion and retrieval requests on behalf of your users. This connector uses a Bearer token — there is no redirect URI or OAuth flow. + + +1. ### Find your Mixpanel data residency region + + Mixpanel hosts projects in three separate data residency regions. Before generating a token, confirm which region your project lives in: + + | Region | API host | + |--------|----------| + | United States (default) | `mixpanel.com/api` | + | European Union | `eu.mixpanel.com/api` | + | India | `in.mixpanel.com/api` | + + + + + +2. ### Get your GDPR compliance token + + - Sign in to Mixpanel and go to **Settings** → **Profile** → **Data & Privacy**. + - Under **GDPR API**, copy the **OAuth Token for GDPR APIs**. If none exists yet, click **Reset** to generate one. + + ![Mixpanel Data & Privacy settings page showing the GDPR API OAuth Token field](@/assets/docs/agent-connectors/mixpanelcompliance/gdpr-token.png) + + + +3. ### Create a connection in Scalekit + + - In the [Scalekit dashboard](https://app.scalekit.com), go to **AgentKit** → **Connections** → **Create Connection**. + - Search for **Mixpanel Compliance** and click **Create**. + - Note the **Connection name** — use this as `connection_name` in your code (e.g., `mixpanelcompliance`). + +4. ### Add a connected account + + Connected accounts link a specific user identifier in your system to a GDPR compliance token and region. Add them via the dashboard for testing, or via the Scalekit API in production. + + **Via dashboard (for testing)** + + - Open the connection and click the **Connected Accounts** tab → **Add account**. + - Fill in **Your User's ID**, the **GDPR Token**, and select the matching **Data Residency**. + - Click **Save**. + + **Via API (for production)** + + + + ```ts + // US region (default) — omit `domain` or set it to 'mixpanel.com/api' + await scalekit.connect.upsertConnectedAccount({ + connectionName: 'mixpanelcompliance', + identifier: 'user@example.com', + credentials: { + token: 'your-gdpr-compliance-token', + domain: 'mixpanel.com/api', + }, + }) + + // EU region + await scalekit.connect.upsertConnectedAccount({ + connectionName: 'mixpanelcompliance', + identifier: 'eu-user@example.com', + credentials: { + token: 'your-eu-gdpr-compliance-token', + domain: 'eu.mixpanel.com/api', + }, + }) + ``` + + + ```python + # US region (default) — omit domain or set it to "mixpanel.com/api" + scalekit_client.connect.upsert_connected_account( + connection_name="mixpanelcompliance", + identifier="user@example.com", + credentials={ + "token": "your-gdpr-compliance-token", + "domain": "mixpanel.com/api", + }, + ) + + # EU region + scalekit_client.connect.upsert_connected_account( + connection_name="mixpanelcompliance", + identifier="eu-user@example.com", + credentials={ + "token": "your-eu-gdpr-compliance-token", + "domain": "eu.mixpanel.com/api", + }, + ) + ``` + + + + + + diff --git a/src/components/templates/agent-connectors/_setup-mixpanelingestion.mdx b/src/components/templates/agent-connectors/_setup-mixpanelingestion.mdx new file mode 100644 index 000000000..52cb6cb83 --- /dev/null +++ b/src/components/templates/agent-connectors/_setup-mixpanelingestion.mdx @@ -0,0 +1,107 @@ +import { Steps, Aside, Tabs, TabItem } from '@astrojs/starlight/components' + +Register your Mixpanel Service Account username and secret with Scalekit so it can authenticate and proxy requests on behalf of your users. Mixpanel uses HTTP Basic Auth — the Service Account username is the username and the secret is the password. There is no redirect URI or OAuth flow. + + +1. ### Find your Mixpanel data residency region + + Mixpanel hosts projects in three separate data residency regions. Before generating a Service Account, confirm which region your project lives in: + + | Region | API host | + |--------|----------| + | United States (default) | `mixpanel.com/api` | + | European Union | `eu.mixpanel.com/api` | + | India | `in.mixpanel.com/api` | + + + +2. ### Create a Service Account + + - Sign in to Mixpanel and go to **Settings** → **Project** → **Service Accounts**. + - Click **Add Service Account**, give it a name (for example, `Agent Auth`), and choose a role. + - Copy the generated **Username** and **Secret** immediately — Mixpanel shows the secret only once. + + ![Mixpanel Add Service Account modal showing the generated Username and Secret fields](@/assets/docs/agent-connectors/mixpanelingestion/add-service-account.png) + + + +3. ### Create a connection in Scalekit + + - In the [Scalekit dashboard](https://app.scalekit.com), go to **AgentKit** → **Connections** → **Create Connection**. + - Search for **Mixpanel Ingestion** and click **Create**. + - Note the **Connection name** — use this as `connection_name` in your code (e.g., `mixpanelingestion`). + +4. ### Add a connected account + + Connected accounts link a specific user identifier in your system to a Mixpanel Service Account and region. Add them via the dashboard for testing, or via the Scalekit API in production. + + **Via dashboard (for testing)** + + - Open the connection and click the **Connected Accounts** tab → **Add account**. + - Fill in **Your User's ID**, the **Username**, **Secret**, and select the matching **Data Residency**. + - Click **Save**. + + **Via API (for production)** + + + + ```ts + // US region (default) — omit `domain` or set it to 'mixpanel.com/api' + await scalekit.connect.upsertConnectedAccount({ + connectionName: 'mixpanelingestion', + identifier: 'user@example.com', + credentials: { + username: 'your-service-account-username', + password: 'your-service-account-secret', + domain: 'mixpanel.com/api', + }, + }) + + // EU region + await scalekit.connect.upsertConnectedAccount({ + connectionName: 'mixpanelingestion', + identifier: 'eu-user@example.com', + credentials: { + username: 'your-eu-service-account-username', + password: 'your-eu-service-account-secret', + domain: 'eu.mixpanel.com/api', + }, + }) + ``` + + + ```python + # US region (default) — omit domain or set it to "mixpanel.com/api" + scalekit_client.connect.upsert_connected_account( + connection_name="mixpanelingestion", + identifier="user@example.com", + credentials={ + "username": "your-service-account-username", + "password": "your-service-account-secret", + "domain": "mixpanel.com/api", + }, + ) + + # EU region + scalekit_client.connect.upsert_connected_account( + connection_name="mixpanelingestion", + identifier="eu-user@example.com", + credentials={ + "username": "your-eu-service-account-username", + "password": "your-eu-service-account-secret", + "domain": "eu.mixpanel.com/api", + }, + ) + ``` + + + + + + diff --git a/src/components/templates/agent-connectors/index.ts b/src/components/templates/agent-connectors/index.ts index 97da20862..4a1d926b5 100644 --- a/src/components/templates/agent-connectors/index.ts +++ b/src/components/templates/agent-connectors/index.ts @@ -4,6 +4,8 @@ export { default as SetupAdvancedmdSection } from './_setup-advancedmd.mdx' export { default as SetupAdzvisermcpSection } from './_setup-adzvisermcp.mdx' export { default as SetupAiropsmcpSection } from './_setup-airopsmcp.mdx' export { default as SetupAirtableSection } from './_setup-airtable.mdx' +export { default as SetupAmplitudeanalyticsSection } from './_setup-amplitudeanalytics.mdx' +export { default as SetupAmplitudeexperimentmanagementSection } from './_setup-amplitudeexperimentmanagement.mdx' export { default as SetupApifymcpSection } from './_setup-apifymcp.mdx' export { default as SetupApolloSection } from './_setup-apollo.mdx' export { default as SetupAsanaSection } from './_setup-asana.mdx' @@ -35,6 +37,7 @@ export { default as SetupDevinmcpSection } from './_setup-devinmcp.mdx' export { default as SetupDevrevmcpSection } from './_setup-devrevmcp.mdx' export { default as SetupDiarizeSection } from './_setup-diarize.mdx' export { default as SetupDiscordSection } from './_setup-discord.mdx' +export { default as SetupDiscordbotSection } from './_setup-discordbot.mdx' export { default as SetupDropboxSection } from './_setup-dropbox.mdx' export { default as SetupDropboxmcpSection } from './_setup-dropboxmcp.mdx' export { default as SetupExaSection } from './_setup-exa.mdx' @@ -81,6 +84,9 @@ export { default as SetupMicrosoftTeamsSection } from './_setup-microsoft-teams. export { default as SetupMicrosoftWordSection } from './_setup-microsoft-word.mdx' export { default as SetupMicrosoft365Section } from './_setup-microsoft365.mdx' export { default as SetupMiroSection } from './_setup-miro.mdx' +export { default as SetupMixpanelanalyticsSection } from './_setup-mixpanelanalytics.mdx' +export { default as SetupMixpanelcomplianceSection } from './_setup-mixpanelcompliance.mdx' +export { default as SetupMixpanelingestionSection } from './_setup-mixpanelingestion.mdx' export { default as SetupMondaySection } from './_setup-monday.mdx' export { default as SetupMondaymcpSection } from './_setup-mondaymcp.mdx' export { default as SetupNimblemcpSection } from './_setup-nimblemcp.mdx' diff --git a/src/content/docs/agentkit/connectors/amplitudeanalytics.mdx b/src/content/docs/agentkit/connectors/amplitudeanalytics.mdx new file mode 100644 index 000000000..800bd568c --- /dev/null +++ b/src/content/docs/agentkit/connectors/amplitudeanalytics.mdx @@ -0,0 +1,79 @@ +--- +title: 'Amplitude Analytics connector' +tableOfContents: true +description: 'Connect to Amplitude''s analytics REST APIs: event segmentation, funnels, cohorts, taxonomy, chart annotations, session replay, export, releases, streaming...' +sidebar: + label: 'Amplitude Analytics' +overviewTitle: 'Quickstart' +connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/amplitude.svg +connectorAuthType: API Key + Secret Key +connectorCategories: [Analytics] +head: + - tag: style + content: | + .sl-markdown-content h2 { + font-size: var(--sl-text-xl); + } + .sl-markdown-content h3 { + font-size: var(--sl-text-lg); + } +--- + +import ToolList from '@/components/ToolList.astro' +import { tools } from '@/data/agent-connectors/amplitudeanalytics' +import { Steps, Tabs, TabItem } from '@astrojs/starlight/components' +import { AgentKitCredentials } from '@components/templates' +import { SetupAmplitudeanalyticsSection } from '@components/templates' + + + +1. ### Install the SDK + + + + ```bash frame="terminal" + npm install @scalekit-sdk/node + ``` + + + ```bash frame="terminal" + pip install scalekit + ``` + + + + Full SDK reference: [Node.js](/agentkit/sdks/node/) | [Python](/agentkit/sdks/python/) + +2. ### Set your credentials + + + +3. ### Set up the connector + + Register your Amplitude Analytics credentials with Scalekit so it can authenticate requests on your behalf. You do this once per environment. + +
+ Dashboard setup steps + + + +
+ +
+ +## What you can do + +Connect this agent connector to let your agent: + +- **Category bulk assign annotation** — Assign an existing annotation category to multiple annotations at once +- **Create annotation, annotation category, dsar request** — Create a chart annotation marking a single date or a date range, either globally visible on all charts or scoped to one chart +- **Delete annotation, annotation category, event category** — Permanently delete a chart annotation from Amplitude +- **Events export** — Export raw event data uploaded to Amplitude within a date range as a zip archive of NDJSON files +- **Get annotation, annotation category, cohort membership file** — Retrieve a single chart annotation by its ID +- **List annotation categories, annotations, cohorts** — List all chart annotation categories in the Amplitude project, or filter to a single category by name + +## Tool list + +Use the exact tool names from the **Tool list** below when you call `execute_tool`. If you're not sure which name to use, list the tools available for the current user first. + + diff --git a/src/content/docs/agentkit/connectors/amplitudeexperimentmanagement.mdx b/src/content/docs/agentkit/connectors/amplitudeexperimentmanagement.mdx new file mode 100644 index 000000000..dac6d6b62 --- /dev/null +++ b/src/content/docs/agentkit/connectors/amplitudeexperimentmanagement.mdx @@ -0,0 +1,84 @@ +--- +title: 'Amplitude Experiment Management connector' +tableOfContents: true +description: 'Manage Amplitude Experiment feature flags, experiments, mutex groups, holdouts, and deployments. Separate connector from Experiment Evaluation (real-time...' +sidebar: + label: 'Amplitude Experiment Management' +overviewTitle: 'Quickstart' +connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/amplitude.svg +connectorAuthType: Bearer Token +connectorCategories: [Analytics] +head: + - tag: style + content: | + .sl-markdown-content h2 { + font-size: var(--sl-text-xl); + } + .sl-markdown-content h3 { + font-size: var(--sl-text-lg); + } +--- + +import ToolList from '@/components/ToolList.astro' +import { tools } from '@/data/agent-connectors/amplitudeexperimentmanagement' +import { Steps, Tabs, TabItem } from '@astrojs/starlight/components' +import { AgentKitCredentials } from '@components/templates' +import { SetupAmplitudeexperimentmanagementSection } from '@components/templates' +import { QuickstartGenericApikeySection } from '@components/templates' + + + +1. ### Install the SDK + + + + ```bash frame="terminal" + npm install @scalekit-sdk/node + ``` + + + ```bash frame="terminal" + pip install scalekit + ``` + + + + Full SDK reference: [Node.js](/agentkit/sdks/node/) | [Python](/agentkit/sdks/python/) + +2. ### Set your credentials + + + +3. ### Set up the connector + + Register your Amplitude Experiment Management credentials with Scalekit so it can authenticate requests on your behalf. You do this once per environment. + +
+ Dashboard setup steps + + + +
+ +4. ### Make your first call + + + +
+ +## What you can do + +Connect this agent connector to let your agent: + +- **Cohorts add experiment variant, add flag variant** — Add specific cohorts to this experiment variant's targeting inclusions +- **Users add experiment variant, add flag variant, remove all experiment variant** — Force-bucket specific users or devices into this experiment variant — identified by user ID, device ID, or an email-style identifier — bypassing the experiment's normal allocation +- **Delete bulk** — Remove a specific set of cohorts (by ID) from an experiment variant's targeting, leaving other included cohorts untouched +- **Create deployment, experiment, experiment deployment** — Create a new deployment in a project +- **Get experiment, experiment variant, experiment variant cohorts** — Get complete details for a single Amplitude experiment by its ID +- **List all versions, deployments, experiment deployments** — List version history across ALL flags and experiments the API key can access, in one global, paginated feed — distinct from amplitudeexperimentmanagement_list_flag_versions and amplitudeexperimentmanagement_list_experiment_versions, which return the version history for one specific flag or experiment and do NOT support start/end/limit/cursor pagination + +## Tool list + +Use the exact tool names from the **Tool list** below when you call `execute_tool`. If you're not sure which name to use, list the tools available for the current user first. + + diff --git a/src/content/docs/agentkit/connectors/discord.mdx b/src/content/docs/agentkit/connectors/discord.mdx index 2831b081d..98822a76d 100644 --- a/src/content/docs/agentkit/connectors/discord.mdx +++ b/src/content/docs/agentkit/connectors/discord.mdx @@ -71,10 +71,12 @@ import { SectionAfterSetupDiscordCommonWorkflows } from '@components/templates' Connect this agent connector to let your agent: -- **Get guild widget png, current user application entitlements, guild widget** — Retrieves a PNG image widget for a Discord guild -- **List my guilds, sticker packs** — Lists the current user's guilds, returning partial data (id, name, icon, owner, permissions, features) for each -- **Invite resolve** — Resolves and retrieves information about a Discord invite code, including the associated guild, channel, event, and inviter -- **Connections retrieve user** — Retrieves a list of the authenticated user's connected third-party accounts on Discord, such as Twitch, YouTube, GitHub, Steam, and others +- **Entitlement consume** — For one-time purchase consumable SKUs, mark a given entitlement for the user as consumed +- **Create lobby channel invite for self, or join lobby** — Create a single-use guild invite to a lobby's linked channel, targeted at the calling user +- **Delete current user application role connection, test entitlement** — Deletes the application role connection for the current user and the given application +- **Permissions edit application command** — Edit the permissions for a specific application command in a guild +- **Get application command permissions, current user application entitlements, current user application role connection** — Fetch permissions for a specific application command in a guild +- **Lobby leave, link channel to** — Remove the calling user from the specified Discord lobby ## Common workflows diff --git a/src/content/docs/agentkit/connectors/discordbot.mdx b/src/content/docs/agentkit/connectors/discordbot.mdx new file mode 100644 index 000000000..74db1b626 --- /dev/null +++ b/src/content/docs/agentkit/connectors/discordbot.mdx @@ -0,0 +1,84 @@ +--- +title: 'Discord Bot connector' +tableOfContents: true +description: 'Connect to Discord as a bot. Manage guilds, channels, members, messages, roles, webhooks, and more using a Discord Bot Token.' +sidebar: + label: 'Discord Bot' +overviewTitle: 'Quickstart' +connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/discord.svg +connectorAuthType: API Key +connectorCategories: [Communication, Collaboration] +head: + - tag: style + content: | + .sl-markdown-content h2 { + font-size: var(--sl-text-xl); + } + .sl-markdown-content h3 { + font-size: var(--sl-text-lg); + } +--- + +import ToolList from '@/components/ToolList.astro' +import { tools } from '@/data/agent-connectors/discordbot' +import { Steps, Tabs, TabItem } from '@astrojs/starlight/components' +import { AgentKitCredentials } from '@components/templates' +import { SetupDiscordbotSection } from '@components/templates' +import { QuickstartGenericApikeySection } from '@components/templates' + + + +1. ### Install the SDK + + + + ```bash frame="terminal" + npm install @scalekit-sdk/node + ``` + + + ```bash frame="terminal" + pip install scalekit + ``` + + + + Full SDK reference: [Node.js](/agentkit/sdks/node/) | [Python](/agentkit/sdks/python/) + +2. ### Set your credentials + + + +3. ### Set up the connector + + Register your Discord Bot credentials with Scalekit so it can authenticate requests on your behalf. You do this once per environment. + +
+ Dashboard setup steps + + + +
+ +4. ### Make your first call + + + +
+ +## What you can do + +Connect this agent connector to let your agent: + +- **Member add guild, add lobby, add thread** — Add a user to a guild using their OAuth2 access token with the guilds.join scope +- **Role add guild member, modify guild, remove guild member** — Add a role to a guild member +- **Prune begin guild** — Begin a prune operation to kick inactive members +- **Delete bulk, all reactions, all reactions for emoji** — Delete multiple messages in a Discord channel in a single request (2-100 messages) +- **Ban bulk guild, remove guild** — Ban up to 200 users from a guild and optionally delete their recent messages +- **Commands bulk overwrite global application, bulk overwrite guild application** — Bulk overwrite all global application commands + +## Tool list + +Use the exact tool names from the **Tool list** below when you call `execute_tool`. If you're not sure which name to use, list the tools available for the current user first. + + diff --git a/src/content/docs/agentkit/connectors/mixpanelanalytics.mdx b/src/content/docs/agentkit/connectors/mixpanelanalytics.mdx new file mode 100644 index 000000000..04915541d --- /dev/null +++ b/src/content/docs/agentkit/connectors/mixpanelanalytics.mdx @@ -0,0 +1,79 @@ +--- +title: 'Mixpanel Analytics connector' +tableOfContents: true +description: 'Connect to Mixpanel''s Query API, Lexicon Schemas, and Warehouse Connectors to run segmentation, funnel, retention, and Insights reports, execute custom...' +sidebar: + label: 'Mixpanel Analytics' +overviewTitle: 'Quickstart' +connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/mixpanel.svg +connectorAuthType: Service Account +connectorCategories: [Analytics] +head: + - tag: style + content: | + .sl-markdown-content h2 { + font-size: var(--sl-text-xl); + } + .sl-markdown-content h3 { + font-size: var(--sl-text-lg); + } +--- + +import ToolList from '@/components/ToolList.astro' +import { tools } from '@/data/agent-connectors/mixpanelanalytics' +import { Steps, Tabs, TabItem } from '@astrojs/starlight/components' +import { AgentKitCredentials } from '@components/templates' +import { SetupMixpanelanalyticsSection } from '@components/templates' + + + +1. ### Install the SDK + + + + ```bash frame="terminal" + npm install @scalekit-sdk/node + ``` + + + ```bash frame="terminal" + pip install scalekit + ``` + + + + Full SDK reference: [Node.js](/agentkit/sdks/node/) | [Python](/agentkit/sdks/python/) + +2. ### Set your credentials + + + +3. ### Set up the connector + + Register your Mixpanel Analytics credentials with Scalekit so it can authenticate requests on your behalf. You do this once per environment. + +
+ Dashboard setup steps + + + +
+ +
+ +## What you can do + +Connect this agent connector to let your agent: + +- **Stream activity** — Get the raw event stream (activity feed) for one or more specific users over a date range — every event each user did, in order +- **List cohorts, funnels, schemas** — List every saved cohort in a Mixpanel project, including each cohort's numeric id, name, member count, description, and creation date +- **Properties event, event top** — Get a time series broken down by the values of a single event property, e.g +- **Values event top property** — List the most common values seen for a given event property, e.g +- **Query events, funnels, insights** — Get aggregate counts for one or more events over time, without any property segmentation +- **Names events top** — List the most common event names tracked in the project over its lifetime, ranked by the given analysis type + +## Tool list + +Use the exact tool names from the **Tool list** below when you call `execute_tool`. If you're not sure which name to use, list the tools available for the current user first. + + diff --git a/src/content/docs/agentkit/connectors/mixpanelcompliance.mdx b/src/content/docs/agentkit/connectors/mixpanelcompliance.mdx new file mode 100644 index 000000000..c2bf0c0d5 --- /dev/null +++ b/src/content/docs/agentkit/connectors/mixpanelcompliance.mdx @@ -0,0 +1,81 @@ +--- +title: 'Mixpanel Compliance connector' +tableOfContents: true +description: 'Connect to Mixpanel''s GDPR/CCPA compliance API to submit and track end-user data deletion (right to erasure) and data retrieval (subject access) requests....' +sidebar: + label: 'Mixpanel Compliance' +overviewTitle: 'Quickstart' +connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/mixpanel.svg +connectorAuthType: Bearer Token +connectorCategories: [Analytics] +head: + - tag: style + content: | + .sl-markdown-content h2 { + font-size: var(--sl-text-xl); + } + .sl-markdown-content h3 { + font-size: var(--sl-text-lg); + } +--- + +import ToolList from '@/components/ToolList.astro' +import { tools } from '@/data/agent-connectors/mixpanelcompliance' +import { Steps, Tabs, TabItem } from '@astrojs/starlight/components' +import { AgentKitCredentials } from '@components/templates' +import { SetupMixpanelcomplianceSection } from '@components/templates' +import { QuickstartGenericApikeySection } from '@components/templates' + + + +1. ### Install the SDK + + + + ```bash frame="terminal" + npm install @scalekit-sdk/node + ``` + + + ```bash frame="terminal" + pip install scalekit + ``` + + + + Full SDK reference: [Node.js](/agentkit/sdks/node/) | [Python](/agentkit/sdks/python/) + +2. ### Set your credentials + + + +3. ### Set up the connector + + Register your Mixpanel Compliance credentials with Scalekit so it can authenticate requests on your behalf. You do this once per environment. + +
+ Dashboard setup steps + + + +
+ +4. ### Make your first call + + + +
+ +## What you can do + +Connect this agent connector to let your agent: + +- **Cancel gdpr deletion** — Cancel a pending GDPR/CCPA data deletion request before Mixpanel begins permanently erasing the data +- **Create gdpr deletion, gdpr retrieval** — Permanently delete ALL data Mixpanel holds for the given distinct_ids — every event and profile property, across all time +- **Status gdpr deletion, gdpr retrieval** — Check the status of a GDPR/CCPA data deletion request previously created with 'mixpanelcompliance_gdpr_deletion_create' + +## Tool list + +Use the exact tool names from the **Tool list** below when you call `execute_tool`. If you're not sure which name to use, list the tools available for the current user first. + + diff --git a/src/content/docs/agentkit/connectors/mixpanelingestion.mdx b/src/content/docs/agentkit/connectors/mixpanelingestion.mdx new file mode 100644 index 000000000..9f86edfb3 --- /dev/null +++ b/src/content/docs/agentkit/connectors/mixpanelingestion.mdx @@ -0,0 +1,79 @@ +--- +title: 'Mixpanel Ingestion connector' +tableOfContents: true +description: 'Connect to Mixpanel''s Ingestion API to track events, manage user and group profiles, resolve identities, replace lookup tables, and evaluate feature...' +sidebar: + label: 'Mixpanel Ingestion' +overviewTitle: 'Quickstart' +connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/mixpanel.svg +connectorAuthType: Service Account +connectorCategories: [Analytics] +head: + - tag: style + content: | + .sl-markdown-content h2 { + font-size: var(--sl-text-xl); + } + .sl-markdown-content h3 { + font-size: var(--sl-text-lg); + } +--- + +import ToolList from '@/components/ToolList.astro' +import { tools } from '@/data/agent-connectors/mixpanelingestion' +import { Steps, Tabs, TabItem } from '@astrojs/starlight/components' +import { AgentKitCredentials } from '@components/templates' +import { SetupMixpanelingestionSection } from '@components/templates' + + + +1. ### Install the SDK + + + + ```bash frame="terminal" + npm install @scalekit-sdk/node + ``` + + + ```bash frame="terminal" + pip install scalekit + ``` + + + + Full SDK reference: [Node.js](/agentkit/sdks/node/) | [Python](/agentkit/sdks/python/) + +2. ### Set your credentials + + + +3. ### Set up the connector + + Register your Mixpanel Ingestion credentials with Scalekit so it can authenticate requests on your behalf. You do this once per environment. + +
+ Dashboard setup steps + + + +
+ +
+ +## What you can do + +Connect this agent connector to let your agent: + +- **Definitions feature flags** — Get the full definitions of every feature flag/experiment configured in a Mixpanel project, including each flag's variants, rollout rules, and linked experiment +- **Evaluate feature flags** — Evaluate all enabled Mixpanel feature flags and experiments for a given user, returning the variant each flag assigns them +- **Update group batch, profile batch** — Send a batch of mixed group-profile updates to Mixpanel in a single call, analogous to 'mixpanelingestion_profile_batch_update' for user profiles +- **Delete group, profile** — Permanently delete a Mixpanel group profile and all of its properties, analogous to 'mixpanelingestion_profile_delete' for user profiles +- **Remove group, profile** — Remove a specific value from a list-valued property on a Mixpanel group profile, analogous to 'mixpanelingestion_profile_remove' for user profiles +- **Set group, profile** — Set (overwrite) properties on a Mixpanel group profile (e.g + +## Tool list + +Use the exact tool names from the **Tool list** below when you call `execute_tool`. If you're not sure which name to use, list the tools available for the current user first. + + diff --git a/src/content/docs/agentkit/connectors/stripe.mdx b/src/content/docs/agentkit/connectors/stripe.mdx new file mode 100644 index 000000000..40bd70e92 --- /dev/null +++ b/src/content/docs/agentkit/connectors/stripe.mdx @@ -0,0 +1,72 @@ +--- +title: 'Stripe connector' +tableOfContents: true +description: 'Connect to Stripe to manage customers, payments, products, subscriptions, invoices, and financial data.' +sidebar: + label: 'Stripe' +overviewTitle: 'Quickstart' +connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/stripe.svg +connectorAuthType: Bearer Token +connectorCategories: [Accounting & Finance, Developer Tools, Automation] +head: + - tag: style + content: | + .sl-markdown-content h2 { + font-size: var(--sl-text-xl); + } + .sl-markdown-content h3 { + font-size: var(--sl-text-lg); + } +--- + +import ToolList from '@/components/ToolList.astro' +import { tools } from '@/data/agent-connectors/stripe' +import { Steps, Tabs, TabItem } from '@astrojs/starlight/components' +import { AgentKitCredentials } from '@components/templates' +import { QuickstartGenericApikeySection } from '@components/templates' + + + +1. ### Install the SDK + + + + ```bash frame="terminal" + npm install @scalekit-sdk/node + ``` + + + ```bash frame="terminal" + pip install scalekit + ``` + + + + Full SDK reference: [Node.js](/agentkit/sdks/node/) | [Python](/agentkit/sdks/python/) + +2. ### Set your credentials + + + +3. ### Make your first call + + + + + +## What you can do + +Connect this agent connector to let your agent: + +- **Dahlia accept quote, attach payment method, cancel payment intent** — Accept a finalized Quote +- **Create checkout session dahlia, coupon dahlia, customer dahlia** — Create a Checkout Session to accept one-time or subscription payments via Stripe-hosted page +- **Delete coupon dahlia, customer dahlia, invoice item dahlia** — Delete a coupon +- **Get account dahlia, balance dahlia, balance transaction dahlia** — Retrieve the details of the current Stripe account +- **List accounts dahlia, balance transactions dahlia, charges dahlia** — List all connected accounts on your platform (Connect platforms only) +- **Update coupon dahlia, customer dahlia, dispute dahlia** — Update a coupon's name or metadata + +## Tool list + +Use the exact tool names from the **Tool list** below when you call `execute_tool`. If you're not sure which name to use, list the tools available for the current user first. + + diff --git a/src/data/agent-connectors/amplitudeanalytics.ts b/src/data/agent-connectors/amplitudeanalytics.ts new file mode 100644 index 000000000..1ec2215e5 --- /dev/null +++ b/src/data/agent-connectors/amplitudeanalytics.ts @@ -0,0 +1,1602 @@ +import type { Tool } from '../../types/agent-connectors' + +export const tools: Tool[] = [ + { + name: 'amplitudeanalytics_bulk_assign_annotation_category', + description: `Assign an existing annotation category to multiple annotations at once.`, + params: [ + { + name: 'annotation_ids', + type: 'array', + required: true, + description: `Array of annotation IDs to assign to this category.`, + }, + { + name: 'category_id', + type: 'integer', + required: true, + description: `The ID of the category to assign to the given annotations.`, + }, + ], + }, + { + name: 'amplitudeanalytics_create_annotation', + description: `Create a chart annotation marking a single date or a date range, either globally visible on all charts or scoped to one chart. CONFIRMED (live-tested): category and chart_id are both validated against real resources already known to Amplitude — an unrecognized category name or chart_id 404s rather than being auto-created or accepted as free text; use amplitudeanalytics_create_annotation_category first if the category doesn't exist yet. If category is omitted, Amplitude defaults it to the built-in 'Uncategorized' category rather than leaving it unset (asymmetric with chart_id, which stays genuinely null when omitted). This connector has no chart-listing tool, so chart_id is only usable if you already have a real chart ID from Amplitude's own UI.`, + params: [ + { + name: 'label', + type: 'string', + required: true, + description: `The annotation's display label.`, + }, + { + name: 'start', + type: 'string', + required: true, + description: `Start of the annotation's date (or date range), ISO 8601 format (YYYY-MM-DDThh:mmTZD).`, + }, + { + name: 'category', + type: 'string', + required: false, + description: `Name of the annotation category to file this under.`, + }, + { + name: 'chart_id', + type: 'string', + required: false, + description: `The chart to scope this annotation to. Omit to create a global annotation visible on all charts.`, + }, + { + name: 'details', + type: 'string', + required: false, + description: `Extra free-text details about the annotation.`, + }, + { + name: 'end', + type: 'string', + required: false, + description: `End of the annotation's date range, ISO 8601 format (YYYY-MM-DDThh:mmTZD). Omit for a single-date annotation.`, + }, + ], + }, + { + name: 'amplitudeanalytics_create_annotation_category', + description: `Create a new category for organizing chart annotations in Amplitude.`, + params: [ + { + name: 'category', + type: 'string', + required: true, + description: `The name of the category to create.`, + }, + ], + }, + { + name: 'amplitudeanalytics_create_dsar_request', + description: `Create a Data Subject Access Request (DSAR) job that collects all of a specific user's data from Amplitude for a given date range. Requires a connected account whose API Key/Secret Key fields hold Amplitude's ORGANIZATION-level credentials, not the project-level credentials most other tools in this connector use — create a separate connected account with this connector and enter your organization's API Key and Secret Key in the same username/password fields. Amplitude's org-level keys are not self-service — request them from Amplitude Support (per Amplitude's own docs), they are not generated via the dashboard like project-level keys. CONFIRMED (live-tested): calling this with project-level credentials instead correctly returns a clean 403 'Invalid API Key' — routing, auth header construction, and body mapping all reach Amplitude correctly; the only blocker is the credential tier. Identify the data subject with user_id, amplitude_id, or both — user_id is required if amplitude_id is not set, and amplitude_id is required if user_id is not set; this cross-field requirement cannot be enforced by the input schema alone. Returns 202 Accepted with a numeric requestId — poll amplitudeanalytics_get_dsar_request_status with that ID until the job completes, then download the results with amplitudeanalytics_get_dsar_output_file.`, + params: [ + { + name: 'end_date', + type: 'string', + required: true, + description: `End of the date range to collect the user's data for, in YYYY-MM-DD format.`, + }, + { + name: 'start_date', + type: 'string', + required: true, + description: `Start of the date range to collect the user's data for, in YYYY-MM-DD format.`, + }, + { + name: 'amplitude_id', + type: 'integer', + required: false, + description: `Amplitude's numeric user ID for the data subject. Required if user_id is not set.`, + }, + { + name: 'user_id', + type: 'string', + required: false, + description: `Your application's user ID for the data subject. Required if amplitude_id is not set.`, + }, + ], + }, + { + name: 'amplitudeanalytics_create_event_category', + description: `Create a new event category in Amplitude's taxonomy, used to group related event types.`, + params: [ + { + name: 'category_name', + type: 'string', + required: true, + description: `The name of the event category to create.`, + }, + ], + }, + { + name: 'amplitudeanalytics_create_event_property', + description: `Create a new event property in Amplitude's taxonomy. If event_type is set, this creates an event-specific property override for that event type; if omitted, this creates a shared property used across all events.`, + params: [ + { + name: 'event_property', + type: 'string', + required: true, + description: `The name of the event property to create.`, + }, + { + name: 'classifications', + type: 'string', + required: false, + description: `Comma-separated classification tags to apply to this property, from: PII, SENSITIVE, REVENUE. Only valid on shared properties — setting this on an event-specific override returns an error.`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `A human-readable description of what this event property represents.`, + }, + { + name: 'enum_values', + type: 'string', + required: false, + description: `Comma-separated list of allowed values for this property. Only valid when type is 'enum'.`, + }, + { + name: 'event_type', + type: 'string', + required: false, + description: `If set, scopes this as an event-specific property override for this event type. If omitted, creates a shared property used across all events.`, + }, + { + name: 'is_array_type', + type: 'boolean', + required: false, + description: `Whether this property's values are an array of the given type rather than a single value.`, + }, + { + name: 'is_hidden', + type: 'boolean', + required: false, + description: `Whether this property is hidden from the Amplitude UI. Only settable on already-ingested properties.`, + }, + { + name: 'is_required', + type: 'boolean', + required: false, + description: `Whether this property is required to be present on every occurrence of the event.`, + }, + { + name: 'regex', + type: 'string', + required: false, + description: `A regular expression the property's values must match. Only valid when type is 'string'.`, + }, + { name: 'type', type: 'string', required: false, description: `The property's data type.` }, + ], + }, + { + name: 'amplitudeanalytics_create_event_type', + description: `Create a new event type in Amplitude's taxonomy, optionally assigning it a category, description, tags, owner, and visibility flags.`, + params: [ + { + name: 'event_type', + type: 'string', + required: true, + description: `The name of the event type to create.`, + }, + { + name: 'category', + type: 'string', + required: false, + description: `Name of an existing event category to assign this event type to.`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `Free-text description of what this event type represents.`, + }, + { + name: 'is_active', + type: 'boolean', + required: false, + description: `Whether the event type is active. If omitted, Amplitude applies its own default.`, + }, + { + name: 'is_hidden_from_dropdowns', + type: 'boolean', + required: false, + description: `Whether to hide this event type from dropdown selectors. CONFIRMED (live-tested): this took effect immediately on a purely taxonomy-declared event type that was never actually ingested — contrary to Amplitude's documented 'only settable on already-ingested event types' — and setting it true made amplitudeanalytics_get_event_type return 'Not found' for that event even though it remained fully visible in amplitudeanalytics_list_event_types.`, + }, + { + name: 'is_hidden_from_pathfinder', + type: 'boolean', + required: false, + description: `Whether to hide this event type from Pathfinder. Amplitude documents this as only settable on already-ingested event types; not independently verified (the sibling is_hidden_from_dropdowns field was confirmed to take effect immediately on a never-ingested event, contrary to its own equivalent documentation, so this one may behave the same way — unconfirmed).`, + }, + { + name: 'is_hidden_from_persona_results', + type: 'boolean', + required: false, + description: `Whether to hide this event type from Persona results. Amplitude documents this as only settable on already-ingested event types; not independently verified (the sibling is_hidden_from_dropdowns field was confirmed to take effect immediately on a never-ingested event, contrary to its own equivalent documentation, so this one may behave the same way — unconfirmed).`, + }, + { + name: 'is_hidden_from_timeline', + type: 'boolean', + required: false, + description: `Whether to hide this event type from Timeline. Amplitude documents this as only settable on already-ingested event types; not independently verified (the sibling is_hidden_from_dropdowns field was confirmed to take effect immediately on a never-ingested event, contrary to its own equivalent documentation, so this one may behave the same way — unconfirmed).`, + }, + { + name: 'owner', + type: 'string', + required: false, + description: `Identifier or email of the event type's owner.`, + }, + { + name: 'tags', + type: 'string', + required: false, + description: `Comma-separated list of tags to apply to this event type.`, + }, + ], + }, + { + name: 'amplitudeanalytics_create_group_property', + description: `Create a new group property in Amplitude's Taxonomy — a custom property scoped to a specific group type (e.g. 'org', 'company') rather than to users or events. Only group_property and group_type are explicitly confirmed by Amplitude's group-property docs; the remaining descriptive fields (description, type, regex, enum_values, is_array_type, is_hidden, classifications) are inferred by analogy with the sibling event/user property taxonomy endpoints and are not explicitly documented for group properties — an incorrect one is simply rejected with a 400, not destructive. No delete or restore endpoint exists for group properties.`, + params: [ + { + name: 'group_property', + type: 'string', + required: true, + description: `The name of the group property to create. Per Amplitude's Taxonomy docs, custom group properties may need a 'grp:' prefix (platform-defined properties do not) — this field is confirmed by Amplitude's docs, but verify the exact prefix convention against your account.`, + }, + { + name: 'classifications', + type: 'string', + required: false, + description: `Data classification tags to apply to this property (e.g. PII markers), matching whatever classifications are configured in the Amplitude project's data governance settings. INFERRED from the sibling event/user property taxonomy endpoints — Amplitude's group-property docs do not confirm this field exists for group properties; verify empirically before relying on it.`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `Human-readable description of what this property represents. INFERRED from the sibling event/user property taxonomy endpoints — not explicitly confirmed for group properties by Amplitude's docs; verify empirically before relying on it.`, + }, + { + name: 'enum_values', + type: 'string', + required: false, + description: `Allowed values for this property when type is 'enum'. INFERRED from the sibling event/user property taxonomy endpoints, including the assumption that it's a plain string here rather than an array — not explicitly confirmed for group properties by Amplitude's docs; verify the exact expected format empirically.`, + }, + { + name: 'group_type', + type: 'string', + required: false, + description: `The group type this property belongs to (e.g. 'org', 'company'). Confirmed by Amplitude's Taxonomy docs as a valid create field. Returns 404 if the group type doesn't exist, 409 if the property already exists on that type.`, + }, + { + name: 'is_array_type', + type: 'boolean', + required: false, + description: `Whether this property holds an array of values rather than a single value. INFERRED from the sibling event/user property taxonomy endpoints — not explicitly confirmed for group properties by Amplitude's docs; verify empirically before relying on it.`, + }, + { + name: 'is_hidden', + type: 'boolean', + required: false, + description: `Whether this property is hidden from Amplitude's UI pickers (e.g. the chart builder's property list). INFERRED from the sibling event/user property taxonomy endpoints — not explicitly confirmed for group properties by Amplitude's docs; verify empirically before relying on it.`, + }, + { + name: 'regex', + type: 'string', + required: false, + description: `A regular expression that values of this property must match. INFERRED from the sibling event/user property taxonomy endpoints — not explicitly confirmed for group properties by Amplitude's docs; verify empirically before relying on it.`, + }, + { + name: 'type', + type: 'string', + required: false, + description: `The data type of this property. INFERRED from the sibling event/user property taxonomy endpoints — not explicitly confirmed for group properties by Amplitude's docs; verify empirically before relying on it.`, + }, + ], + }, + { + name: 'amplitudeanalytics_create_release', + description: `Create a release annotation in Amplitude, marking a version rollout with a start (and optionally end) time. When chart_visibility is true (the default), the release appears as an annotation on charts. Amplitude's docs only document a 200 success response and a 400 bad-request response for this endpoint — there is no documented 201.`, + params: [ + { + name: 'release_start', + type: 'string', + required: true, + description: `Start date/time of the release window, format 'yyyy-MM-dd HH:mm:ss' in UTC.`, + }, + { + name: 'title', + type: 'string', + required: true, + description: `Name of this release, shown wherever the release annotation is displayed.`, + }, + { + name: 'version', + type: 'string', + required: true, + description: `Version identifier for this release.`, + }, + { + name: 'chart_visibility', + type: 'boolean', + required: false, + description: `When true, this release appears as an annotation on charts. Defaults to true.`, + }, + { + name: 'created_by', + type: 'string', + required: false, + description: `Name or identifier of who created this release, for display purposes.`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `Free-text description of what this release contains.`, + }, + { + name: 'platforms', + type: 'array', + required: false, + description: `Platforms this release applies to.`, + }, + { + name: 'release_end', + type: 'string', + required: false, + description: `End date/time of the release window, format 'yyyy-MM-dd HH:mm:ss' in UTC. Omit for an open-ended release.`, + }, + ], + }, + { + name: 'amplitudeanalytics_create_user_property', + description: `Create a new user property in Amplitude's taxonomy. Unlike event properties, user properties have no event_type or is_required field — they always apply globally to the user profile, not to a specific event.`, + params: [ + { + name: 'user_property', + type: 'string', + required: true, + description: `The name of the user property to create. CONFIRMED (live-tested): Amplitude auto-prepends 'gp:' to custom user property names regardless of whether you include it here — the property is always stored with the prefix. Use amplitudeanalytics_list_user_properties afterward to see the actual stored name, and use that exact name (with 'gp:') for amplitudeanalytics_get_user_property.`, + }, + { + name: 'classifications', + type: 'string', + required: false, + description: `Comma-separated classification tags to apply to this property, from: PII, SENSITIVE, REVENUE.`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `A human-readable description of what this user property represents.`, + }, + { + name: 'enum_values', + type: 'string', + required: false, + description: `Comma-separated list of allowed values for this property. Only valid when type is 'enum'.`, + }, + { + name: 'is_array_type', + type: 'boolean', + required: false, + description: `Whether this property's values are an array of the given type rather than a single value.`, + }, + { + name: 'is_hidden', + type: 'boolean', + required: false, + description: `Whether this property is hidden from the Amplitude UI.`, + }, + { + name: 'regex', + type: 'string', + required: false, + description: `A regular expression the property's values must match. Only valid when type is 'string'.`, + }, + { name: 'type', type: 'string', required: false, description: `The property's data type.` }, + ], + }, + { + name: 'amplitudeanalytics_delete_annotation', + description: `Permanently delete a chart annotation from Amplitude.`, + params: [ + { + name: 'annotation_id', + type: 'integer', + required: true, + description: `The ID of the annotation to delete.`, + }, + ], + }, + { + name: 'amplitudeanalytics_delete_annotation_category', + description: `Permanently delete a chart annotation category from Amplitude. This does not delete the annotations that used this category, only the category grouping itself.`, + params: [ + { + name: 'category_id', + type: 'integer', + required: true, + description: `The ID of the annotation category to delete.`, + }, + ], + }, + { + name: 'amplitudeanalytics_delete_event_category', + description: `Permanently delete an event category from Amplitude's taxonomy.`, + params: [ + { + name: 'category_id', + type: 'string', + required: true, + description: `The id of the event category to delete, as used in the Amplitude Taxonomy API path. Treated as an opaque string identifier (not necessarily numeric).`, + }, + ], + }, + { + name: 'amplitudeanalytics_delete_event_property', + description: `Delete an event property from Amplitude's taxonomy. amplitudeanalytics_restore_event_property can undo this, but CONFIRMED (live-tested) only for properties that were previously 'live' (actually seen on ingested events) — deleting a purely taxonomy-declared property that was never ingested removes it entirely, and restore will then fail with 'Not found'.`, + params: [ + { + name: 'event_property', + type: 'string', + required: true, + description: `The name of the event property to delete.`, + }, + ], + }, + { + name: 'amplitudeanalytics_delete_event_type', + description: `Delete an event type from Amplitude's taxonomy. Deletion is state-machine driven: a 'live' event type is marked deleted; an 'unexpected' event type is first added to the tracking plan then deleted; a 'planned' event type is simply removed from the plan; a 'transformed' event type CANNOT be deleted (the API returns an error); an already-deleted or not-found event type also errors. CONFIRMED (live-tested): for a 'planned' event type — i.e. one created directly through amplitudeanalytics_create_event_type and never actually ingested — deletion fully removes it from the plan rather than soft-deleting it. amplitudeanalytics_restore_event_type will fail with 'Not found' afterward; restore only works for event types that were previously 'live' (actually ingested) before being soft-deleted.`, + params: [ + { + name: 'event_type', + type: 'string', + required: true, + description: `The name of the event type to delete.`, + }, + ], + }, + { + name: 'amplitudeanalytics_delete_user_property', + description: `Delete a custom user property from Amplitude's taxonomy. Amplitude-owned (built-in) user properties cannot be deleted through this API and will return an error. amplitudeanalytics_restore_user_property can undo this, but CONFIRMED (live-tested) only for properties that were previously 'live' (actually seen on ingested events) — deleting a purely taxonomy-declared property that was never ingested removes it entirely, and restore will then fail with 'Not found'.`, + params: [ + { + name: 'user_property', + type: 'string', + required: true, + description: `The name of the user property to delete. Amplitude-owned (built-in) user properties cannot be deleted through this API and will return an error.`, + }, + ], + }, + { + name: 'amplitudeanalytics_export_events', + description: `Export raw event data uploaded to Amplitude within a date range as a zip archive of NDJSON files. The response is a binary zip file, not JSON — save it to disk rather than parsing it as JSON. start and end use the YYYYMMDDTHH format (e.g. 20220201T05), and the start-end range cannot exceed 365 days. Exported events reflect each event's upload time to Amplitude, not its original client-side event time, and typically become available roughly 2 hours after upload. The response is capped at 4GB; a range that would exceed that returns a 400 error — use Amplitude's Amazon S3 export instead for larger data. Returns 404 if there is no data in the requested range, and 504 if the export is too large and times out while being generated.`, + params: [ + { + name: 'end', + type: 'string', + required: true, + description: `End of the export range, in YYYYMMDDTHH format (year, month, day, hour). The start-end range cannot exceed 365 days.`, + }, + { + name: 'start', + type: 'string', + required: true, + description: `Start of the export range, in YYYYMMDDTHH format (year, month, day, hour).`, + }, + ], + }, + { + name: 'amplitudeanalytics_get_annotation', + description: `Retrieve a single chart annotation by its ID.`, + params: [ + { + name: 'annotation_id', + type: 'integer', + required: true, + description: `The ID of the annotation to retrieve.`, + }, + ], + }, + { + name: 'amplitudeanalytics_get_annotation_category', + description: `Retrieve a single chart annotation category by its ID.`, + params: [ + { + name: 'category_id', + type: 'integer', + required: true, + description: `The ID of the annotation category to retrieve.`, + }, + ], + }, + { + name: 'amplitudeanalytics_get_cohort_membership_file', + description: `Download the completed cohort membership export started with amplitudeanalytics_request_cohort_membership, once amplitudeanalytics_get_cohort_membership_status reports it complete. Small cohorts return the gzip-compressed member data directly; large cohorts return an HTTP 302 redirect to a pre-signed download URL valid for 1 minute (the request_id-based link itself stays valid for 7 days). CONFIRMED (live-tested): routing, auth, and path-templating all work correctly — a numeric request_id gets a clean, well-formed error: {"details":"Cohort download not found"}. IMPORTANT CONFIRMED QUIRK (same pattern as get_cohort_membership_status and the DSAR API's get_dsar_request_status): a non-numeric request_id instead returns a generic, unhelpful raw HTML '404: Not Found' from an edge/routing layer in front of Amplitude, before its own logic runs. Always pass the exact request_id returned by amplitudeanalytics_request_cohort_membership.`, + params: [ + { + name: 'request_id', + type: 'string', + required: true, + description: `The request_id returned by amplitudeanalytics_request_cohort_membership, must be in a completed state per amplitudeanalytics_get_cohort_membership_status. CONFIRMED: a non-numeric value returns a generic, unhelpful raw HTML 404 rather than a clear error (same pattern as the DSAR API's request_id) — always use the exact value returned.`, + }, + ], + }, + { + name: 'amplitudeanalytics_get_cohort_membership_status', + description: `Check the status of an asynchronous cohort membership export previously started with amplitudeanalytics_request_cohort_membership. Once the status reports completion, call amplitudeanalytics_get_cohort_membership_file to download the data. Note: Amplitude's documented async_status values are inconsistently formatted across their own sources (space-separated like "JOB COMPLETED" on the current docs page, vs underscore-separated "JOB_COMPLETED" seen elsewhere) — treat the exact string loosely (e.g. case/format-insensitive contains-"COMPLETE" check) rather than a strict equality match. CONFIRMED (live-tested): routing, auth, and path-templating all work correctly — a numeric request_id (matching the numeric-looking IDs Amplitude actually issues) gets a clean, well-formed error: {"details":"No job exists with request_id: "}. IMPORTANT CONFIRMED QUIRK (same pattern found on the DSAR API's get_dsar_request_status): a non-numeric request_id instead returns a generic, unhelpful raw HTML '404: Not Found' from what appears to be an edge/routing layer in front of Amplitude, before its own logic runs. Always pass the exact request_id string returned by amplitudeanalytics_request_cohort_membership, not an arbitrary placeholder.`, + params: [ + { + name: 'request_id', + type: 'string', + required: true, + description: `The request_id returned by amplitudeanalytics_request_cohort_membership. CONFIRMED: a non-numeric value returns a generic, unhelpful raw HTML 404 rather than a clear error (same pattern as the DSAR API's request_id) — always use the exact value amplitudeanalytics_request_cohort_membership returned.`, + }, + ], + }, + { + name: 'amplitudeanalytics_get_cohort_usage', + description: `Check how much of the Behavioral Cohorts Download API's monthly quota has been used. Growth and Enterprise plans are limited to 500 download requests per month; this shows the current usage count and when it resets.`, + params: [], + }, + { + name: 'amplitudeanalytics_get_dsar_output_file', + description: `Download a single completed output file from a Data Subject Access Request (DSAR) job. Requires a connected account whose API Key/Secret Key fields hold Amplitude's ORGANIZATION-level credentials, not the project-level credentials most other tools in this connector use — use the same separate, organization-credentialed connected account you used to create the request. Amplitude's org-level keys are not self-service — request them from Amplitude Support. CONFIRMED (live-tested): calling this with project-level credentials instead correctly returns a clean 403 'Invalid API Key' — routing and path-templating reach Amplitude correctly; the only blocker is the credential tier. Call this only after amplitudeanalytics_get_dsar_request_status reports the job's status as done, using the request_id of that job and an output_id taken from one of the URLs in its urls list. The response is the raw output file itself, not JSON.`, + params: [ + { + name: 'output_id', + type: 'integer', + required: true, + description: `An integer identifying which output file to download, taken from one of the download URLs in amplitudeanalytics_get_dsar_request_status's urls list.`, + }, + { + name: 'request_id', + type: 'integer', + required: true, + description: `The requestId of the DSAR job, from amplitudeanalytics_create_dsar_request or amplitudeanalytics_get_dsar_request_status.`, + }, + ], + }, + { + name: 'amplitudeanalytics_get_dsar_request_status', + description: `Check the status of a Data Subject Access Request (DSAR) job previously created with amplitudeanalytics_create_dsar_request. Requires a connected account whose API Key/Secret Key fields hold Amplitude's ORGANIZATION-level credentials, not the project-level credentials most other tools in this connector use — use the same separate, organization-credentialed connected account you used to create the request. Amplitude's org-level keys are not self-service — request them from Amplitude Support. CONFIRMED (live-tested): calling this with project-level credentials and a purely numeric request_id (matching the integer requestId Amplitude actually returns from create_dsar_request) correctly returns a clean 403 'Invalid API Key' — routing and path-templating reach Amplitude correctly; the only blocker is the credential tier. FIXED: request_id is typed as an integer (matching the requestId Amplitude actually returns and amplitudeanalytics_get_dsar_output_file's own request_id type) specifically because a non-numeric value was confirmed to produce a generic, unhelpful raw HTML '404: Not Found' from a routing layer in front of Amplitude, instead of a clear error — the integer type now rejects a malformed value immediately with a clear schema-validation error rather than letting it round-trip to that confusing response. The response includes status (one of staging, submitted, done, or failed), failReason if the job failed, urls with download links once the job is done, and expires indicating when those download links expire. Once status is done, download the output files with amplitudeanalytics_get_dsar_output_file.`, + params: [ + { + name: 'request_id', + type: 'integer', + required: true, + description: `The requestId returned when the DSAR job was created with amplitudeanalytics_create_dsar_request, used to check this specific job's status. Typed as an integer (not a string) because a non-numeric value was confirmed to produce a confusing raw HTML 404 from a routing layer in front of Amplitude, rather than a clear error — this type constraint rejects bad input immediately instead.`, + }, + ], + }, + { + name: 'amplitudeanalytics_get_event_category', + description: `Retrieve a single event category from Amplitude's taxonomy, looked up by its category_name. Unlike amplitudeanalytics_update_event_category and amplitudeanalytics_delete_event_category (which are keyed by category_id), this endpoint is keyed by category_name — this matches Amplitude's documented Taxonomy API and is not an inconsistency to fix.`, + params: [ + { + name: 'category_name', + type: 'string', + required: true, + description: `The name of the event category to retrieve.`, + }, + ], + }, + { + name: 'amplitudeanalytics_get_event_segmentation', + description: `Pull Event Segmentation chart data from the Amplitude Dashboard REST API: measure an event (uniques, totals, or another metric) over a date range, with optional segment filters and up to two group-by properties. Rate limits: 5 concurrent requests shared with other Amplitude Dashboard/Cohort API calls. CONFIRMED (live-tested): the measurement values histogram, sums, and value_avg require a group-by, but NOT via the separate group_by field on this tool — that field maps to the chart-level g parameter, which these three measurement types ignore for their own validation. Instead, embed group_by directly inside the event field's own JSON string, e.g. event: '{"event_type":"session_start","group_by":[{"type":"event","value":"gp:country"}]}'. Without this, Amplitude rejects the request with 'Missing required group bys' regardless of what the group_by field is set to. uniques, totals, average, pct_dau, and formula do not have this requirement and work correctly with the separate group_by/second_group_by fields.`, + params: [ + { + name: 'end', + type: 'string', + required: true, + description: `End date of the query range, format YYYYMMDD (e.g. 20260131).`, + }, + { + name: 'event', + type: 'string', + required: true, + description: `JSON-encoded primary event definition: {"event_type": "...", "filters"?: [{"subprop_type", "subprop_key", "subprop_op", "subprop_value"}], "group_by"?: [{"type", "value"}]}. Example: {"event_type":"sign_up"}.`, + }, + { + name: 'start', + type: 'string', + required: true, + description: `Start date of the query range, format YYYYMMDD (e.g. 20260101).`, + }, + { + name: 'formula', + type: 'string', + required: false, + description: `Formula expression combining event A and (optionally) event B, e.g. "UNIQUES(A)/UNIQUES(B)". Required only when measurement is set to "formula"; ignored otherwise.`, + }, + { + name: 'group_by', + type: 'string', + required: false, + description: `Property to group results by, e.g. gp:country or a user/event property name.`, + }, + { + name: 'interval', + type: 'integer', + required: false, + description: `Time bucket size for the returned series: -300000 (real-time), -3600000 (hourly), 1 (daily), 7 (weekly), or 30 (monthly). Defaults to 1.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of group-by values to return (max 1000). Defaults to 100.`, + }, + { + name: 'measurement', + type: 'string', + required: false, + description: `Aggregation to compute: uniques, totals, pct_dau, average, histogram, sums, value_avg, or formula. Defaults to uniques. CONFIRMED: histogram, sums, and value_avg require a group-by embedded inside the event field's own JSON (e.g. {"event_type":"...","group_by":[{"type":"event","value":"gp:country"}]}) — the separate group_by field on this tool does not satisfy this requirement for these three measurements specifically.`, + }, + { + name: 'rolling_average', + type: 'integer', + required: false, + description: `Rolling average window size, in units of the chosen interval (days/weeks/months). Smooths the returned series.`, + }, + { + name: 'rolling_window', + type: 'integer', + required: false, + description: `Rolling window size, in units of the chosen interval (days/weeks/months). Aggregates each point over a trailing window.`, + }, + { + name: 'second_event', + type: 'string', + required: false, + description: `JSON-encoded second event definition, same shape as event. Used together with formula to compare two events.`, + }, + { + name: 'second_group_by', + type: 'string', + required: false, + description: `Second property to group results by, applied after group_by.`, + }, + { + name: 'segment_definitions', + type: 'string', + required: false, + description: `JSON-encoded array of segment definitions to split the event by cohort/property segments, e.g. [{"prop":"gp:country","op":"is","values":["US"]}].`, + }, + { + name: 'user_type', + type: 'string', + required: false, + description: `Restrict the measurement to a user type: any (all users) or active (only currently active users). Defaults to any.`, + }, + ], + }, + { + name: 'amplitudeanalytics_get_event_streaming_metrics', + description: `Get the delivery-metrics summary for an Amplitude Event Streaming sync over a time window. The response includes timePeriod, eventsDelivered, eventsNotDelivered, deliveryRate, latencyInSeconds (p95), successOnFirstAttempt, successAfterRetry, eventsExpired, and eventsDiscarded. Amplitude retains at most 90 days of data for this endpoint — requesting an older range returns a 500 error.`, + params: [ + { + name: 'sync_id', + type: 'string', + required: true, + description: `The Event Streaming sync to get delivery metrics for.`, + }, + { + name: 'time_period', + type: 'string', + required: true, + description: `Preset time window to summarize metrics over. Use CUSTOM together with start and end for an explicit window.`, + }, + { + name: 'end', + type: 'string', + required: false, + description: `Exclusive end of the custom time window, ISO 8601. Required only when time_period is CUSTOM.`, + }, + { + name: 'start', + type: 'string', + required: false, + description: `Inclusive start of the custom time window, ISO 8601. Required only when time_period is CUSTOM.`, + }, + ], + }, + { + name: 'amplitudeanalytics_get_event_type', + description: `Retrieve a single event type from Amplitude's taxonomy by its event_type name. CONFIRMED (live-tested): if the event type has is_hidden_from_dropdowns set to true, this single-item lookup returns 'Not found' even though the event type still fully exists and appears in amplitudeanalytics_list_event_types — this is a real, reproducible quirk of this specific endpoint, not a sign the event is missing. If a lookup unexpectedly 404s, check amplitudeanalytics_list_event_types first before assuming the event doesn't exist.`, + params: [ + { + name: 'event_type', + type: 'string', + required: true, + description: `The name of the event type to retrieve.`, + }, + ], + }, + { + name: 'amplitudeanalytics_get_funnel_results', + description: `Pull Funnel Analysis chart data from the Amplitude Dashboard REST API: step-by-step conversion and drop-off for an ordered (or unordered/sequential) sequence of two or more events over a date range. Rate limits: 5 concurrent requests shared with other Amplitude Dashboard/Cohort API calls.`, + params: [ + { + name: 'end', + type: 'string', + required: true, + description: `End date of the query range, format YYYYMMDD (e.g. 20260131).`, + }, + { + name: 'funnel_steps', + type: 'array', + required: true, + description: `Ordered array of JSON-encoded event definitions describing the funnel steps, at least 2 required, e.g. ["{\\"event_type\\":\\"sign_up\\"}", "{\\"event_type\\":\\"activated\\"}"]. Each array element is sent as a repeated \`e\` query parameter in step order.`, + }, + { + name: 'start', + type: 'string', + required: true, + description: `Start date of the query range, format YYYYMMDD (e.g. 20260101).`, + }, + { + name: 'conversion_window_seconds', + type: 'integer', + required: false, + description: `Maximum time, in seconds, a user has to complete the full funnel after the first step. Defaults to 2592000 (30 days).`, + }, + { + name: 'group_by', + type: 'string', + required: false, + description: `Property to group results by, e.g. gp:country. Funnels support only one group-by property (unlike event segmentation, which supports two).`, + }, + { + name: 'interval', + type: 'integer', + required: false, + description: `Time bucket size for the returned series: -300000 (real-time), -3600000 (hourly), 1 (daily), 7 (weekly), or 30 (monthly). Defaults to 1.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of group-by values to return (max 1000). Defaults to 100.`, + }, + { + name: 'mode', + type: 'string', + required: false, + description: `Step-order strictness: ordered (steps must occur in the given order), unordered (any order), or sequential (given order, with no other funnel events occurring in between). Defaults to ordered.`, + }, + { + name: 'segment_definitions', + type: 'string', + required: false, + description: `JSON-encoded array of segment definitions to split the funnel by cohort/property segments, e.g. [{"prop":"gp:country","op":"is","values":["US"]}].`, + }, + { + name: 'user_filter', + type: 'string', + required: false, + description: `Restrict the funnel to a user type: new (users new in the date range) or active (currently active users). Defaults to active. Note: this is a DIFFERENT enum than amplitudeanalytics_get_event_segmentation's user_type field (which uses any/active).`, + }, + ], + }, + { + name: 'amplitudeanalytics_get_group_property', + description: `Retrieve a single group property from Amplitude's Taxonomy by name.`, + params: [ + { + name: 'group_property', + type: 'string', + required: true, + description: `The name of the group property to retrieve.`, + }, + ], + }, + { + name: 'amplitudeanalytics_get_session_replay_files', + description: `Get download links for a single Amplitude session replay's recorded event files. Returns a files array of presigned S3 URLs — these URLs expire after 15 minutes, so download the files promptly after calling this.`, + params: [ + { + name: 'replay_id', + type: 'string', + required: true, + description: `The replay to fetch files for, formatted as 'device_id/session_id'.`, + }, + { + name: 'page_size', + type: 'integer', + required: false, + description: `Maximum number of file entries to return per page. Maximum 1000.`, + }, + { + name: 'page_token', + type: 'string', + required: false, + description: `Opaque pagination cursor from a previous response.`, + }, + { + name: 'version', + type: 'integer', + required: false, + description: `Session replay data format version to request.`, + }, + ], + }, + { + name: 'amplitudeanalytics_get_user_mapping', + description: `Look up user identity mappings (aliases) for one or more Amplitude user IDs. The response is an object keyed by each requested user_id, where each value has mapped_from[] and mapped_to[] arrays of {amplitude_id, user_id} pairs describing merged/aliased identities. This is the only User Mapping (Aliasing) API endpoint included in this connector — it uses project-level HTTP Basic Auth, matching the rest of this connector's tools, while the write/map/unmap endpoints live on a different host entirely and are intentionally excluded. CONFIRMED (live-tested): this parameter is genuinely sent as a JSON request body on a GET request (non-standard, but this codebase's HTTP layer attaches a body regardless of method) — an empty user_ids array produced the specific Amplitude error 'Request must have a list of userIds', which only makes sense if Amplitude actually received and inspected the array, proving the GET-with-body mechanism delivers this field end-to-end.`, + params: [ + { + name: 'user_ids', + type: 'array', + required: true, + description: `Amplitude user IDs to look up mappings for (1 to 100 IDs per request).`, + }, + ], + }, + { + name: 'amplitudeanalytics_get_user_property', + description: `Retrieve a single user property by name from Amplitude's taxonomy. CONFIRMED (live-tested): Amplitude auto-prepends 'gp:' to custom user property names on creation regardless of what name amplitudeanalytics_create_user_property was called with — use amplitudeanalytics_list_user_properties to see each property's actual stored name (e.g. 'gp:plan_type'), and pass that exact name here. Passing the plain, unprefixed name returns 'Not found' even immediately after a successful create.`, + params: [ + { + name: 'user_property', + type: 'string', + required: true, + description: `The name of the user property to retrieve, exactly as stored by Amplitude. CONFIRMED: custom properties are auto-prefixed with 'gp:' on creation — use amplitudeanalytics_list_user_properties to find the exact stored name if a plain lookup returns 'Not found'.`, + }, + ], + }, + { + name: 'amplitudeanalytics_list_annotation_categories', + description: `List all chart annotation categories in the Amplitude project, or filter to a single category by name.`, + params: [ + { + name: 'category', + type: 'string', + required: false, + description: `If set, only returns the category matching this exact name instead of all categories.`, + }, + ], + }, + { + name: 'amplitudeanalytics_list_annotations', + description: `List chart annotations, optionally filtered by category, by chart, or by a date range. CONFIRMED (live-tested): category and chart_id do NOT combine as a logical AND, and Amplitude does NOT error if both are set — category silently wins and chart_id is dropped entirely, even when the chart_id value is otherwise invalid (an invalid chart_id alone 404s, but the identical value alongside a valid category causes no error at all). Set only one of the two at a time; if both are set, only category takes effect. chart_id also only accepts real chart IDs already known to Amplitude's project (it 404s on an unknown value) — this connector has no chart-listing tool, so chart-scoped filtering/annotations are only usable if you already have a real chart_id from Amplitude's own UI.`, + params: [ + { + name: 'category', + type: 'string', + required: false, + description: `Filter to annotations in this category. CONFIRMED: if chart_id is also set, this one silently wins — chart_id is dropped without error.`, + }, + { + name: 'chart_id', + type: 'string', + required: false, + description: `Filter to annotations scoped to this chart. CONFIRMED: if category is also set, this field is silently ignored (no error, no effect) — category wins. Must be a real chart ID Amplitude recognizes; an unknown value 404s when used alone.`, + }, + { + name: 'end', + type: 'string', + required: false, + description: `Only return annotations before this ISO 8601 timestamp.`, + }, + { + name: 'start', + type: 'string', + required: false, + description: `Only return annotations after this ISO 8601 timestamp.`, + }, + ], + }, + { + name: 'amplitudeanalytics_list_cohorts', + description: `List all behavioral cohorts defined in the Amplitude project. Returns each cohort's id, name, description, size, published/archived state, owners, viewers, definition, and last-computed time. Use this to find a cohort's id before calling amplitudeanalytics_request_cohort_membership.`, + params: [ + { + name: 'include_sync_info', + type: 'boolean', + required: false, + description: `If true, include each cohort's sync destination metadata (syncMetadata) in the response — e.g. which downstream destinations (ad platforms, warehouses) the cohort is synced to. Defaults to false.`, + }, + ], + }, + { + name: 'amplitudeanalytics_list_event_categories', + description: `List all event categories defined in Amplitude's taxonomy.`, + params: [], + }, + { + name: 'amplitudeanalytics_list_event_properties', + description: `Get the event properties defined in Amplitude's taxonomy — either the shared properties used across all events, or (if event_type is set) the properties specific to one event type. Note: per Amplitude's documentation, this parameter is sent as a JSON request body on a GET request (non-standard); this matches the documented behavior but has not been empirically verified against a live account — if it fails, the parameter may need to move to a query string instead.`, + params: [ + { + name: 'event_type', + type: 'string', + required: false, + description: `If set, returns properties specific to this event type. If omitted, returns the shared properties used across all events.`, + }, + ], + }, + { + name: 'amplitudeanalytics_list_event_types', + description: `List event types defined in Amplitude's taxonomy, optionally including deleted ones.`, + params: [ + { + name: 'show_deleted', + type: 'boolean', + required: false, + description: `Include deleted event types in the results. Defaults to excluding them.`, + }, + ], + }, + { + name: 'amplitudeanalytics_list_group_properties', + description: `List group properties defined in Amplitude's Taxonomy. Pass group_type to scope the list to that group type (e.g. 'org'); omit it to list properties shared across group types rather than any single type's properties.`, + params: [ + { + name: 'group_type', + type: 'string', + required: false, + description: `Group type to filter the list to. If omitted, returns properties shared across group types rather than any single type's properties.`, + }, + ], + }, + { + name: 'amplitudeanalytics_list_session_replays', + description: `List Amplitude Session Replay recordings, optionally filtered by time range, Amplitude user ID, or an explicit set of replay IDs, with pagination and sort order control. amplitude_id and replay_id are mutually exclusive filters, and replay_id is also mutually exclusive with page_token; when replay_id is set, page_size is ignored and the response's next_page_token is always null. Each replay in the response includes replay_id, session_id, device_id, amplitude_id, start_time, end_time, and retention_in_days, plus a top-level next_page_token for pagination.`, + params: [ + { + name: 'amplitude_id', + type: 'integer', + required: false, + description: `Filter to session replays for this Amplitude user ID. Mutually exclusive with replay_id — set one or the other, not both.`, + }, + { + name: 'end_time', + type: 'string', + required: false, + description: `Upper bound (ISO 8601) on replay start time — only return replays that started before this time.`, + }, + { + name: 'page_size', + type: 'integer', + required: false, + description: `Maximum number of replays to return per page. Maximum 200. Ignored when replay_id is set, since all matching replay_id entries are returned in a single page.`, + }, + { + name: 'page_token', + type: 'string', + required: false, + description: `Opaque pagination cursor from a previous response's next_page_token. Mutually exclusive with replay_id.`, + }, + { + name: 'replay_id', + type: 'array', + required: false, + description: `One or more specific replays to fetch, each formatted as 'device_id/session_id', up to 100 values. Mutually exclusive with amplitude_id and page_token. When set, page_size is ignored and the response's next_page_token is always null.`, + }, + { + name: 'sort_order', + type: 'string', + required: false, + description: `Sort order for results by replay start time.`, + }, + { + name: 'start_time', + type: 'string', + required: false, + description: `Lower bound (ISO 8601) on replay start time — only return replays that started at or after this time.`, + }, + ], + }, + { + name: 'amplitudeanalytics_list_user_deletion_jobs', + description: `List Amplitude user-deletion jobs submitted within a date range. The start_day-end_day range cannot exceed 6 months. Returns an array of job objects, each with day, status (Staging, Submitted, or Done), amplitude_ids (the Amplitude user IDs in that day's job), app, and active_scrub_done_date.`, + params: [ + { + name: 'end_day', + type: 'string', + required: true, + description: `End of the date range to list deletion jobs for, in YYYY-MM-DD format. The start_day-end_day range cannot exceed 6 months.`, + }, + { + name: 'start_day', + type: 'string', + required: true, + description: `Start of the date range to list deletion jobs for, in YYYY-MM-DD format.`, + }, + ], + }, + { + name: 'amplitudeanalytics_list_user_properties', + description: `List user properties in Amplitude's taxonomy, optionally including previously deleted ones.`, + params: [ + { + name: 'show_deleted', + type: 'boolean', + required: false, + description: `Whether to include previously deleted user properties in the results.`, + }, + ], + }, + { + name: 'amplitudeanalytics_remove_user_from_deletion', + description: `Remove a single user from a pending Amplitude user-deletion job before it locks, preventing their data from being deleted. This is a protective/cancel action, not a destructive one. It only works while the job is still in Staging status (within the roughly 3-day window after amplitudeanalytics_submit_user_deletion); once the job's status has flipped to Submitted, it is too late and this call has no effect. Use amplitudeanalytics_list_user_deletion_jobs to confirm a job's current status and day before calling this.`, + params: [ + { + name: 'amplitude_id', + type: 'integer', + required: true, + description: `The Amplitude user ID to remove from the pending deletion job.`, + }, + { + name: 'job_day', + type: 'string', + required: true, + description: `The deletion job's day, in YYYY-MM-DD format — the same day used when the job was originally submitted (see amplitudeanalytics_list_user_deletion_jobs).`, + }, + ], + }, + { + name: 'amplitudeanalytics_request_cohort_membership', + description: `Start an asynchronous export of an Amplitude cohort's membership (the users/devices in the cohort). Returns a request_id — poll amplitudeanalytics_get_cohort_membership_status with that id until it reports completion, then call amplitudeanalytics_get_cohort_membership_file to download the data. Each call starts a NEW export job, so this is not idempotent even though it uses GET. CONFIRMED (live-tested): routing, auth, and path-templating all work correctly — a nonexistent cohort_id gets a bare 404 from Amplitude (not a JSON error body, unlike most other endpoints in this connector; this appears to be how this specific /api/5/cohorts/request/:id endpoint behaves for an unknown cohort, not a connector-side issue).`, + params: [ + { + name: 'cohort_id', + type: 'string', + required: true, + description: `The Amplitude cohort id to export membership for. Find it via amplitudeanalytics_list_cohorts.`, + }, + { + name: 'include_user_properties', + type: 'integer', + required: false, + description: `Set to 1 to include each member's user properties in the exported file, 0 to export identifiers only. Amplitude expects the literal integer 0 or 1, not a boolean. Defaults to 0.`, + }, + { + name: 'property_keys', + type: 'array', + required: false, + description: `Specific user property names to include in the export, only used when include_user_properties is 1. Omit to include all user properties.`, + }, + ], + }, + { + name: 'amplitudeanalytics_restore_event_property', + description: `Restore a previously deleted event property back to active status. CONFIRMED (live-tested): this only works for properties that were 'live' (actually seen on ingested events) before being soft-deleted. For a purely taxonomy-declared property that was never ingested, amplitudeanalytics_delete_event_property removes it entirely rather than soft-deleting it (it also disappears from amplitudeanalytics_list_event_properties, not just from active view), so this restore call fails with 'Not found' — there is nothing left to restore. This mirrors the identical, separately-confirmed behavior of amplitudeanalytics_restore_event_type and amplitudeanalytics_restore_user_property.`, + params: [ + { + name: 'event_property', + type: 'string', + required: true, + description: `The name of the previously deleted event property to restore.`, + }, + ], + }, + { + name: 'amplitudeanalytics_restore_event_type', + description: `Restore a previously deleted event type back to active/tracked status. CONFIRMED (live-tested): this only works for event types that were 'live' (actually ingested) before being soft-deleted. For a purely taxonomy-declared 'planned' event type that was deleted with amplitudeanalytics_delete_event_type, deletion removes it from the plan entirely rather than soft-deleting it, so this restore call will fail with 'Not found' — there is nothing left to restore.`, + params: [ + { + name: 'event_type', + type: 'string', + required: true, + description: `The name of the deleted event type to restore.`, + }, + ], + }, + { + name: 'amplitudeanalytics_restore_user_property', + description: `Restore a previously deleted user property back to active status. CONFIRMED (live-tested): this only works for properties that were 'live' (actually seen on ingested events) before being soft-deleted. For a purely taxonomy-declared property that was never ingested, amplitudeanalytics_delete_user_property removes it entirely rather than soft-deleting it, so this restore call fails with 'Not found' — there is nothing left to restore. This mirrors the identical, separately-confirmed behavior of amplitudeanalytics_restore_event_type and amplitudeanalytics_restore_event_property.`, + params: [ + { + name: 'user_property', + type: 'string', + required: true, + description: `The name of the previously deleted user property to restore.`, + }, + ], + }, + { + name: 'amplitudeanalytics_submit_user_deletion', + description: `Submit a batch job to permanently delete users' data from Amplitude. Provide amplitude_ids, user_ids, or both — at least one is required; the API rejects a request with neither, which this input schema cannot enforce on its own. A single request accepts a maximum of 100 IDs combined across both fields. WARNING: this permanently deletes all of the specified user(s)' data from Amplitude, including backup/recovery systems. There is a roughly 3-day 'staging' window during which amplitudeanalytics_remove_user_from_deletion can still cancel/remove a user from this job; once the job status flips from staging to submitted (after that window), the deletion CANNOT be stopped. A deleted user who later sends new events will simply be recreated as a new user — deletion does not block future tracking.`, + params: [ + { + name: 'amplitude_ids', + type: 'array', + required: false, + description: `Amplitude IDs of the users to permanently delete. At least one of amplitude_ids or user_ids is required.`, + }, + { + name: 'delete_from_org', + type: 'boolean', + required: false, + description: `If true, deletes the user(s) from every project in the Amplitude organization instead of only the project tied to the connected account's credentials. Defaults to false.`, + }, + { + name: 'ignore_invalid_id', + type: 'boolean', + required: false, + description: `If true, invalid or unrecognized IDs in the request are ignored instead of failing the whole request. Note the singular _id in this field name — Amplitude's documented field for this v1 API, distinct from a different, unrelated v2 API that uses the plural ignore_invalid_ids spelling. Defaults to false.`, + }, + { + name: 'include_mapped_user_ids', + type: 'boolean', + required: false, + description: `If true, also deletes data for any additional user IDs merged/mapped to the specified users via Amplitude's User Mapping (aliasing) API. Defaults to false.`, + }, + { + name: 'requester', + type: 'string', + required: false, + description: `Email or identifier of the person requesting this deletion, recorded in Amplitude's audit trail for the job.`, + }, + { + name: 'user_ids', + type: 'array', + required: false, + description: `Your application's user IDs of the users to permanently delete. At least one of amplitude_ids or user_ids is required.`, + }, + ], + }, + { + name: 'amplitudeanalytics_update_annotation', + description: `Partially update an existing chart annotation. Only the fields you provide are changed; omitted fields keep their current value. Set chart_id to null to make a chart-scoped annotation global again. KNOWN AMPLITUDE API BUG (live-tested): setting end to null does NOT clear the end date, despite Amplitude's own documentation stating it should — the request is sent correctly and the call succeeds, but the annotation retains its previous end value. Other fields (e.g. details) update correctly in the same call, so this is isolated to end specifically. chart_id and category are both validated against real charts/categories in the project — an unknown value 404s rather than being accepted as free text.`, + params: [ + { + name: 'annotation_id', + type: 'integer', + required: true, + description: `The ID of the annotation to update.`, + }, + { + name: 'category', + type: 'string', + required: false, + description: `New category name for this annotation.`, + }, + { + name: 'chart_id', + type: 'string', + required: false, + description: `New chart to scope this annotation to. Set explicitly to null to make it global again.`, + }, + { name: 'details', type: 'string', required: false, description: `New free-text details.` }, + { + name: 'end', + type: 'string', + required: false, + description: `New end time, ISO 8601. Amplitude's docs say setting this explicitly to null removes the end time, but this was live-tested and CONFIRMED NOT TO WORK — the annotation keeps its previous end value regardless. This is an Amplitude API-side limitation, not a mapping bug (the null value is sent correctly).`, + }, + { + name: 'label', + type: 'string', + required: false, + description: `New label for the annotation.`, + }, + { name: 'start', type: 'string', required: false, description: `New start time, ISO 8601.` }, + ], + }, + { + name: 'amplitudeanalytics_update_annotation_category', + description: `Rename an existing chart annotation category.`, + params: [ + { + name: 'category', + type: 'string', + required: true, + description: `The new name for the category.`, + }, + { + name: 'category_id', + type: 'integer', + required: true, + description: `The ID of the annotation category to rename.`, + }, + ], + }, + { + name: 'amplitudeanalytics_update_cohort_membership', + description: `Add or remove individual members from an existing Amplitude cohort, without replacing the whole membership list. To create a cohort or replace its full membership list, use amplitudeanalytics_upload_cohort instead. CONFIRMED (live-tested): routing, auth, and the memberships array mapping all work correctly — a nonexistent cohort_id gets a clean, well-formed error: {"code":214,"message":"Cohort with id not found"}.`, + params: [ + { + name: 'cohort_id', + type: 'string', + required: true, + description: `The id of the existing cohort to update. Find it via amplitudeanalytics_list_cohorts.`, + }, + { + name: 'memberships', + type: 'array', + required: true, + description: `Array of membership change objects. Each object must have: ids (array of strings — the user/group identifiers to add or remove), id_type ("BY_ID" or "BY_NAME"), and operation ("ADD" or "REMOVE"). Example: [{"ids":["user_123"],"id_type":"BY_ID","operation":"ADD"}].`, + }, + { + name: 'count_group', + type: 'string', + required: false, + description: `The count group this cohort tracks (e.g. "User" or a custom group name). Must match the cohort's existing count group. Defaults to "User".`, + }, + { + name: 'skip_invalid_ids', + type: 'boolean', + required: false, + description: `If true, invalid IDs in the request are silently skipped. If false, the entire request is rejected if any ID is invalid. Defaults to true.`, + }, + ], + }, + { + name: 'amplitudeanalytics_update_event_category', + description: `Rename an existing event category in Amplitude's taxonomy.`, + params: [ + { + name: 'category_id', + type: 'string', + required: true, + description: `The id of the event category to rename, as used in the Amplitude Taxonomy API path. Treated as an opaque string identifier (not necessarily numeric), unlike the category_name used by amplitudeanalytics_get_event_category.`, + }, + { + name: 'category_name', + type: 'string', + required: true, + description: `The new name for the category.`, + }, + ], + }, + { + name: 'amplitudeanalytics_update_event_property', + description: `Partially update an existing event property in Amplitude's taxonomy. Only the fields you provide are changed; omitted fields keep their current value. Use overrideScope to control whether the update applies to an event-specific override or the shared property definition, and new_event_property_value to rename the property.`, + params: [ + { + name: 'event_property', + type: 'string', + required: true, + description: `The current name of the event property to update.`, + }, + { + name: 'classifications', + type: 'string', + required: false, + description: `New comma-separated classification tags for this property, from: PII, SENSITIVE, REVENUE. Only valid on shared properties — setting this on an event-specific override returns an error.`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `New description for this property. Leave unset to keep the current description.`, + }, + { + name: 'enum_values', + type: 'string', + required: false, + description: `New comma-separated list of allowed values. Only valid when type is 'enum'.`, + }, + { + name: 'event_type', + type: 'string', + required: false, + description: `New event type to scope this property to.`, + }, + { + name: 'is_array_type', + type: 'boolean', + required: false, + description: `New value for whether this property's values are an array of the given type.`, + }, + { + name: 'is_hidden', + type: 'boolean', + required: false, + description: `New value for whether this property is hidden from the Amplitude UI. Only settable on already-ingested properties.`, + }, + { + name: 'is_required', + type: 'boolean', + required: false, + description: `New value for whether this property is required to be present on every event occurrence.`, + }, + { + name: 'new_event_property_value', + type: 'string', + required: false, + description: `Renames the property to this new name. Leave unset to keep the current name.`, + }, + { + name: 'overrideScope', + type: 'string', + required: false, + description: `Whether this update applies to the event-specific override or the shared property definition.`, + }, + { + name: 'regex', + type: 'string', + required: false, + description: `New regular expression the property's values must match. Only valid when type is 'string'.`, + }, + { + name: 'type', + type: 'string', + required: false, + description: `New data type for this property.`, + }, + ], + }, + { + name: 'amplitudeanalytics_update_event_type', + description: `Partially update an existing event type in Amplitude's taxonomy. Only the fields you provide are changed; omitted fields keep their current value. Set new_event_type to rename the event type.`, + params: [ + { + name: 'event_type', + type: 'string', + required: true, + description: `The name of the existing event type to update.`, + }, + { + name: 'category', + type: 'string', + required: false, + description: `New category name for this event type.`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `New free-text description for this event type.`, + }, + { + name: 'display_name', + type: 'string', + required: false, + description: `New human-readable display label for this event type.`, + }, + { + name: 'is_active', + type: 'boolean', + required: false, + description: `Whether the event type is active.`, + }, + { + name: 'is_hidden_from_dropdowns', + type: 'boolean', + required: false, + description: `Whether to hide this event type from dropdown selectors. CONFIRMED (live-tested): this took effect immediately on a purely taxonomy-declared event type that was never actually ingested — contrary to Amplitude's documented 'only settable on already-ingested event types' — and setting it true made amplitudeanalytics_get_event_type return 'Not found' for that event even though it remained fully visible in amplitudeanalytics_list_event_types.`, + }, + { + name: 'is_hidden_from_pathfinder', + type: 'boolean', + required: false, + description: `Whether to hide this event type from Pathfinder. Amplitude documents this as only settable on already-ingested event types; not independently verified (the sibling is_hidden_from_dropdowns field was confirmed to take effect immediately on a never-ingested event, contrary to its own equivalent documentation, so this one may behave the same way — unconfirmed).`, + }, + { + name: 'is_hidden_from_persona_results', + type: 'boolean', + required: false, + description: `Whether to hide this event type from Persona results. Amplitude documents this as only settable on already-ingested event types; not independently verified (the sibling is_hidden_from_dropdowns field was confirmed to take effect immediately on a never-ingested event, contrary to its own equivalent documentation, so this one may behave the same way — unconfirmed).`, + }, + { + name: 'is_hidden_from_timeline', + type: 'boolean', + required: false, + description: `Whether to hide this event type from Timeline. Amplitude documents this as only settable on already-ingested event types; not independently verified (the sibling is_hidden_from_dropdowns field was confirmed to take effect immediately on a never-ingested event, contrary to its own equivalent documentation, so this one may behave the same way — unconfirmed).`, + }, + { + name: 'new_event_type', + type: 'string', + required: false, + description: `New name for the event type. Set this to rename it.`, + }, + { + name: 'owner', + type: 'string', + required: false, + description: `New owner identifier or email for this event type.`, + }, + { + name: 'tags', + type: 'string', + required: false, + description: `New comma-separated list of tags for this event type.`, + }, + ], + }, + { + name: 'amplitudeanalytics_update_group_property', + description: `Partially update an existing Amplitude Taxonomy group property. Amplitude's update-group-property docs list no body fields at all beyond the path variable, so every field below — including group_type — is inferred by analogy with the create endpoint and the sibling event/user property taxonomy endpoints, not explicitly confirmed; an incorrect field is simply rejected with a 400, not destructive. Only the fields you provide are changed; omitted fields keep their current value.`, + params: [ + { + name: 'group_property', + type: 'string', + required: true, + description: `The name of the group property to update.`, + }, + { + name: 'classifications', + type: 'string', + required: false, + description: `New classification tags for this property. INFERRED from the sibling event/user property taxonomy endpoints — Amplitude's update-group-property docs list no body fields at all; verify empirically before relying on it.`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `New human-readable description for the property. INFERRED from the sibling event/user property taxonomy endpoints — Amplitude's update-group-property docs list no body fields at all; verify empirically before relying on it.`, + }, + { + name: 'enum_values', + type: 'string', + required: false, + description: `New allowed values for this property when type is 'enum'. INFERRED from the sibling event/user property taxonomy endpoints, including the assumption that it's a plain string here rather than an array — Amplitude's update-group-property docs list no body fields at all; verify the exact expected format empirically.`, + }, + { + name: 'group_type', + type: 'string', + required: false, + description: `New group type to move this property to (e.g. 'org', 'company'). Amplitude's update-group-property docs do not list this or any body field — inferred by analogy with the create endpoint; verify empirically before relying on it.`, + }, + { + name: 'is_array_type', + type: 'boolean', + required: false, + description: `Whether this property holds an array of values rather than a single value. INFERRED from the sibling event/user property taxonomy endpoints — Amplitude's update-group-property docs list no body fields at all; verify empirically before relying on it.`, + }, + { + name: 'is_hidden', + type: 'boolean', + required: false, + description: `Whether this property is hidden from Amplitude's UI pickers. INFERRED from the sibling event/user property taxonomy endpoints — Amplitude's update-group-property docs list no body fields at all; verify empirically before relying on it.`, + }, + { + name: 'regex', + type: 'string', + required: false, + description: `New regular expression that values of this property must match. INFERRED from the sibling event/user property taxonomy endpoints — Amplitude's update-group-property docs list no body fields at all; verify empirically before relying on it.`, + }, + { + name: 'type', + type: 'string', + required: false, + description: `New data type for this property. INFERRED from the sibling event/user property taxonomy endpoints — Amplitude's update-group-property docs list no body fields at all; verify empirically before relying on it.`, + }, + ], + }, + { + name: 'amplitudeanalytics_update_user_property', + description: `Partially update an existing user property in Amplitude's taxonomy. Only the fields you provide are changed; omitted fields keep their current value. CONFIRMED BUG (live-tested, reproduced independently twice): new_event_property_value does NOT actually rename a user property — the call returns success:true, but the property keeps its original name unchanged and no property exists under the new name, verified via direct lookups both immediately after and via list. This is despite Amplitude's own documentation claiming this field renames both event and user properties; it works correctly for event properties (amplitudeanalytics_update_event_property) but is a silent no-op for user properties. Do not rely on this field to rename a user property — there is currently no working way to rename one through this API.`, + params: [ + { + name: 'user_property', + type: 'string', + required: true, + description: `The current name of the user property to update. Per Amplitude's documentation, custom user properties may need a 'gp:' prefix in this identifier.`, + }, + { + name: 'classifications', + type: 'string', + required: false, + description: `New comma-separated classification tags for this property, from: PII, SENSITIVE, REVENUE.`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `New description for this property. Leave unset to keep the current description.`, + }, + { + name: 'enum_values', + type: 'string', + required: false, + description: `New comma-separated list of allowed values. Only valid when type is 'enum'.`, + }, + { + name: 'is_array_type', + type: 'boolean', + required: false, + description: `New value for whether this property's values are an array of the given type.`, + }, + { + name: 'is_hidden', + type: 'boolean', + required: false, + description: `New value for whether this property is hidden from the Amplitude UI.`, + }, + { + name: 'new_event_property_value', + type: 'string', + required: false, + description: `Documented to rename the property to this new name, but CONFIRMED (live-tested) to be a silent no-op for user properties: the call succeeds with no error, yet the property keeps its original name and no property exists under the new name. There is currently no working way to rename a user property through this API.`, + }, + { + name: 'overrideScope', + type: 'string', + required: false, + description: `Whether this update applies to the event-specific override or the shared property definition.`, + }, + { + name: 'regex', + type: 'string', + required: false, + description: `New regular expression the property's values must match. Only valid when type is 'string'.`, + }, + { + name: 'type', + type: 'string', + required: false, + description: `New data type for this property.`, + }, + ], + }, + { + name: 'amplitudeanalytics_upload_cohort', + description: `Create a new Amplitude behavioral cohort from an explicit list of user or Amplitude IDs, or update an existing cohort's membership list wholesale by passing existing_cohort_id. To add/remove individual members from an already-created cohort instead, use amplitudeanalytics_update_cohort_membership. CONFIRMED (live-tested against a real project, App ID and real non-dry-run save attempt, not just skip_save): every id in ids is validated against Amplitude's actual known-users table before any save happens — IDs with zero tracked activity in the project are rejected with error code 120 ("User id is invalid") or 110 ("Amplitude id is invalid"), reporting {matched, totals, invalid_ids_sample}. This rejection happens even with skip_invalid_ids: true when 100% of the provided IDs are invalid (there's nothing left to keep) — skip_invalid_ids only helps when the ids list is a genuine mix of valid and invalid entries. There is no way to create a cohort from IDs that have no real tracked history in the project.`, + params: [ + { + name: 'app_id', + type: 'integer', + required: true, + description: `The Amplitude project id that will contain the cohort.`, + }, + { + name: 'id_type', + type: 'string', + required: true, + description: `The type of identifier used in the ids list: BY_AMP_ID (Amplitude IDs) or BY_USER_ID (your own user IDs).`, + }, + { + name: 'ids', + type: 'array', + required: true, + description: `One or more user or Amplitude IDs to include in the cohort, matching the type set in id_type. CONFIRMED: each ID must already have real tracked activity in the Amplitude project — Amplitude validates against its known-users table and rejects (error 120/110) any ID it has never seen, even a syntactically valid-looking one.`, + }, + { + name: 'name', + type: 'string', + required: true, + description: `Display name for the new cohort.`, + }, + { + name: 'owner', + type: 'string', + required: true, + description: `Login email of the Amplitude user who will own this cohort.`, + }, + { + name: 'published', + type: 'boolean', + required: true, + description: `If true, the cohort is discoverable by other users in the Amplitude project. If false, it's hidden.`, + }, + { + name: 'cohort_group', + type: 'string', + required: false, + description: `Name of an existing group to base the cohort on, if creating a group-based cohort rather than a user-based one.`, + }, + { + name: 'existing_cohort_id', + type: 'string', + required: false, + description: `If set, replaces this existing cohort's membership list instead of creating a new cohort.`, + }, + { + name: 'skip_invalid_ids', + type: 'boolean', + required: false, + description: `If true, invalid IDs are silently skipped and the cohort is created from the remaining valid ones. If false, the entire request is rejected if any ID is invalid. Defaults to true. CONFIRMED: this only helps with a genuine mix of valid and invalid IDs — if every ID in the list is invalid (0 matched), the request is rejected regardless of this setting, since there would be nothing left to build the cohort from.`, + }, + { + name: 'skip_save', + type: 'boolean', + required: false, + description: `If true, validates the request without actually saving the cohort — useful for a dry run. Defaults to false.`, + }, + ], + }, +] diff --git a/src/data/agent-connectors/amplitudeexperimentmanagement.ts b/src/data/agent-connectors/amplitudeexperimentmanagement.ts new file mode 100644 index 000000000..04fb2a8e0 --- /dev/null +++ b/src/data/agent-connectors/amplitudeexperimentmanagement.ts @@ -0,0 +1,1488 @@ +import type { Tool } from '../../types/agent-connectors' + +export const tools: Tool[] = [ + { + name: 'amplitudeexperimentmanagement_add_experiment_variant_cohorts', + description: `Add specific cohorts to this experiment variant's targeting inclusions. This adds to the variant's existing cohort inclusions; it does not replace them. CONFIRMED from Amplitude's docs: POST /api/1/experiments/{id}/variants/{variantKey}/cohorts with body {"inclusions": [...]}, an array of cohort ID strings. CONFIRMED no inclusion-count limit is documented for cohorts on either the Flags or Experiments API docs pages — the 2,000-inclusion cap that exists for user/device inclusions is stated by Amplitude as applying specifically to users on the Flags side, and cohorts aren't mentioned there at all. A successful call returns 200 OK with the literal text "OK", not a JSON body. Rate limit: 100 requests/second and 100,000/day, shared across the whole Experiment Management API (not per-endpoint). CONFIRMED (inferred from the identical flags-side finding, not independently confirmed): a well-formed request with a syntactically valid cohort_id that does not correspond to a REAL, existing Amplitude cohort returns a generic HTTP 400 "Internal server error" from Amplitude, not a clean validation error — unlike user_ids, which accept arbitrary/free-form identifiers without requiring them to pre-exist. Use a real cohort ID from this Amplitude project's Cohorts, or expect this error.`, + params: [ + { + name: 'cohort_ids', + type: 'string', + required: true, + description: `Cohort IDs to add to this variant's targeting, as a JSON-encoded array of strings.`, + }, + { name: 'id', type: 'string', required: true, description: `The experiment's ID.` }, + { name: 'variant_key', type: 'string', required: true, description: `The variant's key.` }, + ], + }, + { + name: 'amplitudeexperimentmanagement_add_experiment_variant_users', + description: `Force-bucket specific users or devices into this experiment variant — identified by user ID, device ID, or an email-style identifier — bypassing the experiment's normal allocation. This adds to the variant's existing inclusions; it does not replace them. CONFIRMED from Amplitude's docs: POST /api/1/experiments/{id}/variants/{variantKey}/users with body {"inclusions": [...]}, an array of ID strings. UNCONFIRMED FOR EXPERIMENTS: Amplitude's Flags API docs state a hard cap of 2,000 inclusions per variant for the identical flag-variant endpoint ("You can have up to 2,000 inclusions per variant. If you exceed this limit, Amplitude returns a 400 error.") — the Experiments API docs page never repeats this limit for the experiment-variant endpoint, so it is NOT confirmed whether the same 2,000 cap applies to experiments. Treat it as likely (the two APIs otherwise mirror each other closely in every endpoint we checked) but unverified, and handle a 400 response defensively. A successful call returns 200 OK with the literal text "OK", not a JSON body. Rate limit: 100 requests/second and 100,000/day, shared across the whole Experiment Management API (not per-endpoint).`, + params: [ + { name: 'id', type: 'string', required: true, description: `The experiment's ID.` }, + { + name: 'user_ids', + type: 'string', + required: true, + description: `User or device IDs to force-bucket into this variant, as a JSON-encoded array of strings. Amplitude accepts user IDs, device IDs, or email-style identifiers here.`, + }, + { name: 'variant_key', type: 'string', required: true, description: `The variant's key.` }, + ], + }, + { + name: 'amplitudeexperimentmanagement_add_flag_variant_cohorts', + description: `Add specific cohorts as inclusions on a variant of an Amplitude Experiment feature flag — explicitly assigning these cohorts to this variant regardless of the variant's rollout weight. UNCONFIRMED: unlike the users endpoint, Amplitude's docs don't mention any documented maximum on the number of cohort inclusions per variant, nor whether this call is additive or replaces the existing cohort list — treat both as unconfirmed until independently live-tested. CONFIRMED (live-tested): this org has Feature Experimentation entitlement. Per Amplitude's docs, a successful call returns a 200 OK response with the literal text "OK" as the body — not a JSON object — so the tool treats the response as raw text rather than parsing it as JSON. Rate limit: 100 requests/second and 100,000/day, shared across the whole Experiment Management API (not per-endpoint). FIXED (was broken, now live-tested): this field is JSON-encoded per its schema, but was previously mapped via a plain body_json_mapping template that sent the raw string instead of a parsed array/object — Amplitude rejected it (e.g. "\\"inclusions\\" must be an array"). Now uses a jsonnet_template with std.parseJson() to correctly convert it before sending, matching the pattern the Experiments-side tools already used. Confirmed working end-to-end live. CONFIRMED (live-tested): a well-formed request with a syntactically valid cohort_id that does not correspond to a REAL, existing Amplitude cohort returns a generic HTTP 400 "Internal server error" from Amplitude, not a clean validation error — unlike user_ids, which accept arbitrary/free-form identifiers without requiring them to pre-exist. Use a real cohort ID from this Amplitude project's Cohorts, or expect this error.`, + params: [ + { + name: 'cohort_ids', + type: 'string', + required: true, + description: `JSON-encoded array of cohort IDs to add as inclusions on this variant.`, + }, + { + name: 'id', + type: 'string', + required: true, + description: `The flag's ID (not its key) — find it in the URL of the flag's page in the Amplitude app.`, + }, + { + name: 'variant_key', + type: 'string', + required: true, + description: `The key of the variant to add cohort inclusions to.`, + }, + ], + }, + { + name: 'amplitudeexperimentmanagement_add_flag_variant_users', + description: `Add specific users, devices, or emails as individual inclusions on a variant of an Amplitude Experiment feature flag — explicitly assigning these identities to this variant regardless of the variant's rollout weight. Amplitude allows up to 2,000 total inclusions per variant; exceeding that limit returns a 400 error (per Amplitude's docs, verbatim: "You can have up to 2,000 inclusions per variant. If you exceed this limit, Amplitude returns a 400 error."). UNCONFIRMED: the docs don't explicitly state whether this call is purely additive (merges with the existing inclusion list) or could replace it outright — the endpoint is titled and described as adding inclusions "to a flag's variant", which implies additive behavior, but this has not been independently live-tested. CONFIRMED (live-tested): this org has Feature Experimentation entitlement. Per Amplitude's docs, a successful call returns a 200 OK response with the literal text "OK" as the body — not a JSON object — so the tool treats the response as raw text rather than parsing it as JSON. Rate limit: 100 requests/second and 100,000/day, shared across the whole Experiment Management API (not per-endpoint). FIXED (was broken, now live-tested): this field is JSON-encoded per its schema, but was previously mapped via a plain body_json_mapping template that sent the raw string instead of a parsed array/object — Amplitude rejected it (e.g. "\\"inclusions\\" must be an array"). Now uses a jsonnet_template with std.parseJson() to correctly convert it before sending, matching the pattern the Experiments-side tools already used. Confirmed working end-to-end live.`, + params: [ + { + name: 'id', + type: 'string', + required: true, + description: `The flag's ID (not its key) — find it in the URL of the flag's page in the Amplitude app.`, + }, + { + name: 'user_ids', + type: 'string', + required: true, + description: `JSON-encoded array of user IDs, device IDs, or email addresses to add as individual inclusions on this variant. Max 2,000 total inclusions per variant across all calls — see the tool description for the 400 error behavior.`, + }, + { + name: 'variant_key', + type: 'string', + required: true, + description: `The key of the variant to add user/device inclusions to.`, + }, + ], + }, + { + name: 'amplitudeexperimentmanagement_bulk_delete_experiment_variant_cohorts', + description: `Remove a specific set of cohorts (by ID) from an experiment variant's targeting, leaving other included cohorts untouched. Limited to 100 IDs per request — split larger lists across multiple calls. + +CONFIRMED from Amplitude's docs: despite being a DELETE request, cohort IDs are sent as a JSON body (not query params), matching the bulk-delete-users pattern. The body field is literally named \`users\` even though it holds cohort IDs — not a copy-paste error, this is what Amplitude's docs show; this tool maps \`cohort_ids\` onto that \`users\` wire field for you. A successful call returns 200 OK with the literal text "OK", not JSON. + +FIXED (confirmed live both regions): this field was previously sent as a raw string instead of a parsed array via body_json_mapping — now uses jsonnet_template + std.parseJson(), matching the Experiments-side pattern. CONFIRMED (live-tested): a cohort_id that isn't a real Amplitude cohort returns 400 "Internal server error" — unlike user_ids, which accept arbitrary free-form identifiers. CONFIRMED (live-tested on EU): removing a cohort_id that IS real but not currently in the variant's list instead returns a different 400 "There are no users for this key". Neither case is a silent no-op. + +Rate limit: 100 req/s, 100,000/day, shared across the whole API.`, + params: [ + { + name: 'cohort_ids', + type: 'array', + required: true, + description: `Cohort IDs to remove from the variant's targeting. Sent as a JSON request body under Amplitude's documented field name 'users' — a naming quirk in Amplitude's own API, confirmed from their docs, not a mistake in this tool. Limited to 100 per request.`, + }, + { + name: 'id', + type: 'string', + required: true, + description: `The experiment's ID. Find it in the URL of the experiment in the Amplitude app.`, + }, + { name: 'variant_key', type: 'string', required: true, description: `The variant's key.` }, + ], + }, + { + name: 'amplitudeexperimentmanagement_bulk_delete_experiment_variant_users', + description: `Remove a specific set of users or devices (by ID) from an experiment variant's inclusion list, leaving all other included users untouched. This is distinct from the remove-all-users tool, which wipes the entire inclusion list regardless of which IDs exist. Limited to 100 user/device IDs per request per Amplitude's docs — split larger lists across multiple calls. CONFIRMED directly from Amplitude's official docs (exact curl example: --data '{"users":["id1", "id2", "id3"]}'): despite this being a DELETE request, the target IDs are sent as a JSON request body, not a query parameter. DELETE-with-body is unusual, but it is exactly what Amplitude's docs show, and this tool sends the request the same way. A successful call returns 200 OK with the literal text 'OK' (not a JSON body); this tool reports success from the status code, not from parsing a response payload. This org has confirmed Feature Experimentation entitlement (live-tested via the list endpoints); the request/response shape below is per Amplitude's published docs and has not been independently live-tested for this specific write endpoint. Rate limit: 100 requests/second and 100,000/day, shared across the whole Experiment Management API (not per-endpoint). FIXED (was broken, now live-tested): this field is JSON-encoded per its schema, but was previously mapped via a plain body_json_mapping template that sent the raw string instead of a parsed array/object — Amplitude rejected it (e.g. "\\"inclusions\\" must be an array"). Now uses a jsonnet_template with std.parseJson() to correctly convert it before sending, matching the pattern the Experiments-side tools already used. Confirmed working end-to-end live.`, + params: [ + { + name: 'id', + type: 'string', + required: true, + description: `The experiment's ID. Find it in the URL of the experiment in the Amplitude app.`, + }, + { + name: 'user_ids', + type: 'array', + required: true, + description: `User or device IDs to remove from the variant's inclusion list. Sent as a JSON request body (confirmed from Amplitude's docs) under the field name 'users'. Limited to 100 per request.`, + }, + { name: 'variant_key', type: 'string', required: true, description: `The variant's key.` }, + ], + }, + { + name: 'amplitudeexperimentmanagement_bulk_delete_flag_variant_cohorts', + description: `Remove a specific set of cohorts (by ID) from a flag variant's individual-inclusion list — the cohort analog of Bulk Delete Flag Variant Users. + +CONFIRMED from Amplitude's docs: despite being a DELETE request, cohort IDs are sent as a JSON body (not query params). The body field is literally named \`users\` even though it holds cohort IDs — not a copy-paste error, this is what Amplitude's docs show; this tool maps \`cohort_ids\` onto that \`users\` wire field for you. Limited to 100 IDs per request. A successful call returns 200 OK with the literal text "OK", not JSON. + +FIXED (confirmed live both regions): this field was previously sent as a raw string instead of a parsed array via body_json_mapping — now uses jsonnet_template + std.parseJson(). CONFIRMED (live-tested): a cohort_id that isn't a real Amplitude cohort returns 400 "Internal server error". CONFIRMED (live-tested on EU, resolves a previously-open question): removing a cohort_id that IS real but not currently in the variant's list instead returns a different 400 "There are no users for this key" — both are real 400s, not silent no-ops. + +Rate limit: 100 req/s, 100,000/day, shared across the whole API.`, + params: [ + { + name: 'cohort_ids', + type: 'array', + required: true, + description: `Array of cohort IDs to remove from the variant's individual-inclusion list. Limited to 100 IDs per request per Amplitude's docs. Sent on the wire as the "users" body key — a documented Amplitude API quirk, not an error in this tool.`, + }, + { name: 'id', type: 'string', required: true, description: `The flag's ID.` }, + { name: 'variant_key', type: 'string', required: true, description: `The variant's key.` }, + ], + }, + { + name: 'amplitudeexperimentmanagement_bulk_delete_flag_variant_users', + description: `Remove a specific SET of users (by user/device ID) from a flag variant's individual-inclusion list — distinct from Remove All Flag Variant Users, which unconditionally clears every user regardless of ID. Per Amplitude's official docs (verified via two independent doc fetches), this is a DELETE request that carries a JSON request body — an unusual but real, documented pattern: {"users": ["id1", "id2", "id3"]} — the target IDs are NOT passed as query parameters or path segments. Limited to 100 user IDs per request per Amplitude's docs; split larger removals into multiple calls. UNCONFIRMED: Amplitude's docs don't state what happens if an ID in the list isn't currently in the variant's list (error vs. silent no-op) — don't assume either behavior until verified live. Per Amplitude's docs, a successful call returns 200 OK with the literal text "OK" as the body — not a JSON object. CONFIRMED (live-tested): this org has Feature Experimentation entitlement. Rate limit: 100 requests/second and 100,000/day, shared across the whole Experiment Management API (not per-endpoint). FIXED (was broken, now live-tested): this field is JSON-encoded per its schema, but was previously mapped via a plain body_json_mapping template that sent the raw string instead of a parsed array/object — Amplitude rejected it (e.g. "\\"inclusions\\" must be an array"). Now uses a jsonnet_template with std.parseJson() to correctly convert it before sending, matching the pattern the Experiments-side tools already used. Confirmed working end-to-end live.`, + params: [ + { name: 'id', type: 'string', required: true, description: `The flag's ID.` }, + { + name: 'user_ids', + type: 'array', + required: true, + description: `Array of user/device IDs to remove from the variant's individual-inclusion list. Limited to 100 IDs per request per Amplitude's docs.`, + }, + { name: 'variant_key', type: 'string', required: true, description: `The variant's key.` }, + ], + }, + { + name: 'amplitudeexperimentmanagement_create_deployment', + description: `Create a new deployment in a project. Required fields per Amplitude's docs: projectId, label, and type. A deployment represents one SDK key / environment (for example "Production" or "Development") that flags and experiments get deployed to. A successful call returns a 200 OK with a JSON object containing only the new deployment's id — label, key, and type are not echoed back per Amplitude's documented example. UNCONFIRMED: Amplitude's docs don't document label-uniqueness or conflict behavior for this endpoint, nor the exact format of the auto-generated key beyond its client-/server- prefix. This org has confirmed Feature Experimentation entitlement (verified via live-tested List Flags and List Experiments calls). Rate limit: 100 requests/second and 100,000/day, shared across the whole Experiment Management API (not per-endpoint).`, + params: [ + { + name: 'label', + type: 'string', + required: true, + description: `Display label for the deployment. Must contain only alphanumeric characters and/or \`_\`, \`-\`, per Amplitude's docs.`, + }, + { + name: 'project_id', + type: 'string', + required: true, + description: `The ID of the Amplitude project to create the deployment in.`, + }, + { + name: 'type', + type: 'string', + required: true, + description: `Deployment type: \`client\` (for client-side SDKs running on a device the user controls, such as a browser or mobile app — the resulting key is prefixed client- and safe to expose publicly) or \`server\` (for server-side SDKs or to authorize Evaluation API requests — the resulting key is prefixed server- and must be kept secret). Required per Amplitude's docs.`, + }, + ], + }, + { + name: 'amplitudeexperimentmanagement_create_experiment', + description: `Create a new Amplitude experiment. Required: project_id, key. name is technically optional per this tool (Amplitude's docs disagree), but supply it anyway — every documented example includes it. + +deliveryMethod and rolloutPercentage are not create-time fields — only projectId, key, name, description, variants, bucketingKey, rolloutWeights, targetSegments, deployments, evaluationMode, experimentType are documented as create-time fields. CONFIRMED (live-tested both regions): created experiments default deliveryMethod to "feature" (visible via get_experiment/list_experiments) — real "web"-delivery experiments only come from Amplitude's visual editor and behave differently on update_experiment/create_experiment_deployment (see those tools). Set rolloutPercentage afterward via update_experiment. + +Complex nested fields (variants, rollout_weights, target_segments) are JSON-encoded strings, not native objects — parsed before sending. \`parent_dependencies\` looks settable by shape but is CONFIRMED (live-tested) rejected outright with 400 "parentDependencies is not allowed" — don't send it, it's read-only/derived. + +CONFIRMED (live-tested both regions): \`variants\`, \`rollout_weights\`, \`target_segments\`, \`deployments\` (a real deployment ID), \`bucketing_key\`, and \`evaluation_mode\` all work correctly together in one call with the default \`a-b-test\` experiment_type. \`experiment_type: "multi-arm-bandit"\` instead is gated by a third, distinct permission scope — 403 "User does not have permission (experiment_multi_armed_bandit)" — separate from \`experimentation\` and \`experiment_groups\`. + +Response: 200 {id, url}. Rate limit: 100 req/s, 100,000/day, shared across the whole API.`, + params: [ + { + name: 'key', + type: 'string', + required: true, + description: `Unique experiment key (slug-like identifier) used to reference this experiment.`, + }, + { + name: 'project_id', + type: 'string', + required: true, + description: `The Amplitude project ID this experiment belongs to.`, + }, + { + name: 'bucketing_key', + type: 'string', + required: false, + description: `User property Amplitude uses to consistently bucket the same user into the same variant (e.g. amplitude_id, user_id, device_id, or a custom property).`, + }, + { + name: 'deployments', + type: 'array', + required: false, + description: `Deployment IDs to attach this experiment to at creation time.`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `Human-readable experiment description.`, + }, + { + name: 'evaluation_mode', + type: 'string', + required: false, + description: `Where variant assignment is evaluated: remote (Amplitude's servers) or local (in your SDK).`, + }, + { + name: 'experiment_type', + type: 'string', + required: false, + description: `The experiment's statistical design. No confirmed documented default — Amplitude's own create example uses a-b-test.`, + }, + { + name: 'name', + type: 'string', + required: false, + description: `Human-readable experiment name. Amplitude's docs disagree on whether this is required; this tool treats it as optional but you should supply it.`, + }, + { + name: 'parent_dependencies', + type: 'string', + required: false, + description: `JSON-encoded object describing parent dependency relationships (e.g. mutex group or holdout membership) — observed on live experiment objects via list_experiments but NOT documented anywhere in Amplitude's Create or Update Experiment request schemas. Exposed here defensively for advanced use; Amplitude may ignore or reject this field since it looks read-only/derived rather than settable. Verify behavior with a real call before relying on it.`, + }, + { + name: 'rollout_weights', + type: 'string', + required: false, + description: `JSON-encoded object mapping each variant key to its relative distribution weight, e.g. '{"control": 1, "treatment": 1}' for an equal 50/50 split. Keys must match the variants[].key values above. Pass as a JSON-encoded STRING, not a native object.`, + }, + { + name: 'target_segments', + type: 'string', + required: false, + description: `JSON-encoded array of target segment objects that define who is included in this experiment and at what percentage, evaluated in order. Documented shape per segment: {"name": string (required), "conditions": [{"type": "property" (fixed value), "prop": string, "op": one of is|is not|contains|does not contain|less|less or equal|greater|greater or equal|set is|set is not|set contains|set does not contain|glob match|glob does not match, "values": string[]}] (required), "percentage": number (required), "rolloutWeights": object (required, same shape as rollout_weights above)}. Cohort-based targeting is not supported. Pass as a JSON-encoded STRING, not a native array.`, + }, + { + name: 'variants', + type: 'string', + required: false, + description: `JSON-encoded array of variant objects to bucket users into. Amplitude's documented shape per variant: {"key": string (required), "payload": any JSON (optional), "name": string (optional), "description": string (optional)}. A live-tested list_experiments call against this org showed a richer real-world payload shape for feature-flag-backed experiments — "payload": [{"data": {"mutations": [...]}, "action": "mutate"}] instead of a bare value — use whichever shape matches your use case. Pass as a JSON-encoded STRING, not a native array; this tool parses it before sending. Omit to use Amplitude's own default variant set (unconfirmed what that default is).`, + }, + ], + }, + { + name: 'amplitudeexperimentmanagement_create_experiment_deployment', + description: `Deploy an experiment to one or more deployments. CONFIRMED directly from Amplitude's official docs (exact JSON example: {"deployments": [""]}): the request body field is the plural array 'deployments', not a singular 'deploymentId' — pass a one-element array to deploy to a single deployment, or multiple IDs to deploy to several deployments in one call. A successful call returns 200 OK with the literal text 'OK' (not a JSON body); this tool reports success from the status code, not from parsing a response payload. This org has confirmed Feature Experimentation entitlement (live-tested via the list endpoints); the request/response shape below is per Amplitude's published docs and has not been independently live-tested for this specific write endpoint. Rate limit: 100 requests/second and 100,000/day, shared across the whole Experiment Management API (not per-endpoint). CONFIRMED (live-tested on EU): deploying a real "Web"-delivery-method experiment (deliveryMethod: "web") fails with HTTP 400 "Web Experiments are not supported by Management API yet", a hard product limitation independent of the caller's permissions — check deliveryMethod before assuming a 403 is the only possible failure mode here.`, + params: [ + { + name: 'deployment_ids', + type: 'array', + required: true, + description: `Deployment IDs to deploy this experiment to. Sent as a JSON request body under Amplitude's documented field name 'deployments'. Pass a single-element array to target one deployment.`, + }, + { + name: 'id', + type: 'string', + required: true, + description: `The experiment's ID. Find it in the URL of the experiment in the Amplitude app.`, + }, + ], + }, + { + name: 'amplitudeexperimentmanagement_create_experiment_variant', + description: `Add a new variant to an experiment. CONFIRMED from Amplitude's official docs (verified against the page's raw rendered source, not just its visible text): POST /api/1/experiments/{id}/variants with body {key, name, description, payload, rolloutWeight} — key is the only required field and can only contain letters, numbers, underscores (_), and hyphens (-). payload is passed here as a JSON-encoded string (any valid JSON element — object, array, or primitive); Amplitude's own docs example shows a bare object, but this org's live-tested data shows a real experiment variant payload shaped like [{"data":{"mutations":[]},"action":"mutate"}] — an array of mutation objects — so don't assume payload is always a plain object. rolloutWeight has no documented numeric range or scale in Amplitude's docs (unclear if it's 0-100, a relative share among variants, or something else) — match the scale your experiment's other variants already use. A successful call returns 200 OK with the literal text "OK", not a JSON body, so this tool does not attempt to parse the response as JSON. Rate limit: 100 requests/second and 100,000/day, shared across the whole Experiment Management API (not per-endpoint). CONFIRMED (live-tested, reproduced 4x): this specific operation returns HTTP 403 "User does not have permission (experimentation)" for this connected account, even though list_experiments (no ID) and create_experiment both work fine with the same credentials. This looks like a role/permission scope on the Amplitude user tied to this Management API key, not an org-wide entitlement gate (contrast with the Profile API's different "org does not have access" 401) — check the Amplitude user's Experiment role/permissions if you hit this.`, + params: [ + { name: 'id', type: 'string', required: true, description: `The experiment's ID.` }, + { + name: 'key', + type: 'string', + required: true, + description: `The variant key. Can only contain letters, numbers, underscores (_), and hyphens (-).`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `Description for the variant.`, + }, + { + name: 'name', + type: 'string', + required: false, + description: `Display name for the variant.`, + }, + { + name: 'payload', + type: 'string', + required: false, + description: `Optional payload for the variant, as a JSON-encoded string. Must be a valid JSON element (object, array, or primitive). A real variant payload confirmed live on this org looked like [{"data":{"mutations":[]},"action":"mutate"}] — an array of mutation objects — rather than a bare object, so don't assume the shape without checking your own flag/experiment configuration.`, + }, + { + name: 'rollout_weight', + type: 'number', + required: false, + description: `Rollout weight for non-targeted users. Amplitude's docs don't document a numeric range or scale for this value.`, + }, + ], + }, + { + name: 'amplitudeexperimentmanagement_create_flag', + description: `Create a new Amplitude Experiment feature flag. Required: projectId, key. All other fields are optional at creation. + +CONFIRMED from Amplitude's docs: tags, rolloutPercentage, enabled, and archive are NOT settable here — set them afterward via update_flag. parentDependencies isn't settable via either endpoint — treat it as read-only/UI-managed. Complex fields (variants, rolloutWeights, targetSegments) are JSON-encoded strings, not native objects. + +FIXED (confirmed live both regions): this field was previously sent as a raw string instead of a parsed array via body_json_mapping — now uses jsonnet_template + std.parseJson(). CONFIRMED (live-tested both regions): \`deployments\` works at creation — a flag created with a real deployment ID shows it immediately on get_flag. \`bucketing_key\`, \`evaluation_mode\`, \`rollout_weights\`, and \`target_segments\` (once each segment includes \`rolloutWeights\` — see that field's own description) all confirmed working together. The variant key value "off" is specifically rejected (400 "variants[1].key contains an invalid value") — "on" is fine; likely shared by the Experiments-side variants field but not independently confirmed there. + +Response: 200 {id, url}. Rate limit: 100 req/s, 100,000/day, shared across the whole API.`, + params: [ + { + name: 'key', + type: 'string', + required: true, + description: `The flag's key, used to reference it in code and in the Amplitude app. Must be unique within the project.`, + }, + { + name: 'project_id', + type: 'string', + required: true, + description: `The ID of the Amplitude project to create the flag in.`, + }, + { + name: 'bucketing_key', + type: 'string', + required: false, + description: `The user property to bucket users by when assigning variants.`, + }, + { + name: 'deployments', + type: 'array', + required: false, + description: `Deployment IDs to attach this flag to at creation time.`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `Description of the flag's purpose, shown in the Amplitude app.`, + }, + { + name: 'evaluation_mode', + type: 'string', + required: false, + description: `Evaluation mode for the flag: \`remote\` (evaluated server-side per request) or \`local\` (evaluated client-side from a downloaded ruleset). No default is documented by Amplitude — omit to use Amplitude's own default.`, + }, + { + name: 'name', + type: 'string', + required: false, + description: `Human-readable name for the flag, shown in the Amplitude app.`, + }, + { + name: 'rollout_weights', + type: 'string', + required: false, + description: `JSON-encoded string (not a native object) describing rollout weights for non-targeted users. Must decode to an object mapping each variant key to an integer weight. Example value to pass: {"control":50,"treatment":50}`, + }, + { + name: 'target_segments', + type: 'string', + required: false, + description: `JSON-encoded string (not native JSON) describing target segments evaluated before the default rollout. Must decode to an array of objects: [{"name": "segment name", "conditions": [{"type": "property", "prop": "user property name", "op": "is", "values": ["value1"]}], "percentage": 100, "bucketingKey": "optional user property", "rolloutWeights": {"control":50,"treatment":50}}]. \`name\`, \`conditions\`, and \`percentage\` are required per segment; \`bucketingKey\` is optional. CORRECTION (live-tested both regions): \`rolloutWeights\` is NOT optional despite how this reads — omitting it fails validation with \`"targetSegments[0].rolloutWeights" is required"\`. Always include it, matching the sibling Experiments-side tools which document this correctly. Documented \`op\` values: is, is not, contains, does not contain, less, less or equal, greater, greater or equal, set is, set is not, set contains, set does not contain, glob match, glob does not match, version less than, version less than or equal to, version greater than, version greater than or equal to.`, + }, + { + name: 'variants', + type: 'string', + required: false, + description: `JSON-encoded string (not a native array) describing the flag's variants. Must decode to an array of objects: [{"key": "control", "payload": , "name": "optional display name", "description": "optional description"}]. Only \`key\` is required per variant. Example value to pass: [{"key":"control"},{"key":"treatment","payload":{"color":"blue"}}]`, + }, + ], + }, + { + name: 'amplitudeexperimentmanagement_create_flag_deployment', + description: `Deploy a flag to one or more deployments. Per Amplitude's official docs, the request body takes a deployments array of deployment ID strings — {"deployments": [""]} — not a single deploymentId field, so this tool accepts deployment_ids as an array (pass one ID to deploy to a single deployment, or several to deploy to multiple deployments in one call). Use List Flag Deployments first if you need to confirm which deployments a flag is already on. Per Amplitude's docs, a successful call returns 200 OK with the literal text "OK" as the body — not a JSON object. UNCONFIRMED: Amplitude's docs don't state what happens if the flag is already deployed to one of the given deployment IDs (error vs. idempotent no-op) — don't assume either behavior until verified live. CONFIRMED (live-tested): this org has Feature Experimentation entitlement. Rate limit: 100 requests/second and 100,000/day, shared across the whole Experiment Management API (not per-endpoint).`, + params: [ + { + name: 'deployment_ids', + type: 'array', + required: true, + description: `Array of deployment IDs to deploy this flag to. Per Amplitude's docs the wire field is called "deployments"; this tool maps deployment_ids to it.`, + }, + { name: 'id', type: 'string', required: true, description: `The flag's ID.` }, + ], + }, + { + name: 'amplitudeexperimentmanagement_create_flag_variant', + description: `Create a new variant for an Amplitude Experiment feature flag. Only the variant key is required — name, description, payload, and rollout weight are all optional. CONFIRMED (live-tested): this org has Feature Experimentation entitlement. Per Amplitude's docs, a successful call returns a 200 OK response with the literal text "OK" as the body — not a JSON object — so the tool treats the response as raw text rather than parsing it as JSON. Rate limit: 100 requests/second and 100,000/day, shared across the whole Experiment Management API (not per-endpoint). FIXED (was broken, now live-tested): this field is JSON-encoded per its schema, but was previously mapped via a plain body_json_mapping template that sent the raw string instead of a parsed array/object — Amplitude rejected it (e.g. "\\"inclusions\\" must be an array"). Now uses a jsonnet_template with std.parseJson() to correctly convert it before sending, matching the pattern the Experiments-side tools already used. Confirmed working end-to-end live.`, + params: [ + { + name: 'id', + type: 'string', + required: true, + description: `The flag's ID (not its key) — find it in the URL of the flag's page in the Amplitude app.`, + }, + { + name: 'key', + type: 'string', + required: true, + description: `The variant key to create. Can only contain letters, numbers, underscores (_), and hyphens (-).`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `Description for the variant, shown in the Amplitude UI.`, + }, + { + name: 'name', + type: 'string', + required: false, + description: `Display name for the variant, shown in the Amplitude UI.`, + }, + { + name: 'payload', + type: 'string', + required: false, + description: `Variant payload as a JSON-encoded string. Amplitude accepts any valid JSON element here — an object, a quoted string, or a number — returned to your app when this variant is assigned. See the tool description for a note on richer payload shapes observed elsewhere in this API.`, + }, + { + name: 'rollout_weight', + type: 'number', + required: false, + description: `Rollout weight for users who aren't individually targeted by this variant, used to split traffic among a flag's variants. No documented range; Amplitude's own example uses 0.`, + }, + ], + }, + { + name: 'amplitudeexperimentmanagement_create_holdout_group', + description: `Create a new holdout group. Required: projectId, name, holdoutPercentage. \`individualInclusion\`/\`individualExclusion\` are named from the holdout's own point of view — inclusion in the holdout means exclusion from experiments, and vice versa. + +FIXED (confirmed live both regions): this field was previously sent as a raw string instead of a parsed array via body_json_mapping — now uses jsonnet_template + std.parseJson(). CONFIRMED (live-tested both regions): returns 403 "User does not have permission (experiment_groups)" — a distinct scope from \`experimentation\`; list_holdout_groups works fine with the same credentials, only creating is gated. \`key\`, \`description\`, \`evaluation_mode\`, \`bucketing_key\`, \`individual_inclusion\`, \`individual_exclusion\` all reach this same block regardless. \`experiments\`, if provided, needs at least 1 entry — an empty array fails validation, mirroring the mutex-slot minimum. + +Response: 200 {id, url}. Rate limit: 100 req/s, 100,000/day, shared across the whole API.`, + params: [ + { + name: 'holdout_percentage', + type: 'integer', + required: true, + description: `Percentage of users to exclude from associated experiments, integer 1-99 inclusive.`, + }, + { + name: 'name', + type: 'string', + required: true, + description: `Display name for the holdout group.`, + }, + { + name: 'project_id', + type: 'string', + required: true, + description: `The ID of the Amplitude project to create the holdout group in.`, + }, + { + name: 'bucketing_key', + type: 'string', + required: false, + description: `The user property to bucket users by. Amplitude's docs state this defaults to \`amplitude_id\` when omitted.`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `Description of the holdout group's purpose.`, + }, + { + name: 'evaluation_mode', + type: 'string', + required: false, + description: `Evaluation mode for the holdout group: \`remote\` (evaluated server-side per request) or \`local\` (evaluated client-side from a downloaded ruleset). Amplitude's docs state this defaults to \`remote\` when omitted.`, + }, + { + name: 'experiments', + type: 'string', + required: false, + description: `JSON-encoded array of experiment IDs (numbers) to associate with this holdout at creation time, e.g. [21197].`, + }, + { + name: 'individual_exclusion', + type: 'string', + required: false, + description: `JSON-encoded array of user or device ID strings to always exempt from this holdout — these individuals remain eligible for associated experiments even if randomly selected into the holdout percentage. Maps to Amplitude's individualExclusion field.`, + }, + { + name: 'individual_inclusion', + type: 'string', + required: false, + description: `JSON-encoded array of user or device ID strings to always place in this holdout — these individuals are permanently excluded from every associated experiment, regardless of random assignment. Maps to Amplitude's individualInclusion field.`, + }, + { + name: 'key', + type: 'string', + required: false, + description: `Unique key for the holdout group. Amplitude auto-generates one if omitted.`, + }, + ], + }, + { + name: 'amplitudeexperimentmanagement_create_mutex_group', + description: `Create a new mutex group. Required: projectId, name, slots (JSON-encoded string — see that field's description for shape). + +FIXED (confirmed live both regions): this field was previously sent as a raw string instead of a parsed array via body_json_mapping — now uses jsonnet_template + std.parseJson(). CONFIRMED (live-tested): each slot requires \`percentage\` plus at least one entry in EACH of experiments/holdouts/individuals — an empty array in any of the three fails validation naming the exact field. \`holdouts\` accepts a non-existent ID without complaint (format-only check). Once the payload is valid, returns 403 "User does not have permission (experiment_groups)" — a distinct scope from \`experimentation\`; list_mutex_groups works fine with the same credentials, only create/get/update on individual groups are gated. + +Response: 200 {id, url}. Rate limit: 100 req/s, 100,000/day, shared across the whole API.`, + params: [ + { + name: 'name', + type: 'string', + required: true, + description: `Display name for the mutex group.`, + }, + { + name: 'project_id', + type: 'string', + required: true, + description: `The ID of the Amplitude project to create the mutex group in.`, + }, + { + name: 'slots', + type: 'string', + required: true, + description: `JSON-encoded string (not a native array) describing the mutex group's slots. Must decode to an array of up to 20 objects, in order: [{"percentage": number (1-100), "experiments"?: [number,...], "holdouts"?: [number,...], "individuals"?: [string,...]}]. The percentage values across all slots must sum to exactly 100. Example value to pass: [{"percentage":40,"experiments":[123],"holdouts":[456]},{"percentage":60,"individuals":["x@amplitude.com"]}]`, + }, + { + name: 'bucketing_key', + type: 'string', + required: false, + description: `The user property to bucket users by. Amplitude's docs state this defaults to \`amplitude_id\` when omitted.`, + }, + { + name: 'bucketing_salt', + type: 'string', + required: false, + description: `Salt value used in the bucketing hash calculation. Amplitude randomizes this if omitted.`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `Description of the mutex group's purpose.`, + }, + { + name: 'evaluation_mode', + type: 'string', + required: false, + description: `Evaluation mode for the mutex group: \`remote\` (evaluated server-side per request) or \`local\` (evaluated client-side from a downloaded ruleset). Amplitude's docs state this defaults to \`remote\` when omitted.`, + }, + { + name: 'key', + type: 'string', + required: false, + description: `Unique key for the mutex group. Amplitude auto-generates one if omitted.`, + }, + ], + }, + { + name: 'amplitudeexperimentmanagement_delete_experiment_deployment', + description: `Undeploy an experiment from a specific deployment — the experiment is removed from that deployment only; any other deployments it's on are unaffected. A successful call returns 200 OK with the literal text 'OK' (not a JSON body); this tool reports success from the status code, not from parsing a response payload. This org has confirmed Feature Experimentation entitlement (live-tested via the list endpoints); the request/response shape below is per Amplitude's published docs and has not been independently live-tested for this specific write endpoint. Rate limit: 100 requests/second and 100,000/day, shared across the whole Experiment Management API (not per-endpoint). CONFIRMED (live-tested on EU): unlike create_experiment_deployment, calling this on the same real "Web"-delivery-method experiment does NOT hit the "Web Experiments are not supported" wall — it goes straight to a 403 "User does not have permission (experimentation)" instead. The web-experiment check that gates CREATE does not gate DELETE on this same endpoint family.`, + params: [ + { + name: 'deployment_id', + type: 'string', + required: true, + description: `The deployment's ID to undeploy this experiment from.`, + }, + { + name: 'id', + type: 'string', + required: true, + description: `The experiment's ID. Find it in the URL of the experiment in the Amplitude app.`, + }, + ], + }, + { + name: 'amplitudeexperimentmanagement_delete_experiment_variant', + description: `Permanently remove a variant from an experiment. CONFIRMED from Amplitude's docs: DELETE /api/1/experiments/{id}/variants/{variantKey}, no request body. A successful call returns 200 OK with the literal text "OK" — Amplitude does not use 204 No Content here, unlike many REST APIs' delete conventions. Amplitude's docs don't document any guard against deleting a variant that's still receiving live traffic, nor what happens if you delete an experiment's only remaining variant — this is unconfirmed either way, so treat the operation as irreversible and verify the experiment's variant list and rollout state first. Rate limit: 100 requests/second and 100,000/day, shared across the whole Experiment Management API (not per-endpoint).`, + params: [ + { name: 'id', type: 'string', required: true, description: `The experiment's ID.` }, + { name: 'variant_key', type: 'string', required: true, description: `The variant's key.` }, + ], + }, + { + name: 'amplitudeexperimentmanagement_delete_flag_deployment', + description: `Undeploy a flag from a specific deployment, identified by deploymentId. This does not delete the deployment itself — a deployment is a shared target that other flags and experiments may also use — it only removes this one flag's association with that deployment. Use List Flag Deployments first to confirm the correct deploymentId if you don't already have it. Per Amplitude's docs, a successful call returns 200 OK with the literal text "OK" as the body — not a JSON object. CONFIRMED (live-tested): this org has Feature Experimentation entitlement. Rate limit: 100 requests/second and 100,000/day, shared across the whole Experiment Management API (not per-endpoint).`, + params: [ + { + name: 'deployment_id', + type: 'string', + required: true, + description: `The deployment's ID.`, + }, + { name: 'id', type: 'string', required: true, description: `The flag's ID.` }, + ], + }, + { + name: 'amplitudeexperimentmanagement_delete_flag_variant', + description: `Permanently remove a variant from an Amplitude Experiment feature flag. This deletes the variant definition itself — its key, name, description, payload, and rollout weight — not just its user or cohort inclusions. This is irreversible; any experiment allocations or targeting rules pointing at this variant key will need to be reconfigured. CONFIRMED (live-tested): this org has Feature Experimentation entitlement. Per Amplitude's docs, a successful call returns a 200 OK response with the literal text "OK" as the body — not a JSON object — so the tool treats the response as raw text rather than parsing it as JSON. Rate limit: 100 requests/second and 100,000/day, shared across the whole Experiment Management API (not per-endpoint).`, + params: [ + { + name: 'id', + type: 'string', + required: true, + description: `The flag's ID (not its key) — find it in the URL of the flag's page in the Amplitude app.`, + }, + { + name: 'variant_key', + type: 'string', + required: true, + description: `The key of the variant to permanently delete.`, + }, + ], + }, + { + name: 'amplitudeexperimentmanagement_get_experiment', + description: `Get complete details for a single Amplitude experiment by its ID. Returns the full experiment object — its shape is CONFIRMED via a live-tested list_experiments call against this org (list_experiments returns objects of this same type): id, projectId, deployments[], key, name, decision (nullable), decisionReason (nullable), description, enabled, evaluationMode (remote|local), bucketingKey, bucketingSalt, bucketingUnit, variants[] (richer than Amplitude's docs show — real shape is {key, payload: [{data: {mutations: [...]}, action: "mutate"}]}), rolledOutVariant (nullable), rolloutPercentage, rolloutWeights{}, targetSegments[], parentDependencies{} (optional, undocumented by Amplitude), stickyBucketing, state (no published enum — only "planning" and "running" appear in Amplitude's own examples, treat any other value as unconfirmed), startDate (nullable), endDate (nullable), experimentType (a-b-test|multi-arm-bandit), deliveryMethod (feature|web), deleted, tags[], createdBy, lastModifiedBy, createdAt, lastModifiedAt — plus two fields Amplitude's docs never mention at all: testInstrumentation (boolean) and version (number). Rate limit: 100 requests/second and 100,000/day, shared across the whole Experiment Management API (not per-endpoint). CONFIRMED (live-tested, reproduced 4x): this specific operation returns HTTP 403 "User does not have permission (experimentation)" for this connected account, even though list_experiments (no ID) and create_experiment both work fine with the same credentials. This looks like a role/permission scope on the Amplitude user tied to this Management API key, not an org-wide entitlement gate (contrast with the Profile API's different "org does not have access" 401) — check the Amplitude user's Experiment role/permissions if you hit this.`, + params: [{ name: 'id', type: 'string', required: true, description: `The experiment's ID.` }], + }, + { + name: 'amplitudeexperimentmanagement_get_experiment_variant', + description: `Get a single variant's details from an Amplitude experiment, by experiment ID and variant key (the variants[].key value, e.g. "control" or "treatment"). Use list_experiment_variants or the parent experiment's variants[] array to find valid keys. Amplitude's docs give no example response JSON for this endpoint; expect the same variant object shape as list_experiment_variants — live-confirmed richer shape {key, payload: [{data: {mutations: [...]}, action: "mutate"}]}, versus the docs' bare {"key": "control"} illustration. Rate limit: 100 requests/second and 100,000/day, shared across the whole Experiment Management API (not per-endpoint). CONFIRMED (live-tested): this exact operation returned HTTP 403 "User does not have permission (experimentation)" when called against a real, pre-existing experiment's real variant, but returned a normal HTTP 400 "Variant key does not exist" (reaching real business logic, not a permission wall) when called against a nonexistent variant key on a different, freshly-created test experiment with the same credentials. This suggests the "experimentation" permission gate may be scoped per-experiment (e.g. by delivery method, ownership, or another per-object attribute) rather than being a blanket gate on this operation — the root cause isn't confirmed, only the discrepancy itself.`, + params: [ + { name: 'id', type: 'string', required: true, description: `The experiment's ID.` }, + { name: 'variant_key', type: 'string', required: true, description: `The variant's key.` }, + ], + }, + { + name: 'amplitudeexperimentmanagement_get_experiment_variant_cohorts', + description: `List the cohorts explicitly included in this experiment variant's targeting. CONFIRMED from Amplitude's docs: GET /api/1/experiments/{id}/variants/{variantKey}/cohorts, no query parameters documented (no pagination). Response is 200 OK with an array of cohort ID strings (not objects), per Amplitude's docs. Rate limit: 100 requests/second and 100,000/day, shared across the whole Experiment Management API (not per-endpoint). CONFIRMED (live-tested): this exact operation returned HTTP 403 "User does not have permission (experimentation)" when called against a real, pre-existing experiment's real variant, but returned a normal HTTP 400 "Variant key does not exist" (reaching real business logic, not a permission wall) when called against a nonexistent variant key on a different, freshly-created test experiment with the same credentials. This suggests the "experimentation" permission gate may be scoped per-experiment (e.g. by delivery method, ownership, or another per-object attribute) rather than being a blanket gate on this operation — the root cause isn't confirmed, only the discrepancy itself.`, + params: [ + { name: 'id', type: 'string', required: true, description: `The experiment's ID.` }, + { name: 'variant_key', type: 'string', required: true, description: `The variant's key.` }, + ], + }, + { + name: 'amplitudeexperimentmanagement_get_experiment_variant_users', + description: `List the users and devices explicitly force-bucketed into this experiment variant via inclusions — separate from, and in addition to, the experiment's normal allocation/targeting rules. CONFIRMED from Amplitude's docs: GET /api/1/experiments/{id}/variants/{variantKey}/users, no query parameters documented (no pagination). Response is 200 OK with the variant's inclusions as an array of JSON objects; Amplitude's docs don't show a concrete example of what fields are on each object, so treat the inclusion object's shape as unconfirmed until you inspect a live response — the sibling 'remove users from variant' endpoint does confirm these are addressable by a zero-indexed userIndex, which is a useful hint about the response's ordering. Rate limit: 100 requests/second and 100,000/day, shared across the whole Experiment Management API (not per-endpoint). CONFIRMED (live-tested): this exact operation returned HTTP 403 "User does not have permission (experimentation)" when called against a real, pre-existing experiment's real variant, but returned a normal HTTP 400 "Variant key does not exist" (reaching real business logic, not a permission wall) when called against a nonexistent variant key on a different, freshly-created test experiment with the same credentials. This suggests the "experimentation" permission gate may be scoped per-experiment (e.g. by delivery method, ownership, or another per-object attribute) rather than being a blanket gate on this operation — the root cause isn't confirmed, only the discrepancy itself.`, + params: [ + { name: 'id', type: 'string', required: true, description: `The experiment's ID.` }, + { name: 'variant_key', type: 'string', required: true, description: `The variant's key.` }, + ], + }, + { + name: 'amplitudeexperimentmanagement_get_experiment_version', + description: `Get a single historical version snapshot of an Amplitude experiment, by experiment ID and version ID. Use a version ID returned from list_experiment_versions. Amplitude's docs describe this endpoint only as returning "details of a specific version of an experiment" — no example response JSON and no query parameters are documented, so the exact snapshot shape is UNCONFIRMED; expect it to mirror the experiment object's fields as they existed at that version, plus version metadata (e.g. version number, createdBy, createdAt). Rate limit: 100 requests/second and 100,000/day, shared across the whole Experiment Management API (not per-endpoint). CONFIRMED (live-tested): this exact operation returned HTTP 403 "User does not have permission (experimentation)" when called against a real, pre-existing experiment's real variant, but returned a normal HTTP 400 "Variant key does not exist" (reaching real business logic, not a permission wall) when called against a nonexistent variant key on a different, freshly-created test experiment with the same credentials. This suggests the "experimentation" permission gate may be scoped per-experiment (e.g. by delivery method, ownership, or another per-object attribute) rather than being a blanket gate on this operation — the root cause isn't confirmed, only the discrepancy itself.`, + params: [ + { name: 'id', type: 'string', required: true, description: `The experiment's ID.` }, + { + name: 'version_id', + type: 'string', + required: true, + description: `The version's ID, from a prior list_experiment_versions call.`, + }, + ], + }, + { + name: 'amplitudeexperimentmanagement_get_flag', + description: `Get the full configuration of a single Amplitude Experiment feature flag by its ID. Returns the flag's complete details as documented by Amplitude: id, projectId, deployments, key, name, description, enabled, evaluationMode, bucketingKey, bucketingSalt, bucketingUnit, variants, rolloutPercentage, rolloutWeights, targetSegments, deleted, tags, createdBy, lastModifiedBy, createdAt, and lastModifiedAt (timestamps in UTC ISO 8601). This org has confirmed Feature Experimentation entitlement (verified via live-tested List Flags and List Experiments calls against this same API), so this endpoint should not hit entitlement-gating errors. UNCONFIRMED: whether parentDependencies appears in this specific endpoint's response — Amplitude's docs for this endpoint don't show a full example response body, so its presence/shape here is inferred from the general flag object schema rather than directly observed. Rate limit: 100 requests/second and 100,000/day, shared across the whole Experiment Management API (not per-endpoint).`, + params: [ + { + name: 'id', + type: 'string', + required: true, + description: `The flag's ID, as shown in the Amplitude app URL for the flag.`, + }, + ], + }, + { + name: 'amplitudeexperimentmanagement_get_flag_variant', + description: `Get a single variant's details from an Amplitude Experiment feature flag. Returns a JSON object with key (required), and optional payload, name, and description fields. Variant keys may contain letters, numbers, underscores, and hyphens (per Amplitude's docs). This org has confirmed Feature Experimentation entitlement (verified via live-tested List Flags and List Experiments calls). Rate limit: 100 requests/second and 100,000/day, shared across the whole Experiment Management API (not per-endpoint).`, + params: [ + { + name: 'id', + type: 'string', + required: true, + description: `The flag's ID, as shown in the Amplitude app URL for the flag.`, + }, + { + name: 'variant_key', + type: 'string', + required: true, + description: `The variant's key. May contain letters, numbers, underscores, and hyphens.`, + }, + ], + }, + { + name: 'amplitudeexperimentmanagement_get_flag_variant_cohorts', + description: `List the cohorts individually assigned (included) to a specific variant of an Amplitude Experiment feature flag. No query parameters, filters, or pagination are documented for this endpoint. Per Amplitude's docs, a successful call returns a 200 OK response with "the variant's cohort inclusions as an array of cohort IDs" — a flat array of ID strings. No literal example response body is published, but the docs are explicit that the array holds cohort IDs directly (unlike the sibling Get Flag Variant Users endpoint, whose array-of-JSON-objects shape is not documented in detail). CONFIRMED (live-tested): this org has Feature Experimentation entitlement. Rate limit: 100 requests/second and 100,000/day, shared across the whole Experiment Management API (not per-endpoint).`, + params: [ + { + name: 'id', + type: 'string', + required: true, + description: `The flag's ID (not its key) — find it in the URL of the flag's page in the Amplitude app.`, + }, + { + name: 'variant_key', + type: 'string', + required: true, + description: `The key of the variant to fetch cohort inclusions for.`, + }, + ], + }, + { + name: 'amplitudeexperimentmanagement_get_flag_variant_users', + description: `List the users and devices individually assigned (included) to a specific variant of an Amplitude Experiment feature flag — the explicit targeting list, separate from the variant's percentage-based rollout weight. No query parameters, filters, or pagination are documented for this endpoint. UNCONFIRMED: Amplitude's docs state the response is a 200 OK with "the variant's inclusions as an array of JSON objects", but do not publish an example response body or the field names inside those objects — treat the exact object shape as unconfirmed until you've inspected a live response. CONFIRMED (live-tested): this org has Feature Experimentation entitlement. Rate limit: 100 requests/second and 100,000/day, shared across the whole Experiment Management API (not per-endpoint).`, + params: [ + { + name: 'id', + type: 'string', + required: true, + description: `The flag's ID (not its key) — find it in the URL of the flag's page in the Amplitude app.`, + }, + { + name: 'variant_key', + type: 'string', + required: true, + description: `The key of the variant to fetch user/device inclusions for.`, + }, + ], + }, + { + name: 'amplitudeexperimentmanagement_get_flag_version', + description: `Get a single version snapshot of an Amplitude Experiment feature flag. Returns a JSON object with createdAt, createdBy, version (a number), and flagConfig (the full flag configuration as it existed at that version — id, projectId, deployments, key, name, description, enabled, evaluationMode, bucketingKey, bucketingSalt, bucketingUnit, variants, rolloutPercentage, rolloutWeights, and targetSegments). UNCONFIRMED: the exact relationship between the versionId path value and the numeric \`version\` field returned by List Flag Versions — Amplitude's docs type versionId as a string and describe it only as "the version's ID" without a worked example, so pass the identifier exactly as returned by a prior List Flag Versions call rather than assuming it equals the stringified \`version\` number. This org has confirmed Feature Experimentation entitlement (verified via live-tested List Flags and List Experiments calls). Rate limit: 100 requests/second and 100,000/day, shared across the whole Experiment Management API (not per-endpoint).`, + params: [ + { + name: 'id', + type: 'string', + required: true, + description: `The flag's ID, as shown in the Amplitude app URL for the flag.`, + }, + { + name: 'version_id', + type: 'string', + required: true, + description: `The version's ID. Pass the value exactly as returned by a prior List Flag Versions call.`, + }, + ], + }, + { + name: 'amplitudeexperimentmanagement_get_holdout_group', + description: `Retrieve a single holdout group's full configuration by ID — expected to mirror the shape accepted by Create Holdout Group (name, description, holdoutPercentage, evaluationMode, bucketingKey, experiments, individualInclusion, individualExclusion). UNCONFIRMED (doc gap): Amplitude's own API reference does not publish an actual response body example for this endpoint — it only states that a successful call returns "a JSON object with the holdout group's details." The exact field names have not been independently verified. This org has confirmed Feature Experimentation entitlement (verified via live-tested List Flags and List Experiments calls). Rate limit: 100 requests/second and 100,000/day, shared across the whole Experiment Management API (not per-endpoint). LIKELY GATED (not independently tested): create_holdout_group and create_mutex_group both return 403 "User does not have permission (experiment_groups)" for this connected account — this operation touches the same resource type, so it likely hits the same permission wall, but wasn't directly confirmed since there was no way to create a real holdout/mutex group to test against. OBSERVED (EU probe, not conclusive): calling this with a syntactically valid but nonexistent id returns HTTP 400 "Flag or experiment not found" rather than a 403 — suggesting, but not proving, that GET may not be gated by the experiment_groups scope the way create_holdout_group is. Still not independently confirmed against a real holdout group, since there is no way to create one.`, + params: [ + { name: 'id', type: 'string', required: true, description: `The holdout group's ID.` }, + ], + }, + { + name: 'amplitudeexperimentmanagement_get_mutex_group', + description: `Retrieve a single mutex group's full configuration by ID — expected to include its slots and which experiments, holdouts, or individuals occupy each one, mirroring the shape accepted by Create Mutex Group (name, description, evaluationMode, bucketingKey, bucketingSalt, and a slots array of {percentage, experiments, holdouts, individuals}). UNCONFIRMED (doc gap): Amplitude's own API reference does not publish an actual response body example for this endpoint — it only states that a successful call returns "a 200 OK response and a JSON object with the mutex group's details." The exact field names and whether slots are included have not been independently verified. This org has confirmed Feature Experimentation entitlement (verified via live-tested List Flags and List Experiments calls). Rate limit: 100 requests/second and 100,000/day, shared across the whole Experiment Management API (not per-endpoint). LIKELY GATED (not independently tested): create_holdout_group and create_mutex_group both return 403 "User does not have permission (experiment_groups)" for this connected account — this operation touches the same resource type, so it likely hits the same permission wall, but wasn't directly confirmed since there was no way to create a real holdout/mutex group to test against. OBSERVED (EU probe, not conclusive): calling this with a syntactically valid but nonexistent id returns HTTP 400 "Flag or experiment not found" rather than a 403 — suggesting, but not proving, that GET may not be gated by the experiment_groups scope the way create_mutex_group is. Still not independently confirmed against a real mutex group, since there is no way to create one.`, + params: [{ name: 'id', type: 'string', required: true, description: `The mutex group's ID.` }], + }, + { + name: 'amplitudeexperimentmanagement_list_all_versions', + description: `List version history across ALL flags and experiments the API key can access, in one global, paginated feed — distinct from amplitudeexperimentmanagement_list_flag_versions and amplitudeexperimentmanagement_list_experiment_versions, which return the version history for one specific flag or experiment and do NOT support start/end/limit/cursor pagination. This global endpoint DOES support all four. CONFIRMED from Amplitude's docs: versions are ordered by creation time, descending, and the response follows {"nextCursor": number, "versions": [{"createdAt": ISO 8601 string, "createdBy": userId number, "version": number, "flagConfig": {...full flag config snapshot...}}]}. UNCONFIRMED: Amplitude's docs only show flagConfig in the example, despite this endpoint's description explicitly covering both flags and experiments — whether experiment-type version entries carry an analogous experimentConfig key (or something else) instead of flagConfig is NOT confirmed by the docs and has not been independently verified. No default value for limit is documented, and no maximum time range for start/end is documented. This org has confirmed Feature Experimentation entitlement (verified via live-tested List Flags and List Experiments calls). Rate limit: 100 requests/second and 100,000/day, shared across the whole Experiment Management API (not per-endpoint). CONFIRMED (live-tested on EU, resolves a previously-open question): experiment-type version entries use the exact same "flagConfig" key as flag-type entries — there is no separate "experimentConfig" key. Distinguish the two only by the snapshot's own shape (e.g. presence of variants[].payload mutation objects) or by cross-referencing the id against list_experiments.`, + params: [ + { + name: 'cursor', + type: 'string', + required: false, + description: `Opaque pagination token from a previous response's nextCursor field. Don't construct this value yourself — pass back exactly what a prior call returned.`, + }, + { + name: 'end', + type: 'string', + required: false, + description: `ISO 8601 formatted end time of versions to return (exclusive). Not explicitly marked required/optional by Amplitude's docs; treated as optional for consistency with limit/cursor on this same endpoint.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of versions to return, capped at 1000. No documented default — omit to use Amplitude's own default page size.`, + }, + { + name: 'start', + type: 'string', + required: false, + description: `ISO 8601 formatted start time of versions to return (inclusive). Not explicitly marked required/optional by Amplitude's docs; treated as optional for consistency with limit/cursor on this same endpoint.`, + }, + ], + }, + { + name: 'amplitudeexperimentmanagement_list_deployments', + description: `List all deployments in the project. A deployment represents one SDK key / environment (for example "Production" or "Development") that flags and experiments get deployed to. CONFIRMED from Amplitude's docs: the response follows {"deployments": [{"id": ..., "projectId": ..., "label": ..., "key": ..., "deleted": ...}]}. UNCONFIRMED: Amplitude's docs don't show a nextCursor field on this specific response example (unlike List Flags/List Experiments), and don't state the primitive type of id/projectId in the response — treat pagination and exact numeric-vs-string typing as unconfirmed until verified live. This endpoint documents only limit/cursor — no key or projectId filter is documented. This org has confirmed Feature Experimentation entitlement (verified via live-tested List Flags and List Experiments calls). Rate limit: 100 requests/second and 100,000/day, shared across the whole Experiment Management API (not per-endpoint).`, + params: [ + { + name: 'cursor', + type: 'string', + required: false, + description: `Opaque pagination token from a previous response's nextCursor field. Don't construct this value yourself — pass back exactly what a prior call returned.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of deployments to return, capped at 1000. No documented default — omit to use Amplitude's own default page size.`, + }, + ], + }, + { + name: 'amplitudeexperimentmanagement_list_experiment_deployments', + description: `List the deployments that an experiment is currently deployed to. Amplitude's docs for this endpoint describe the response only as a '200 OK response and an array of JSON objects with the experiment's deployment details', without a concrete field-level example on this specific page. Based on the shape of the equivalent account-level GET /api/1/deployments endpoint (documented elsewhere in Amplitude's docs), each object likely includes id, projectId, label, key, and deleted fields — treat this as inferred, not confirmed, until you've seen a live response from this exact endpoint. No query parameters are documented for this endpoint (no pagination). This org has confirmed Feature Experimentation entitlement (live-tested via the list endpoints); this specific endpoint's response has not been independently live-tested. Rate limit: 100 requests/second and 100,000/day, shared across the whole Experiment Management API (not per-endpoint). CONFIRMED (live-tested, reproduced 4x): this specific operation returns HTTP 403 "User does not have permission (experimentation)" for this connected account, even though list_experiments (no ID) and create_experiment both work fine with the same credentials. This looks like a role/permission scope on the Amplitude user tied to this Management API key, not an org-wide entitlement gate (contrast with the Profile API's different "org does not have access" 401) — check the Amplitude user's Experiment role/permissions if you hit this.`, + params: [ + { + name: 'id', + type: 'string', + required: true, + description: `The experiment's ID. Find it in the URL of the experiment in the Amplitude app.`, + }, + ], + }, + { + name: 'amplitudeexperimentmanagement_list_experiment_variants', + description: `List all variants defined on a single Amplitude experiment. Amplitude's docs document no query parameters and give no example response JSON for this endpoint — expect an array of variant objects matching the variants[] entries embedded in the experiment resource. A live-tested list_experiments call against this org showed a richer variant shape than Amplitude's own Create Experiment example: {key, payload: [{data: {mutations: [...]}, action: "mutate"}]}, versus the docs' bare {"key": "control"} illustration — expect the same richer shape here, plus possibly name/description per the Create Experiment variant schema (key required; payload, name, description optional). Rate limit: 100 requests/second and 100,000/day, shared across the whole Experiment Management API (not per-endpoint). CONFIRMED (live-tested, reproduced 4x): this specific operation returns HTTP 403 "User does not have permission (experimentation)" for this connected account, even though list_experiments (no ID) and create_experiment both work fine with the same credentials. This looks like a role/permission scope on the Amplitude user tied to this Management API key, not an org-wide entitlement gate (contrast with the Profile API's different "org does not have access" 401) — check the Amplitude user's Experiment role/permissions if you hit this.`, + params: [ + { + name: 'id', + type: 'string', + required: true, + description: `The experiment's ID whose variants to list.`, + }, + ], + }, + { + name: 'amplitudeexperimentmanagement_list_experiment_versions', + description: `List the version history for a single Amplitude experiment — one entry per saved change. Amplitude's docs state versions are "ordered by creation time, descending" but document no query parameters for this endpoint (no limit/cursor/date-range filtering) and give no example response JSON, so the exact envelope (bare array vs an object wrapper) and each version's field shape are UNCONFIRMED. Don't confuse this with the unrelated global GET /api/1/versions endpoint (flag-version history), which does document start/end/limit/cursor query params — those don't apply here. Each version is expected to be a snapshot of the experiment's configuration at that point plus version metadata (e.g. version number, createdBy, createdAt), by analogy with the sibling flag-versions endpoint, but this has not been live-tested. Use the returned version identifiers with get_experiment_version to fetch a specific snapshot. Rate limit: 100 requests/second and 100,000/day, shared across the whole Experiment Management API (not per-endpoint). CONFIRMED (live-tested, reproduced 4x): this specific operation returns HTTP 403 "User does not have permission (experimentation)" for this connected account, even though list_experiments (no ID) and create_experiment both work fine with the same credentials. This looks like a role/permission scope on the Amplitude user tied to this Management API key, not an org-wide entitlement gate (contrast with the Profile API's different "org does not have access" 401) — check the Amplitude user's Experiment role/permissions if you hit this.`, + params: [ + { + name: 'id', + type: 'string', + required: true, + description: `The experiment's ID whose version history to list.`, + }, + ], + }, + { + name: 'amplitudeexperimentmanagement_list_experiments', + description: `List Amplitude experiments for the project. Supports cursor-based pagination — pass the response's nextCursor value back as cursor to get the next page — and optional filters. CONFIRMED (live-tested): the real response shape is {"experiments": [...], "nextCursor": ...} — Amplitude's own published example for this endpoint is malformed JSON (nextCursor nested inside the array instead of alongside it); this tool follows the confirmed real shape, not the docs' broken example. Live data also revealed two fields Amplitude's docs don't mention at all: testInstrumentation (boolean) and version (number) on the experiment object, plus a richer variant payload shape ({"data": {"mutations": [...]}, "action": "mutate"}) than the docs' bare {"key": "control"} example. Also note: the experiment state field has no published enum — only "planning" and "running" appear in Amplitude's own examples, so treat any other value you see as unconfirmed. CONFIRMED: this org has Feature Experimentation entitlement — a real call returned actual experiment data, not an entitlement error. Rate limit: 100 requests/second and 100,000/day, shared across the whole Experiment Management API (not per-endpoint).`, + params: [ + { + name: 'cursor', + type: 'string', + required: false, + description: `Opaque pagination token from a previous response's nextCursor field. Don't construct this value yourself — pass back exactly what a prior call returned.`, + }, + { + name: 'delivery_method', + type: 'string', + required: false, + description: `Filter by delivery method: feature or web. Omit to return both.`, + }, + { + name: 'include_archived', + type: 'boolean', + required: false, + description: `When false (default), return only active experiments. When true, return active and archived experiments.`, + }, + { + name: 'key', + type: 'string', + required: false, + description: `Filter to the experiment with this exact experiment key.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of experiments to return, capped at 1000. No documented default — omit to use Amplitude's own default page size.`, + }, + { + name: 'project_id', + type: 'integer', + required: false, + description: `Filter to experiments belonging to this project ID.`, + }, + ], + }, + { + name: 'amplitudeexperimentmanagement_list_flag_deployments', + description: `List the deployments a flag is currently deployed to. Per Amplitude's official docs, a successful call returns 200 OK with an array of JSON objects describing each deployment. UNCONFIRMED: Amplitude's docs don't show a raw JSON response example for this specific flag-scoped endpoint, so the exact envelope shape is not fully verified — the docs' prose describes the body as "an array of JSON objects" (suggesting a bare array), but the general, non-flag-scoped GET /api/1/deployments endpoint wraps its array in a top-level {"deployments": [...]} object instead. Treat either shape as possible until verified live. Based on the general deployments endpoint's documented schema, each deployment object likely includes id, projectId, label, key, and deleted fields, though this hasn't been separately confirmed for the flag-scoped response. CONFIRMED (live-tested): this org has Feature Experimentation entitlement. Rate limit: 100 requests/second and 100,000/day, shared across the whole Experiment Management API (not per-endpoint).`, + params: [{ name: 'id', type: 'string', required: true, description: `The flag's ID.` }], + }, + { + name: 'amplitudeexperimentmanagement_list_flag_variants', + description: `List all variants defined on a single Amplitude Experiment feature flag. Returns a JSON array of variant objects, each with key (required), and optional payload, name, and description fields. CONFIRMED from Amplitude's docs: no cursor/limit pagination parameters are documented for this endpoint — it returns the full variant list in one response. This org has confirmed Feature Experimentation entitlement (verified via live-tested List Flags and List Experiments calls). Rate limit: 100 requests/second and 100,000/day, shared across the whole Experiment Management API (not per-endpoint).`, + params: [ + { + name: 'id', + type: 'string', + required: true, + description: `The flag's ID, as shown in the Amplitude app URL for the flag.`, + }, + ], + }, + { + name: 'amplitudeexperimentmanagement_list_flag_versions', + description: `List the version history for a single Amplitude Experiment feature flag. Returns a JSON array of version objects, each containing createdAt, createdBy, version (a number), and flagConfig (a full snapshot of the flag's configuration at that version, including id, projectId, deployments, key, name, description, enabled, evaluationMode, bucketingKey, bucketingSalt, bucketingUnit, variants, rolloutPercentage, rolloutWeights, and targetSegments). Versions are sorted in descending order (most recent first). CONFIRMED from Amplitude's docs: this per-flag endpoint does NOT document cursor/limit pagination parameters — unlike List Flags and List Experiments, and unlike Amplitude's separate global GET /api/1/versions endpoint (which lists versions across all flags and does support start/end/limit/cursor). This tool intentionally has no pagination input because none is documented for this specific path. This org has confirmed Feature Experimentation entitlement (verified via live-tested List Flags and List Experiments calls). Rate limit: 100 requests/second and 100,000/day, shared across the whole Experiment Management API (not per-endpoint).`, + params: [ + { + name: 'id', + type: 'string', + required: true, + description: `The flag's ID, as shown in the Amplitude app URL for the flag.`, + }, + ], + }, + { + name: 'amplitudeexperimentmanagement_list_flags', + description: `List Amplitude Experiment feature flags for the project. Supports cursor-based pagination — pass the response's nextCursor value back as cursor to get the next page — and optional filters. CONFIRMED (live-tested): this org has Feature Experimentation entitlement — a real call returns a clean 200 with the {"flags": [...], "nextCursor": ...} envelope (an empty array here just means no flags exist yet, not an entitlement problem). Rate limit: 100 requests/second and 100,000/day, shared across the whole Experiment Management API (not per-endpoint).`, + params: [ + { + name: 'cursor', + type: 'string', + required: false, + description: `Opaque pagination token from a previous response's nextCursor field. Don't construct this value yourself — pass back exactly what a prior call returned.`, + }, + { + name: 'include_archived', + type: 'boolean', + required: false, + description: `Include archived flags in the results. Defaults to false (active flags only).`, + }, + { + name: 'key', + type: 'string', + required: false, + description: `Filter to the flag with this exact flag key.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of flags to return, capped at 1000. No documented default — omit to use Amplitude's own default page size.`, + }, + { + name: 'project_id', + type: 'integer', + required: false, + description: `Filter to flags belonging to this project ID.`, + }, + ], + }, + { + name: 'amplitudeexperimentmanagement_list_holdout_groups', + description: `List all holdout groups in the project. A holdout group excludes a fixed percentage of users from every experiment associated with it, so you can measure the overall product impact of those experiments against a clean control population. UNCONFIRMED (doc gap): Amplitude's own API reference does not publish a response body schema or example for this endpoint — it only states that a successful call returns "a 200 OK response" with "a list of holdout groups encoded as JSON." By analogy with List Flags/List Experiments on this same API, the response most likely follows a {"holdouts": [...], "nextCursor": ...} envelope, but this exact shape (including the array's key name and whether holdoutPercentage/experiments/individualInclusion/individualExclusion are included) is NOT confirmed by Amplitude's docs and has not been independently verified. This endpoint documents only limit/cursor — unlike List Flags/List Experiments, Amplitude's docs do not mention a key or projectId filter for listing holdout groups. This org has confirmed Feature Experimentation entitlement (verified via live-tested List Flags and List Experiments calls). Rate limit: 100 requests/second and 100,000/day, shared across the whole Experiment Management API (not per-endpoint).`, + params: [ + { + name: 'cursor', + type: 'string', + required: false, + description: `Opaque pagination token from a previous response's nextCursor field. Don't construct this value yourself — pass back exactly what a prior call returned.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of holdout groups to return, capped at 1000. No documented default — omit to use Amplitude's own default page size.`, + }, + ], + }, + { + name: 'amplitudeexperimentmanagement_list_mutex_groups', + description: `List all mutex groups in the project. A mutex group defines a set of "slots" so that the experiments, flags, holdouts, and/or individuals assigned to the same slot never run simultaneously for the same user — useful for guaranteeing exclusivity between conflicting tests. UNCONFIRMED (doc gap): Amplitude's own API reference does not publish a response body schema or example for this endpoint — it only states that a successful call returns "a 200 OK response and a list of mutex groups encoded as JSON in the response body." By analogy with List Flags/List Experiments on this same API, the response most likely follows a {"mutexes": [...], "nextCursor": ...} envelope, but this exact shape (including the array's key name) is NOT confirmed by Amplitude's docs and has not been independently verified. This endpoint documents only limit/cursor — unlike List Flags/List Experiments, Amplitude's docs do not mention a key or projectId filter for listing mutex groups. This org has confirmed Feature Experimentation entitlement (verified via live-tested List Flags and List Experiments calls). Rate limit: 100 requests/second and 100,000/day, shared across the whole Experiment Management API (not per-endpoint).`, + params: [ + { + name: 'cursor', + type: 'string', + required: false, + description: `Opaque pagination token from a previous response's nextCursor field. Don't construct this value yourself — pass back exactly what a prior call returned.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of mutex groups to return, capped at 1000. No documented default — omit to use Amplitude's own default page size.`, + }, + ], + }, + { + name: 'amplitudeexperimentmanagement_remove_all_experiment_variant_users', + description: `Remove ALL users and devices from an experiment variant's inclusion list in a single call — this clears the entire list, not one entry. To remove only one specific user, use the single-user removal tool (DELETE .../users/{userIndex}) instead. To remove a specific named set of users while leaving everyone else untouched, use the bulk-delete-users tool instead — this tool does not accept a list of IDs and wipes every explicitly-included user/device for the variant unconditionally. A successful call returns 200 OK with the literal text 'OK' (not a JSON body); this tool reports success from the status code, not from parsing a response payload. This org has confirmed Feature Experimentation entitlement (live-tested via the list endpoints); the request/response shape below is per Amplitude's published docs and has not been independently live-tested for this specific write endpoint. Rate limit: 100 requests/second and 100,000/day, shared across the whole Experiment Management API (not per-endpoint).`, + params: [ + { + name: 'id', + type: 'string', + required: true, + description: `The experiment's ID. Find it in the URL of the experiment in the Amplitude app.`, + }, + { + name: 'variant_key', + type: 'string', + required: true, + description: `The variant's key. Every user or device explicitly included in this variant is removed — the list is cleared entirely.`, + }, + ], + }, + { + name: 'amplitudeexperimentmanagement_remove_all_flag_variant_users', + description: `Remove ALL users from a flag variant's individual-inclusion list in a single call. This clears the ENTIRE user list for that variant unconditionally — every individually-included user is removed, not just one. There is no way to keep a subset with this endpoint. To remove only one user, use Remove Flag Variant User with that user's list index instead. To remove a specific named set of users (by ID) while leaving the rest of the list intact, use Bulk Delete Flag Variant Users instead — do not use this endpoint for a partial removal. Per Amplitude's docs, a successful call returns 200 OK with the literal text "OK" as the body — not a JSON object. CONFIRMED (live-tested): this org has Feature Experimentation entitlement. Rate limit: 100 requests/second and 100,000/day, shared across the whole Experiment Management API (not per-endpoint).`, + params: [ + { name: 'id', type: 'string', required: true, description: `The flag's ID.` }, + { name: 'variant_key', type: 'string', required: true, description: `The variant's key.` }, + ], + }, + { + name: 'amplitudeexperimentmanagement_remove_experiment_variant_user', + description: `Remove one specific user or device (by its zero-indexed position) from an experiment variant's inclusion list. Per Amplitude's docs, the userIndex value should come from the 'Get variant inclusions' endpoint's response (GET /api/1/experiments/{id}/variants/{variantKey}/users) — don't invent your own index numbering, since indexes shift as users are added or removed. CONFIRMED documented quirk: Amplitude's own docs type userIndex as a string even though it represents a numeric position — this tool follows that documented type exactly. A successful call returns 200 OK with the literal text 'OK' (not a JSON body); this tool reports success from the status code, not from parsing a response payload. This org has confirmed Feature Experimentation entitlement (live-tested via the list endpoints); the request/response shape below is per Amplitude's published docs and has not been independently live-tested for this specific write endpoint. Rate limit: 100 requests/second and 100,000/day, shared across the whole Experiment Management API (not per-endpoint).`, + params: [ + { + name: 'id', + type: 'string', + required: true, + description: `The experiment's ID. Find it in the URL of the experiment in the Amplitude app.`, + }, + { + name: 'user_index', + type: 'string', + required: true, + description: `Zero-indexed position of the user or device within the variant's inclusion list. Get this index from the 'Get variant inclusions' endpoint's response — don't guess it, since indexes shift as the list changes.`, + }, + { name: 'variant_key', type: 'string', required: true, description: `The variant's key.` }, + ], + }, + { + name: 'amplitudeexperimentmanagement_remove_flag_variant_user', + description: `Remove one specific user from a flag variant's individual-inclusion list, identified by the user's zero-indexed position in that list — not by user ID. Per Amplitude's official docs (confirmed via direct doc fetch), userIndex is documented as type string (e.g. "0", "1", "2"); get the index-based array of users for a variant from the Get Variant Inclusions endpoint (not part of this tool set) before calling this. This removes only the single user at that index. To clear every user from the variant in one call instead, use Remove All Flag Variant Users — that endpoint takes no index and empties the whole list unconditionally. To remove a specific set of users by ID rather than by list position, use Bulk Delete Flag Variant Users. Per Amplitude's docs, a successful call returns 200 OK with the literal text "OK" as the body — not a JSON object. CONFIRMED (live-tested): this org has Feature Experimentation entitlement. Rate limit: 100 requests/second and 100,000/day, shared across the whole Experiment Management API (not per-endpoint).`, + params: [ + { name: 'id', type: 'string', required: true, description: `The flag's ID.` }, + { + name: 'user_index', + type: 'string', + required: true, + description: `The user's zero-indexed position within the variant's individual-inclusion user list. Not a user ID — get an index-based array of users from the Get Variant Inclusions endpoint first.`, + }, + { name: 'variant_key', type: 'string', required: true, description: `The variant's key.` }, + ], + }, + { + name: 'amplitudeexperimentmanagement_update_deployment', + description: `Edit an existing deployment's label, or archive/restore it. Only the provided fields are changed; omitted fields remain unchanged. CONFIRMED from Amplitude's docs: a successful call returns 200 OK with the literal text "OK" as the body, not a JSON object — this tool treats the response as raw text rather than parsing it as JSON. UNCONFIRMED: Amplitude's docs don't document label-uniqueness or conflict behavior for this endpoint. This org has confirmed Feature Experimentation entitlement (verified via live-tested List Flags and List Experiments calls). Rate limit: 100 requests/second and 100,000/day, shared across the whole Experiment Management API (not per-endpoint). CONFIRMED (live-tested both regions): \`archive: true\` fails with 400 "Cannot have unarchived flags or experiments or templates using this deployment" if any non-archived flag or experiment is still attached to it. Archive (or detach) every flag/experiment on this deployment first.`, + params: [ + { name: 'id', type: 'string', required: true, description: `The deployment's ID.` }, + { + name: 'archive', + type: 'boolean', + required: false, + description: `When true, archives (soft-deletes) the deployment; set to false to restore it. Omit to leave unchanged.`, + }, + { + name: 'label', + type: 'string', + required: false, + description: `New display label for the deployment. Must contain only alphanumeric characters and/or \`_\`, \`-\`, per Amplitude's docs.`, + }, + ], + }, + { + name: 'amplitudeexperimentmanagement_update_experiment', + description: `Update an existing Amplitude experiment — partial update; only provided fields change (except end_date, see below). Editable fields: name, description, bucketing_key, bucketing_salt, bucketing_unit, evaluation_mode (remote|local), rollout_percentage (0-100), target_segments (JSON-encoded string, REPLACES the segment list entirely, no cohort support), enabled, archive, experiment_type (a-b-test|multi-arm-bandit), sticky_bucketing, start_date, end_date (ISO 8601; send null explicitly to clear it), exposure_event (JSON-encoded string, shape undocumented by Amplitude), tags (UNCONFIRMED whether this replaces or diffs the existing list), decision, decision_reason, rolled_out_variant. + +State is not directly settable — Amplitude derives it from enabled (planning→running), archive (a separate axis), and decision: "rollout" ramps rollout_percentage to 100 favoring rolled_out_variant and disables sticky_bucketing; "rollback" zeroes rollout; "continue-running" pairs with a new end_date. This model is inferred from docs, not live-confirmed by a real PATCH — verify the returned state in practice. + +Complex fields (target_segments, exposure_event) are JSON-encoded strings, not native objects. Rate limit: 100 req/s, 100,000/day, shared across the whole API. + +CONFIRMED (live-tested, reproduced 4x): returns 403 "User does not have permission (experimentation)" — a role/permission scope on the Amplitude user, not an org-wide gate (list_experiments and create_experiment work fine with the same credentials). CONFIRMED (live-tested both regions): a real "web"-delivery experiment instead fails with 400 "Web Experiments are not supported by Management API yet" — checked BEFORE the permission wall, so check deliveryMethod (via get_experiment/list_experiments) before assuming a failure here is the 403.`, + params: [ + { name: 'id', type: 'string', required: true, description: `The experiment's ID to update.` }, + { + name: 'archive', + type: 'boolean', + required: false, + description: `Archives (true) or unarchives (false) the experiment. A separate axis from enabled/decision.`, + }, + { + name: 'bucketing_key', + type: 'string', + required: false, + description: `User property Amplitude uses to consistently bucket the same user into the same variant.`, + }, + { + name: 'bucketing_salt', + type: 'string', + required: false, + description: `Salt value mixed into the bucketing hash — changing it re-randomizes user assignment across variants.`, + }, + { + name: 'bucketing_unit', + type: 'string', + required: false, + description: `Group type from your Amplitude Accounts add-on to bucket by (e.g. an org or account-level group instead of the individual user).`, + }, + { + name: 'decision', + type: 'string', + required: false, + description: `Records a decision made when ending/completing an experiment. "rollout" ramps rollout_percentage to 100 and rollout weights to a 100/0 split favoring rolled_out_variant, and disables sticky_bucketing. "rollback" turns the experiment off and rollout percentages to 0. "continue-running" extends the experiment (pair with a new end_date). See the tool description's state-transition notes — this mechanism is inferred from Amplitude's docs, not live-tested.`, + }, + { + name: 'decision_reason', + type: 'string', + required: false, + description: `Free-text reason recorded alongside the decision field.`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `New human-readable experiment description.`, + }, + { + name: 'enabled', + type: 'boolean', + required: false, + description: `Activates (true) or deactivates (false) the experiment. Based on Amplitude's docs, this is the closest documented mechanism to moving an experiment out of "planning" toward "running" — see the tool description's state-transition notes.`, + }, + { + name: 'end_date', + type: 'string', + required: false, + description: `New end date/time for the experiment, ISO 8601 format. Amplitude's docs note this field "can be null" — pass null explicitly to clear an existing end date (this tool forwards an explicit null through to Amplitude), or omit the field entirely to leave the current end date unchanged.`, + }, + { + name: 'evaluation_mode', + type: 'string', + required: false, + description: `Where variant assignment is evaluated: remote (Amplitude's servers) or local (in your SDK).`, + }, + { + name: 'experiment_type', + type: 'string', + required: false, + description: `The experiment's statistical design.`, + }, + { + name: 'exposure_event', + type: 'string', + required: false, + description: `JSON-encoded object configuring a custom exposure event for this experiment. Amplitude's docs name this field but do not document its internal shape beyond "custom exposure event configuration" — treat the shape as UNCONFIRMED and verify with a real call. Pass as a JSON-encoded STRING, not a native object.`, + }, + { + name: 'name', + type: 'string', + required: false, + description: `New human-readable experiment name.`, + }, + { + name: 'rolled_out_variant', + type: 'string', + required: false, + description: `The variant key or name being rolled out, used together with decision: "rollout".`, + }, + { + name: 'rollout_percentage', + type: 'number', + required: false, + description: `Percentage of non-targeted users (0-100) exposed to this experiment's variants.`, + }, + { + name: 'start_date', + type: 'string', + required: false, + description: `New start date/time for the experiment, ISO 8601 format.`, + }, + { + name: 'sticky_bucketing', + type: 'boolean', + required: false, + description: `When true, a user keeps the same variant across evaluations even if rollout weights or targeting later change.`, + }, + { + name: 'tags', + type: 'array', + required: false, + description: `Tags for this experiment. Amplitude's docs disagree on whether this replaces the full tag list or diffs against it (adds/deletes) — see the tool description's NOTE on tags. Verify actual behavior with a real call.`, + }, + { + name: 'target_segments', + type: 'string', + required: false, + description: `JSON-encoded array of target segment objects that REPLACES the experiment's existing segment list entirely. Documented shape per segment: {"name": string (required), "conditions": [{"type": "property" (fixed value), "prop": string, "op": one of is|is not|contains|does not contain|less|less or equal|greater|greater or equal|set is|set is not|set contains|set does not contain|glob match|glob does not match, "values": string[]}] (required), "percentage": number (required), "rolloutWeights": object mapping variant key to weight (required)}. Cohort-based targeting is not supported. Pass as a JSON-encoded STRING, not a native array.`, + }, + ], + }, + { + name: 'amplitudeexperimentmanagement_update_experiment_variant', + description: `Edit an existing experiment variant — rename its key, or update name, description, payload, or rolloutWeight. All body fields are optional; omit a field to leave its current value unchanged. CONFIRMED FROM RAW PAGE SOURCE (not just visible rendered text): this endpoint is PATCH, not POST — verified directly in Amplitude's rendered doc source, where both the section heading's one-line method summary and the full curl example agree: 'PATCH .../experiments//variants/'. Note that the equivalent Flags API doc page has a genuine docs bug for this same operation: its one-line method summary says POST, but the curl example directly beneath it uses PATCH — if you've seen POST associated with 'edit variant' elsewhere, that's this docs inconsistency, not a different real endpoint; the detailed curl example is the reliable source in both places, and it says PATCH on both the Flags and Experiments pages. payload REPLACES the entire existing payload (it is not merged); pass it as a JSON-encoded string, e.g. the shape confirmed live on this org: [{"data":{"mutations":[]},"action":"mutate"}]. rolloutWeight has no documented numeric range in Amplitude's docs. A successful call returns 200 OK with the literal text "OK", not a JSON body. Rate limit: 100 requests/second and 100,000/day, shared across the whole Experiment Management API (not per-endpoint).`, + params: [ + { name: 'id', type: 'string', required: true, description: `The experiment's ID.` }, + { name: 'variant_key', type: 'string', required: true, description: `The variant's key.` }, + { + name: 'description', + type: 'string', + required: false, + description: `Description for the variant.`, + }, + { + name: 'key', + type: 'string', + required: false, + description: `New variant key, if you want to rename this variant. Can only contain letters, numbers, underscores (_), and hyphens (-).`, + }, + { + name: 'name', + type: 'string', + required: false, + description: `Display name for the variant.`, + }, + { + name: 'payload', + type: 'string', + required: false, + description: `Payload for the variant, as a JSON-encoded string. Must be a valid JSON element (object, array, or primitive). This value REPLACES the existing payload entirely — it is not merged. A real variant payload confirmed live on this org looked like [{"data":{"mutations":[]},"action":"mutate"}].`, + }, + { + name: 'rollout_weight', + type: 'number', + required: false, + description: `Rollout weight for non-targeted users. Amplitude's docs don't document a numeric range or scale for this value.`, + }, + ], + }, + { + name: 'amplitudeexperimentmanagement_update_flag', + description: `Edit an existing Amplitude Experiment feature flag — partial update, only provided fields change. + +CONFIRMED editable: name, description, bucketingKey, bucketingSalt, bucketingUnit, evaluationMode, rolloutPercentage, targetSegments, enabled, archive, tags. CONFIRMED NOT editable: variants, deployments, projectId, key, the flag-level rolloutWeights object (only the copy nested inside each targetSegments entry is patchable), and parentDependencies. \`archive: true\`/\`false\` is the write-side counterpart of the flag's read-only \`deleted\` field. UNCONFIRMED whether array fields (targetSegments, tags) replace vs. merge on PATCH — treat as full replacement until shown otherwise. + +CONFIRMED (live-tested): \`archive\` must be sent ALONE — combining it with any other field fails with "Cannot edit archived flag", even on an unarchived flag. CONFIRMED (live-tested both regions, full field sweep): \`enabled: true\` fails with 400 "Cannot activate without deployments" unless the flag already has one attached. \`bucketing_unit\` must name a real, configured Group Type — an arbitrary string fails 400 "Invalid bucketing unit". All other fields (\`bucketing_key\`, \`bucketing_salt\`, \`evaluation_mode\`, \`rollout_percentage\`, \`tags\`, \`target_segments\`) confirmed working together in one call — \`tags\` is a native array, not a JSON string like \`target_segments\`. + +Rate limit: 100 req/s, 100,000/day, shared across the whole API.`, + params: [ + { + name: 'id', + type: 'string', + required: true, + description: `The flag's ID, as shown in the Amplitude app URL for the flag.`, + }, + { + name: 'archive', + type: 'boolean', + required: false, + description: `Archive (true) or unarchive (false) the flag. Archiving is Amplitude's soft-delete for flags.`, + }, + { + name: 'bucketing_key', + type: 'string', + required: false, + description: `The user property to bucket users by when assigning variants.`, + }, + { + name: 'bucketing_salt', + type: 'string', + required: false, + description: `Salt value used in the bucketing hash calculation. Changing this reshuffles which variant each user is bucketed into.`, + }, + { + name: 'bucketing_unit', + type: 'string', + required: false, + description: `Bucketing unit represented by a group type. Amplitude's docs don't document a fixed enum for this field — use a group type configured for your project.`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `New description of the flag's purpose.`, + }, + { + name: 'enabled', + type: 'boolean', + required: false, + description: `Activate (true) or deactivate (false) the flag.`, + }, + { + name: 'evaluation_mode', + type: 'string', + required: false, + description: `Evaluation mode for the flag: \`remote\` (evaluated server-side per request) or \`local\` (evaluated client-side from a downloaded ruleset).`, + }, + { + name: 'name', + type: 'string', + required: false, + description: `New human-readable name for the flag.`, + }, + { + name: 'rollout_percentage', + type: 'number', + required: false, + description: `Rollout percentage for non-targeted users, range 0-100.`, + }, + { + name: 'tags', + type: 'array', + required: false, + description: `Tags for the flag. Amplitude's docs don't confirm whether this replaces the full tag list or merges with existing tags on PATCH — treat it as a full replacement unless testing shows otherwise.`, + }, + { + name: 'target_segments', + type: 'string', + required: false, + description: `JSON-encoded string (not native JSON) describing target segments evaluated before the default rollout. Must decode to an array of objects: [{"name": "segment name", "conditions": [{"type": "property", "prop": "user property name", "op": "is", "values": ["value1"]}], "percentage": 100, "bucketingKey": "optional user property", "rolloutWeights": {"control":50,"treatment":50}}]. \`name\`, \`conditions\`, and \`percentage\` are required per segment; \`bucketingKey\` is optional. CORRECTION (live-tested both regions): \`rolloutWeights\` is NOT optional despite how this reads — omitting it fails validation with \`"targetSegments[0].rolloutWeights" is required"\`. Always include it, matching the sibling Experiments-side tools which document this correctly. Documented \`op\` values: is, is not, contains, does not contain, less, less or equal, greater, greater or equal, set is, set is not, set contains, set does not contain, glob match, glob does not match, version less than, version less than or equal to, version greater than, version greater than or equal to. Amplitude's docs don't confirm whether sending this replaces the full segment list or merges with existing segments — treat it as a full replacement unless testing shows otherwise.`, + }, + ], + }, + { + name: 'amplitudeexperimentmanagement_update_flag_variant', + description: `Edit an existing flag variant — partial update; a provided \`payload\` fully replaces the existing one rather than merging. + +Amplitude's docs are self-contradictory on the HTTP method: the endpoint heading says POST, but the runnable curl example uses PATCH against the same URL. This tool uses PATCH, matching the example and standard partial-update semantics — flip to POST if you see 404/405. A successful call returns 200 OK with the literal text "OK", not JSON. + +FIXED (confirmed live both regions): this field was previously sent as a raw string instead of a parsed array via body_json_mapping — now uses jsonnet_template + std.parseJson(). CONFIRMED (live-tested both regions): renaming \`key\` does NOT also rename \`name\` if \`name\` was never set explicitly (it had defaulted to mirror the old \`key\`) — set both explicitly to keep them in sync. + +Rate limit: 100 req/s, 100,000/day, shared across the whole API.`, + params: [ + { + name: 'id', + type: 'string', + required: true, + description: `The flag's ID (not its key) — find it in the URL of the flag's page in the Amplitude app.`, + }, + { + name: 'variant_key', + type: 'string', + required: true, + description: `The key of the existing variant to edit.`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `New description for the variant, shown in the Amplitude UI. Omit to keep the current description.`, + }, + { + name: 'key', + type: 'string', + required: false, + description: `New key to rename this variant to. Can only contain letters, numbers, underscores (_), and hyphens (-). Omit to keep the variant's current key.`, + }, + { + name: 'name', + type: 'string', + required: false, + description: `New display name for the variant, shown in the Amplitude UI. Omit to keep the current name.`, + }, + { + name: 'payload', + type: 'string', + required: false, + description: `New variant payload as a JSON-encoded string. Amplitude accepts any valid JSON element here — an object, a quoted string, or a number. This value REPLACES the existing payload entirely rather than merging with it; omit to keep the current payload. See the tool description for a note on richer payload shapes observed elsewhere in this API.`, + }, + { + name: 'rollout_weight', + type: 'number', + required: false, + description: `New rollout weight for users who aren't individually targeted by this variant. No documented range; Amplitude's own example uses 0. Omit to keep the current weight.`, + }, + ], + }, + { + name: 'amplitudeexperimentmanagement_update_holdout_group', + description: `Edit an existing holdout group — partial update, only provided fields change. \`individualInclusion\`/\`individualExclusion\` are named from the holdout's own point of view — inclusion in the holdout means exclusion from experiments, and vice versa. UNCONFIRMED whether array fields (experiments, individualInclusion, individualExclusion) replace vs. merge on PATCH — treat as full replacement until shown otherwise. + +FIXED (confirmed on US): this field was previously sent as a raw string instead of a parsed array via body_json_mapping — now uses jsonnet_template + std.parseJson(). LIKELY GATED (not independently confirmed): create_holdout_group/create_mutex_group both return 403 "User does not have permission (experiment_groups)" — this touches the same resource type, so it likely hits the same wall, but there's no way to create a real holdout group to confirm against. OBSERVED (EU probe, inconclusive): a nonexistent id returns 400 "Flag or experiment not found" rather than 403. + +Rate limit: 100 req/s, 100,000/day, shared across the whole API.`, + params: [ + { name: 'id', type: 'string', required: true, description: `The holdout group's ID.` }, + { + name: 'archive', + type: 'boolean', + required: false, + description: `When true, archives (soft-deletes) the holdout group and removes it from any experiments that reference it, per Amplitude's docs. Omit to leave the archived status unchanged.`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `New description for the holdout group.`, + }, + { + name: 'experiments', + type: 'string', + required: false, + description: `JSON-encoded array of experiment IDs (numbers) to associate with this holdout, e.g. [123]. UNCONFIRMED: Amplitude's docs don't specify replace-vs-merge semantics for this field on PATCH — treat it as a full replacement of the existing list unless testing shows otherwise.`, + }, + { + name: 'individual_exclusion', + type: 'string', + required: false, + description: `JSON-encoded array of user or device ID strings to always exempt from this holdout — these individuals remain eligible for experiments even if randomly selected into the holdout percentage. Maps to Amplitude's individualExclusion field. UNCONFIRMED replace-vs-merge semantics on PATCH.`, + }, + { + name: 'individual_inclusion', + type: 'string', + required: false, + description: `JSON-encoded array of user or device ID strings to always place in this holdout — these individuals are permanently excluded from every experiment associated with the holdout, regardless of random assignment. Maps to Amplitude's individualInclusion field. UNCONFIRMED replace-vs-merge semantics on PATCH.`, + }, + { + name: 'name', + type: 'string', + required: false, + description: `New display name for the holdout group.`, + }, + ], + }, + { + name: 'amplitudeexperimentmanagement_update_mutex_group', + description: `Edit an existing mutex group's name, description, or archived state. Only the provided fields are changed; omitted fields remain unchanged. This endpoint does NOT edit slots — to change which experiments, holdouts, or individuals occupy a slot, use amplitudeexperimentmanagement_update_mutex_group_slot instead. UNCONFIRMED: Amplitude's docs don't document what happens to the mutex group's existing slots when archive is set to true beyond "removes from child experiments" — whether the slots themselves are cleared or merely deactivated is not specified. This org has confirmed Feature Experimentation entitlement (verified via live-tested List Flags and List Experiments calls). Rate limit: 100 requests/second and 100,000/day, shared across the whole Experiment Management API (not per-endpoint). LIKELY GATED (not independently tested): create_holdout_group and create_mutex_group both return 403 "User does not have permission (experiment_groups)" for this connected account — this operation touches the same resource type, so it likely hits the same permission wall, but wasn't directly confirmed since there was no way to create a real holdout/mutex group to test against. OBSERVED (EU probe, not conclusive): calling this with a syntactically valid but nonexistent id returns HTTP 400 "Flag or experiment not found" rather than a 403 — same inconclusive signal as get_mutex_group. Still not independently confirmed against a real mutex group.`, + params: [ + { name: 'id', type: 'string', required: true, description: `The mutex group's ID.` }, + { + name: 'archive', + type: 'boolean', + required: false, + description: `When true, archives (soft-deletes) the mutex group and removes it from any child experiments/holdouts that reference it, per Amplitude's docs. Omit to leave the archived status unchanged.`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `New description for the mutex group.`, + }, + { + name: 'name', + type: 'string', + required: false, + description: `New display name for the mutex group.`, + }, + ], + }, + { + name: 'amplitudeexperimentmanagement_update_mutex_group_slot', + description: `Edit which experiments, holdouts, and/or individuals occupy one slot in a mutex group, without touching the slot's percentage or any other slot. Complex fields are JSON-encoded strings, not native arrays. UNCONFIRMED whether omitting one of experiments/holdouts/individuals leaves it untouched or clears it — treat provided fields as full replacements and omitted ones as unchanged until verified live. + +FIXED (confirmed on US): this field was previously sent as a raw string instead of a parsed array via body_json_mapping — now uses jsonnet_template + std.parseJson(). LIKELY GATED (not independently confirmed): create_holdout_group/create_mutex_group both return 403 "User does not have permission (experiment_groups)" — this touches the same resource type, so it likely hits the same wall, but there's no way to create a real mutex group to confirm against. + +Rate limit: 100 req/s, 100,000/day, shared across the whole API.`, + params: [ + { name: 'id', type: 'string', required: true, description: `The mutex group's ID.` }, + { + name: 'slot_index', + type: 'integer', + required: true, + description: `Zero-based index of the slot to edit within the mutex group's slots array (as returned by amplitudeexperimentmanagement_get_mutex_group). Amplitude's docs badge this path parameter as Number.`, + }, + { + name: 'experiments', + type: 'string', + required: false, + description: `JSON-encoded array of experiment IDs (numbers) to occupy this slot, e.g. [123,456]. Replaces the slot's existing experiment list. Amplitude's own docs are internally inconsistent about this field's element type between the Create Mutex Group and Edit Mutex Group Slot doc sections (one prose label says "string array", the other says "number array") — this tool follows the concrete JSON examples shown on both pages, which consistently use bare numbers.`, + }, + { + name: 'holdouts', + type: 'string', + required: false, + description: `JSON-encoded array of holdout group IDs (numbers) to occupy this slot, e.g. [456]. Replaces the slot's existing holdout list.`, + }, + { + name: 'individuals', + type: 'string', + required: false, + description: `JSON-encoded array of user or device ID strings to occupy this slot, e.g. ["x@amplitude.com", "abcde-12345"]. Accepts email addresses or opaque device/user ID strings, per Amplitude's own examples. Replaces the slot's existing individuals list.`, + }, + ], + }, +] diff --git a/src/data/agent-connectors/catalog.ts b/src/data/agent-connectors/catalog.ts index 33a3a98f0..35f2b4ea4 100644 --- a/src/data/agent-connectors/catalog.ts +++ b/src/data/agent-connectors/catalog.ts @@ -1635,4 +1635,39 @@ export const catalog: Record = { authType: 'OAuth 2.1/DCR', categories: ['AI'], }, + discordbot: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/discord.svg', + authType: 'API Key', + categories: ['Communication', 'Collaboration'], + }, + amplitudeanalytics: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/amplitude.svg', + authType: 'API Key + Secret Key', + categories: ['Analytics'], + }, + amplitudeexperimentmanagement: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/amplitude.svg', + authType: 'Bearer Token', + categories: ['Analytics'], + }, + mixpanelanalytics: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/mixpanel.svg', + authType: 'Service Account', + categories: ['Analytics'], + }, + mixpanelingestion: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/mixpanel.svg', + authType: 'Service Account', + categories: ['Analytics'], + }, + mixpanelcompliance: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/mixpanel.svg', + authType: 'Bearer Token', + categories: ['Analytics'], + }, + stripe: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/stripe.svg', + authType: 'Bearer Token', + categories: ['Accounting & Finance', 'Developer Tools', 'Automation'], + }, } diff --git a/src/data/agent-connectors/discord.ts b/src/data/agent-connectors/discord.ts index 824aa3357..6119d0e94 100644 --- a/src/data/agent-connectors/discord.ts +++ b/src/data/agent-connectors/discord.ts @@ -1,6 +1,140 @@ import type { Tool } from '../../types/agent-connectors' export const tools: Tool[] = [ + { + name: 'discord_consume_entitlement', + description: `For one-time purchase consumable SKUs, mark a given entitlement for the user as consumed. The entitlement will have consumed: true when listed afterward. This action cannot be undone. Returns 204 No Content on success. Per Discord's official OpenAPI spec, this endpoint also accepts an OAuth2 Bearer token with the \`applications.entitlements\` scope (in addition to Bot Token) — use this tool for user-authorized OAuth connections, or the equivalent discordbot_* tool for bot-token connections.`, + params: [ + { + name: 'application_id', + type: 'string', + required: true, + description: `The ID of the application that owns the entitlement.`, + }, + { + name: 'entitlement_id', + type: 'string', + required: true, + description: `The ID of the entitlement to mark as consumed.`, + }, + ], + }, + { + name: 'discord_create_lobby_channel_invite_for_self', + description: `Create a single-use guild invite to a lobby's linked channel, targeted at the calling user. The lobby must have a linked channel and the caller must be a member of the lobby. The invite expires after one hour. Uses a Bearer token with the sdk.social_layer scope. Per Discord's official OpenAPI spec, this endpoint also accepts a Bot Token (in addition to OAuth2) — use this tool for user-authorized OAuth connections, or the equivalent discordbot_* tool for bot-token connections. Returns a lobby invite object.`, + params: [ + { + name: 'lobby_id', + type: 'string', + required: true, + description: `The ID of the lobby to create a channel invite for.`, + }, + ], + }, + { + name: 'discord_create_or_join_lobby', + description: `Create a new lobby identified by a secret, or join the calling user to the existing lobby with that secret if one already exists. Updates lobby metadata and the calling member's metadata on join. Uses a Bearer token with the sdk.social_layer scope. Per Discord's official OpenAPI spec, this endpoint also accepts a Bot Token (in addition to OAuth2) — use this tool for user-authorized OAuth connections, or the equivalent discordbot_* tool for bot-token connections. Returns a lobby object.`, + params: [ + { + name: 'secret', + type: 'string', + required: true, + description: `Secret used to identify the lobby. If a lobby for this application already exists with this secret, the caller joins it; otherwise a new lobby is created. Max 250 characters.`, + }, + { + name: 'idle_timeout_seconds', + type: 'integer', + required: false, + description: `Seconds to wait before shutting down the lobby after it becomes idle. Between 5 and 604800 (7 days).`, + }, + { + name: 'lobby_metadata', + type: 'object', + required: false, + description: `Optional dictionary of string key/value pairs to set on the lobby. Max total length 1000. Overwrites any existing lobby metadata.`, + }, + { + name: 'member_metadata', + type: 'object', + required: false, + description: `Optional dictionary of string key/value pairs to set on the calling user's lobby member. Max total length 1000.`, + }, + ], + }, + { + name: 'discord_delete_current_user_application_role_connection', + description: `Deletes the application role connection for the current user and the given application. Requires an OAuth2 access token with the role_connections.write scope for the application specified in the path.`, + params: [ + { + name: 'application_id', + type: 'string', + required: true, + description: `The ID of the application to delete the role connection for.`, + }, + ], + }, + { + name: 'discord_delete_test_entitlement', + description: `Delete a currently-active test entitlement. Discord will act as though that user or guild no longer has entitlement to your premium offering. Returns 204 No Content on success. Per Discord's official OpenAPI spec, this endpoint also accepts an OAuth2 Bearer token with the \`applications.entitlements\` scope (in addition to Bot Token) — use this tool for user-authorized OAuth connections, or the equivalent discordbot_* tool for bot-token connections.`, + params: [ + { + name: 'application_id', + type: 'string', + required: true, + description: `The ID of the application that owns the entitlement.`, + }, + { + name: 'entitlement_id', + type: 'string', + required: true, + description: `The ID of the test entitlement to delete.`, + }, + ], + }, + { + name: 'discord_edit_application_command_permissions', + description: `Edit the permissions for a specific application command in a guild. Requires OAuth2 bearer token with applications.commands.permissions.update scope. Returns a guild application command permissions object.`, + params: [ + { + name: 'application_id', + type: 'string', + required: true, + description: `The ID of the application.`, + }, + { + name: 'command_id', + type: 'string', + required: true, + description: `The ID of the command to edit permissions for.`, + }, + { name: 'guild_id', type: 'string', required: true, description: `The ID of the guild.` }, + { + name: 'permissions', + type: 'array', + required: true, + description: `Array of application command permission objects specifying who can use the command.`, + }, + ], + }, + { + name: 'discord_get_application_command_permissions', + description: `Fetch permissions for a specific application command in a guild. Returns a guild application command permissions object.`, + params: [ + { + name: 'application_id', + type: 'string', + required: true, + description: `The ID of the application.`, + }, + { + name: 'command_id', + type: 'string', + required: true, + description: `The ID of the command to get permissions for.`, + }, + { name: 'guild_id', type: 'string', required: true, description: `The ID of the guild.` }, + ], + }, { name: 'discord_get_current_user_application_entitlements', description: `Retrieves entitlements for the current user for a given application. Use when you need to check what premium offerings or subscriptions the authenticated user has access to. Requires the applications.entitlements OAuth2 scope.`, @@ -11,6 +145,18 @@ export const tools: Tool[] = [ required: true, description: `The ID of the application to retrieve entitlements for.`, }, + { + name: 'after', + type: 'string', + required: false, + description: `Retrieve entitlements after this entitlement ID (for pagination).`, + }, + { + name: 'before', + type: 'string', + required: false, + description: `Retrieve entitlements before this entitlement ID (for pagination).`, + }, { name: 'exclude_deleted', type: 'boolean', @@ -23,12 +169,60 @@ export const tools: Tool[] = [ required: false, description: `Whether to exclude ended entitlements.`, }, + { + name: 'guild_id', + type: 'string', + required: false, + description: `The ID of the guild to look up entitlements for.`, + }, { name: 'limit', type: 'integer', required: false, description: `Maximum number of entitlements to return (1–100).`, }, + { + name: 'sku_ids', + type: 'string', + required: false, + description: `Comma-delimited list of SKU IDs to check entitlements for.`, + }, + { + name: 'user_id', + type: 'string', + required: false, + description: `The ID of the user to look up entitlements for.`, + }, + ], + }, + { + name: 'discord_get_current_user_application_role_connection', + description: `Returns the application role connection for the current user and the given application. Requires an OAuth2 access token with the role_connections.write scope for the application specified in the path.`, + params: [ + { + name: 'application_id', + type: 'string', + required: true, + description: `The ID of the application to get the role connection for.`, + }, + ], + }, + { + name: 'discord_get_entitlement', + description: `Retrieve a single entitlement for an application by ID. Use to check whether a specific entitlement is active, its type, and its expiration window. Per Discord's official OpenAPI spec, this endpoint also accepts an OAuth2 Bearer token with the \`applications.entitlements\` scope (in addition to Bot Token) — use this tool for user-authorized OAuth connections, or the equivalent discordbot_* tool for bot-token connections.`, + params: [ + { + name: 'application_id', + type: 'string', + required: true, + description: `The ID of the application that owns the entitlement.`, + }, + { + name: 'entitlement_id', + type: 'string', + required: true, + description: `The ID of the entitlement to retrieve.`, + }, ], }, { @@ -36,6 +230,19 @@ export const tools: Tool[] = [ description: `Retrieves a valid WebSocket (wss) URL for establishing a Gateway connection to Discord. Use when you need to connect to the Discord Gateway for real-time events. No authentication required.`, params: [], }, + { + name: 'discord_get_guild_application_command_permissions', + description: `Fetch permissions for all commands in a guild. Returns an array of guild application command permissions objects. Per Discord's official OpenAPI spec, this endpoint also accepts an OAuth2 Bearer token with the \`applications.commands.permissions.update\` scope (in addition to Bot Token) — use this tool for user-authorized OAuth connections, or the equivalent discordbot_* tool for bot-token connections.`, + params: [ + { + name: 'application_id', + type: 'string', + required: true, + description: `The ID of the application.`, + }, + { name: 'guild_id', type: 'string', required: true, description: `The ID of the guild.` }, + ], + }, { name: 'discord_get_guild_template', description: `Retrieves information about a Discord guild template using its unique template code. Use when you need to get details about a guild template for creating new servers.`, @@ -75,7 +282,7 @@ export const tools: Tool[] = [ }, { name: 'discord_get_invite_deprecated', - description: `DEPRECATED: Use discord_resolve_invite instead. Retrieves information about a specific invite code including guild and channel details. This endpoint is deprecated — prefer the Resolve Invite tool for new integrations.`, + description: `Retrieves information about a specific invite code, including guild and channel details. Use discord_resolve_invite instead, which supports additional query parameters such as guild_scheduled_event_id.`, params: [ { name: 'invite_code', @@ -83,17 +290,35 @@ export const tools: Tool[] = [ required: true, description: `The unique invite code to look up.`, }, + { + name: 'guild_scheduled_event_id', + type: 'string', + required: false, + description: `Guild scheduled event ID to include event details in the response.`, + }, { name: 'with_counts', type: 'boolean', required: false, description: `Whether to include approximate member and presence counts.`, }, + ], + }, + { + name: 'discord_get_lobby_messages', + description: `Retrieve the most recent messages in a Discord lobby. The calling user must be a member of the lobby. Uses a Bearer token with the sdk.social_layer scope. Per Discord's official OpenAPI spec, this endpoint also accepts a Bot Token (in addition to OAuth2) — use this tool for user-authorized OAuth connections, or the equivalent discordbot_* tool for bot-token connections. Returns an array of lobby message objects.`, + params: [ { - name: 'with_expiration', - type: 'boolean', + name: 'lobby_id', + type: 'string', + required: true, + description: `The ID of the lobby to retrieve messages from.`, + }, + { + name: 'limit', + type: 'integer', required: false, - description: `Whether to include the expiration date of the invite.`, + description: `Maximum number of messages to return (1-200). Defaults to 50.`, }, ], }, @@ -129,6 +354,30 @@ export const tools: Tool[] = [ description: `Retrieves Discord OAuth2 public keys (JWKS). Use when you need to verify OAuth2 tokens or access public keys for cryptographic operations such as signature verification.`, params: [], }, + { + name: 'discord_get_sku_subscription', + description: `Retrieve a single subscription for a SKU by its ID. Returns a subscription object with its status, current billing period, and the entitlements it grants. Per Discord's official OpenAPI spec, this endpoint also accepts an OAuth2 Bearer token (in addition to Bot Token) — use this tool for user-authorized OAuth connections, or the equivalent discordbot_* tool for bot-token connections.`, + params: [ + { + name: 'sku_id', + type: 'string', + required: true, + description: `The ID of the SKU the subscription belongs to.`, + }, + { + name: 'subscription_id', + type: 'string', + required: true, + description: `The ID of the subscription to retrieve.`, + }, + { + name: 'user_id', + type: 'string', + required: false, + description: `Optional user ID to verify the subscription belongs to.`, + }, + ], + }, { name: 'discord_get_user', description: `Retrieve information about a Discord user. With OAuth Bearer token, use '@me' as user_id to return the authenticated user's information. With a Bot token, you can query any user by their ID. Returns username, avatar, discriminator, locale, premium status, and email (if email scope is granted).`, @@ -141,6 +390,48 @@ export const tools: Tool[] = [ }, ], }, + { + name: 'discord_leave_lobby', + description: `Remove the calling user from the specified Discord lobby. Safe to call even if the user is no longer a member, but fails if the lobby does not exist. Uses a Bearer token for authorization. Per Discord's official OpenAPI spec, this endpoint also accepts a Bot Token (in addition to OAuth2) — use this tool for user-authorized OAuth connections, or the equivalent discordbot_* tool for bot-token connections. Returns nothing.`, + params: [ + { + name: 'lobby_id', + type: 'string', + required: true, + description: `The ID of the lobby to leave.`, + }, + ], + }, + { + name: 'discord_link_channel_to_lobby', + description: `Link an existing guild text channel to a Discord lobby, or unlink any currently linked channel by omitting channel_id. Uses a Bearer token for authorization; the caller must be a lobby member with the CanLinkLobby lobby member flag. Per Discord's official OpenAPI spec, this endpoint also accepts a Bot Token (in addition to OAuth2) — use this tool for user-authorized OAuth connections, or the equivalent discordbot_* tool for bot-token connections. Returns the updated lobby object.`, + params: [ + { + name: 'lobby_id', + type: 'string', + required: true, + description: `The ID of the lobby to link or unlink a channel for.`, + }, + { + name: 'channel_id', + type: 'string', + required: false, + description: `The ID of the channel to link to the lobby. If omitted, any currently linked channel is unlinked from the lobby.`, + }, + ], + }, + { + name: 'discord_list_guild_channels', + description: `Retrieve all channels in a Discord guild (server). Returns a list of channel objects including text channels, voice channels, categories, and threads. Per Discord's official OpenAPI spec, this endpoint also accepts a plain OAuth2 Bearer token (no specific scope required beyond a valid authorization) in addition to Bot Token — use this tool for user-authorized OAuth connections, or the equivalent discordbot_* tool for bot-token connections.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to retrieve channels for.`, + }, + ], + }, { name: 'discord_list_my_guilds', description: `Lists the current user's guilds, returning partial data (id, name, icon, owner, permissions, features) for each. Primarily used for displaying server lists or verifying guild memberships. Requires the 'guilds' OAuth2 scope.`, @@ -171,6 +462,42 @@ export const tools: Tool[] = [ }, ], }, + { + name: 'discord_list_sku_subscriptions', + description: `Retrieve all subscriptions containing a given SKU, filtered by user. Returns a list of subscription objects representing recurring payments for that SKU. Per Discord's official OpenAPI spec, this endpoint also accepts an OAuth2 Bearer token (in addition to Bot Token) — use this tool for user-authorized OAuth connections, or the equivalent discordbot_* tool for bot-token connections. When called with an OAuth2 token, user_id is optional and defaults to the authorizing user; it is required for Bot Token requests. Supports cursor-based pagination via before/after and limit.`, + params: [ + { + name: 'sku_id', + type: 'string', + required: true, + description: `The ID of the SKU to list subscriptions for.`, + }, + { + name: 'after', + type: 'string', + required: false, + description: `List subscriptions after this subscription ID (for pagination).`, + }, + { + name: 'before', + type: 'string', + required: false, + description: `List subscriptions before this subscription ID (for pagination).`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Number of results to return (1-100). Defaults to 50.`, + }, + { + name: 'user_id', + type: 'string', + required: false, + description: `The ID of the user to return subscriptions for. Optional for OAuth2 requests (defaults to the authorizing user).`, + }, + ], + }, { name: 'discord_list_sticker_packs', description: `Retrieves all available Discord Nitro sticker packs. Returns official Discord sticker packs including pack name, description, stickers, cover sticker, and banner asset.`, @@ -198,12 +525,6 @@ export const tools: Tool[] = [ required: false, description: `Whether to include approximate member and presence counts.`, }, - { - name: 'with_expiration', - type: 'boolean', - required: false, - description: `Whether to include the expiration date of the invite.`, - }, ], }, { @@ -211,4 +532,64 @@ export const tools: Tool[] = [ description: `Retrieves a list of the authenticated user's connected third-party accounts on Discord, such as Twitch, YouTube, GitHub, Steam, and others. Requires the 'connections' OAuth2 scope.`, params: [], }, + { + name: 'discord_send_lobby_message', + description: `Send a message to a Discord lobby. The calling user must be a member of the lobby. Uses a Bearer token with the sdk.social_layer scope. Per Discord's official OpenAPI spec, this endpoint also accepts a Bot Token (in addition to OAuth2) — use this tool for user-authorized OAuth connections, or the equivalent discordbot_* tool for bot-token connections. If the lobby has a linked channel, the message is also forwarded there; if forwarding fails (for example due to AutoMod), the lobby message is still delivered to other lobby members. Returns the created lobby message object.`, + params: [ + { + name: 'content', + type: 'string', + required: true, + description: `Message content. Must be non-empty.`, + }, + { + name: 'lobby_id', + type: 'string', + required: true, + description: `The ID of the lobby to send the message to.`, + }, + { + name: 'flags', + type: 'integer', + required: false, + description: `Optional message flags combined as a bitfield. Only flags creatable by the Social SDK are accepted.`, + }, + { + name: 'metadata', + type: 'object', + required: false, + description: `Optional dictionary of string key/value pairs delivered alongside the message to active clients via the Social SDK. Not persisted on the linked channel message.`, + }, + ], + }, + { + name: 'discord_update_current_user_application_role_connection', + description: `Updates and returns the application role connection for the current user and the given application. Requires an OAuth2 access token with the role_connections.write scope for the application specified in the path.`, + params: [ + { + name: 'application_id', + type: 'string', + required: true, + description: `The ID of the application to update the role connection for.`, + }, + { + name: 'metadata', + type: 'object', + required: false, + description: `Object mapping application role connection metadata keys to their stringified value (max 100 characters) for the user on the platform a bot has connected.`, + }, + { + name: 'platform_name', + type: 'string', + required: false, + description: `The vanity name of the platform a bot has connected (max 50 characters).`, + }, + { + name: 'platform_username', + type: 'string', + required: false, + description: `The username on the platform a bot has connected (max 100 characters).`, + }, + ], + }, ] diff --git a/src/data/agent-connectors/discordbot.ts b/src/data/agent-connectors/discordbot.ts new file mode 100644 index 000000000..621e5893c --- /dev/null +++ b/src/data/agent-connectors/discordbot.ts @@ -0,0 +1,5770 @@ +import type { Tool } from '../../types/agent-connectors' + +export const tools: Tool[] = [ + { + name: 'discordbot_add_guild_member', + description: `Add a user to a guild using their OAuth2 access token with the guilds.join scope. Returns 201 if the user was added, or 204 if already a member.`, + params: [ + { + name: 'access_token', + type: 'string', + required: true, + description: `OAuth2 access token of the user to add, with guilds.join scope.`, + }, + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to add the user to.`, + }, + { + name: 'user_id', + type: 'string', + required: true, + description: `The ID of the user to add to the guild.`, + }, + { + name: 'deaf', + type: 'boolean', + required: false, + description: `Whether the user should be server-deafened on join.`, + }, + { + name: 'mute', + type: 'boolean', + required: false, + description: `Whether the user should be server-muted on join.`, + }, + { + name: 'nick', + type: 'string', + required: false, + description: `Nickname to assign to the user in the guild.`, + }, + { + name: 'roles', + type: 'array', + required: false, + description: `Array of role IDs to assign to the user on join.`, + }, + ], + }, + { + name: 'discordbot_add_guild_member_role', + description: `Add a role to a guild member. Requires MANAGE_ROLES permission. Returns 204 No Content on success.`, + params: [ + { name: 'guild_id', type: 'string', required: true, description: `The ID of the guild.` }, + { + name: 'role_id', + type: 'string', + required: true, + description: `The ID of the role to add to the member.`, + }, + { + name: 'user_id', + type: 'string', + required: true, + description: `The ID of the guild member to add the role to.`, + }, + ], + }, + { + name: 'discordbot_add_lobby_member', + description: `Add the specified user to a Discord lobby. If the user is already a member, updates their metadata and flags instead. Returns the lobby member object.`, + params: [ + { + name: 'lobby_id', + type: 'string', + required: true, + description: `The ID of the lobby to add the member to.`, + }, + { + name: 'user_id', + type: 'string', + required: true, + description: `The ID of the user to add to the lobby.`, + }, + { + name: 'flags', + type: 'integer', + required: false, + description: `Lobby member flags combined as a bitfield (1 = CanLinkLobby).`, + }, + { + name: 'metadata', + type: 'object', + required: false, + description: `Optional dictionary of string key/value pairs for the member. Max total length 1000.`, + }, + ], + }, + { + name: 'discordbot_add_thread_member', + description: `Add another user to a thread. Requires the thread to not be archived. Returns 204 No Content on success.`, + params: [ + { + name: 'channel_id', + type: 'string', + required: true, + description: `The ID of the thread channel.`, + }, + { + name: 'user_id', + type: 'string', + required: true, + description: `The ID of the user to add to the thread.`, + }, + ], + }, + { + name: 'discordbot_begin_guild_prune', + description: `Begin a prune operation to kick inactive members. Requires KICK_MEMBERS permission. Returns a pruned object with the count of kicked members (or null if compute_prune_count is false).`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to prune members from.`, + }, + { + name: 'compute_prune_count', + type: 'boolean', + required: false, + description: `Whether to compute and return the number of pruned members (default true; set false for large guilds).`, + }, + { + name: 'days', + type: 'integer', + required: false, + description: `Number of days of inactivity to prune for (1-30, default 7).`, + }, + { + name: 'include_roles', + type: 'array', + required: false, + description: `Array of role IDs to include in the prune operation.`, + }, + { + name: 'reason', + type: 'string', + required: false, + description: `Reason for the prune (for audit log).`, + }, + ], + }, + { + name: 'discordbot_bulk_delete_messages', + description: `Delete multiple messages in a Discord channel in a single request (2-100 messages). Messages older than 2 weeks cannot be deleted this way. Requires MANAGE_MESSAGES permission.`, + params: [ + { + name: 'channel_id', + type: 'string', + required: true, + description: `The ID of the channel to delete messages from.`, + }, + { + name: 'messages', + type: 'array', + required: true, + description: `Array of message IDs to delete (2-100 messages). Messages older than 2 weeks cannot be deleted.`, + }, + ], + }, + { + name: 'discordbot_bulk_guild_ban', + description: `Ban up to 200 users from a guild and optionally delete their recent messages. Requires both BAN_MEMBERS and MANAGE_GUILD permissions. Returns object with banned_users and failed_users arrays.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to ban members from.`, + }, + { + name: 'user_ids', + type: 'array', + required: true, + description: `Array of user IDs to ban (up to 200).`, + }, + { + name: 'delete_message_seconds', + type: 'integer', + required: false, + description: `Number of seconds of messages to delete from banned users (0-604800).`, + }, + ], + }, + { + name: 'discordbot_bulk_overwrite_global_application_commands', + description: `Bulk overwrite all global application commands. Takes a full list of commands to replace existing ones. Any commands not included will be deleted. Returns an array of application command objects.`, + params: [ + { + name: 'application_id', + type: 'string', + required: true, + description: `The ID of the application.`, + }, + { + name: 'commands', + type: 'array', + required: true, + description: `Array of application command objects to set as global commands.`, + }, + ], + }, + { + name: 'discordbot_bulk_overwrite_guild_application_commands', + description: `Bulk overwrite all application commands registered in a guild. Commands not included will be deleted. Returns an array of application command objects.`, + params: [ + { + name: 'application_id', + type: 'string', + required: true, + description: `The ID of the application.`, + }, + { + name: 'commands', + type: 'array', + required: true, + description: `Array of application command objects to set as guild commands.`, + }, + { name: 'guild_id', type: 'string', required: true, description: `The ID of the guild.` }, + ], + }, + { + name: 'discordbot_bulk_update_lobby_members', + description: `Add, update, or remove up to 25 members from a Discord lobby in a single request. Members with remove_member false (the default) are upserted; members with remove_member true are removed. Users unknown to Discord return a 404 error. Users that fail permission checks, or that already reached the maximum lobbies per application, are silently dropped from the upsert set. Returns an array of lobby member objects for the upserted members; removed members are not included.`, + params: [ + { + name: 'lobby_id', + type: 'string', + required: true, + description: `The ID of the lobby to bulk update members for.`, + }, + { + name: 'members', + type: 'array', + required: true, + description: `Array of 1 to 25 member objects to add, update, or remove from the lobby.`, + }, + ], + }, + { + name: 'discordbot_consume_entitlement', + description: `For one-time purchase consumable SKUs, mark a given entitlement for the user as consumed. The entitlement will have consumed: true when listed afterward. This action cannot be undone. Returns 204 No Content on success.`, + params: [ + { + name: 'application_id', + type: 'string', + required: true, + description: `The ID of the application that owns the entitlement.`, + }, + { + name: 'entitlement_id', + type: 'string', + required: true, + description: `The ID of the entitlement to mark as consumed.`, + }, + ], + }, + { + name: 'discordbot_create_application_emoji', + description: `Create a new emoji owned by a Discord application (app emoji). Returns the new emoji object.`, + params: [ + { + name: 'application_id', + type: 'string', + required: true, + description: `The ID of the application to create the emoji for.`, + }, + { + name: 'image', + type: 'string', + required: true, + description: `Base64 encoded image data URI for the 128x128 emoji (PNG, JPG, GIF supported).`, + }, + { + name: 'name', + type: 'string', + required: true, + description: `Name of the emoji (2-32 characters, alphanumeric and underscores).`, + }, + ], + }, + { + name: 'discordbot_create_auto_moderation_rule', + description: `Create a new Auto Moderation rule for a guild. Requires the MANAGE_GUILD permission. Fires an Auto Moderation Rule Create Gateway event. Returns the new auto moderation rule object on success.`, + params: [ + { + name: 'actions', + type: 'array', + required: true, + description: `The actions which will execute when the rule is triggered. Each action is an object with a 'type' (1=BLOCK_MESSAGE, 2=SEND_ALERT_MESSAGE, 3=TIMEOUT, 4=BLOCK_MEMBER_INTERACTION) and optional 'metadata'.`, + }, + { + name: 'event_type', + type: 'integer', + required: true, + description: `The rule event type: 1=MESSAGE_SEND (when a member sends or edits a message), 2=MEMBER_UPDATE (when a member edits their profile).`, + }, + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to create the Auto Moderation rule in.`, + }, + { name: 'name', type: 'string', required: true, description: `The rule name.` }, + { + name: 'trigger_type', + type: 'integer', + required: true, + description: `The rule trigger type: 1=KEYWORD, 3=SPAM, 4=KEYWORD_PRESET, 5=MENTION_SPAM, 6=MEMBER_PROFILE.`, + }, + { + name: 'enabled', + type: 'boolean', + required: false, + description: `Whether the rule is enabled. False by default.`, + }, + { + name: 'exempt_channels', + type: 'array', + required: false, + description: `Channel IDs that should not be affected by the rule (maximum of 50).`, + }, + { + name: 'exempt_roles', + type: 'array', + required: false, + description: `Role IDs that should not be affected by the rule (maximum of 20).`, + }, + { + name: 'reason', + type: 'string', + required: false, + description: `Reason for creating the rule, shown in the guild's audit log.`, + }, + { + name: 'trigger_metadata', + type: 'object', + required: false, + description: `Additional data used to determine whether the rule triggers, relevant fields depend on trigger_type (e.g. keyword_filter, regex_patterns, presets, allow_list, mention_total_limit, mention_raid_protection_enabled). Can be omitted for trigger types that need no metadata.`, + }, + ], + }, + { + name: 'discordbot_create_channel_invite', + description: `Create a new invite for a Discord channel. Requires CREATE_INSTANT_INVITE permission. Returns an invite object.`, + params: [ + { + name: 'channel_id', + type: 'string', + required: true, + description: `The ID of the channel to create an invite for.`, + }, + { + name: 'max_age', + type: 'integer', + required: false, + description: `Duration in seconds before the invite expires (0 for never). Default is 86400 (24 hours). Max is 604800 (7 days).`, + }, + { + name: 'max_uses', + type: 'integer', + required: false, + description: `Maximum number of times the invite can be used (0 for unlimited). Max is 100.`, + }, + { + name: 'role_ids', + type: 'array', + required: false, + description: `The role ID(s) for roles in the guild given to the users that accept this invite. Requires the MANAGE_ROLES permission and cannot assign roles with higher permissions than the sender.`, + }, + { + name: 'target_application_id', + type: 'string', + required: false, + description: `Application ID for embedded activity target types.`, + }, + { + name: 'target_type', + type: 'integer', + required: false, + description: `The type of invite target (1 for STREAM, 2 for EMBEDDED_APPLICATION).`, + }, + { + name: 'target_user_id', + type: 'string', + required: false, + description: `The user ID whose stream to display for STREAM target type.`, + }, + { + name: 'temporary', + type: 'boolean', + required: false, + description: `Whether this invite grants temporary membership. Default is false.`, + }, + { + name: 'unique', + type: 'boolean', + required: false, + description: `If true, tries to create a unique invite. Default is false.`, + }, + ], + }, + { + name: 'discordbot_create_dm', + description: `Create a new DM channel with a user. Returns a DM channel object. If a DM channel already exists with the user, it is returned.`, + params: [ + { + name: 'recipient_id', + type: 'string', + required: true, + description: `The ID of the user to open a DM channel with.`, + }, + ], + }, + { + name: 'discordbot_create_global_application_command', + description: `Create a new global application command. If a command with the same name already exists, it will be overwritten. Returns the created command object.`, + params: [ + { + name: 'application_id', + type: 'string', + required: true, + description: `The ID of the application.`, + }, + { + name: 'name', + type: 'string', + required: true, + description: `Command name (1-32 characters).`, + }, + { + name: 'type', + type: 'integer', + required: true, + description: `Command type: 1=CHAT_INPUT (slash command), 2=USER, 3=MESSAGE.`, + }, + { + name: 'contexts', + type: 'array', + required: false, + description: `Installation context(s) where the command is available. 0=GUILD, 1=BOT_DM, 2=PRIVATE_CHANNEL.`, + }, + { + name: 'default_member_permissions', + type: 'string', + required: false, + description: `Set of permissions represented as a bit set string that a user must have to use the command.`, + }, + { + name: 'default_permission', + type: 'boolean', + required: false, + description: `Whether the command is enabled by default (deprecated, use default_member_permissions).`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `Command description (1-100 characters) for CHAT_INPUT commands.`, + }, + { + name: 'description_localizations', + type: 'object', + required: false, + description: `Localization dictionary for description field.`, + }, + { + name: 'dm_permission', + type: 'boolean', + required: false, + description: `Whether the command is available in DMs (deprecated, use contexts).`, + }, + { + name: 'integration_types', + type: 'array', + required: false, + description: `Installation context(s): 0=GUILD_INSTALL, 1=USER_INSTALL.`, + }, + { + name: 'name_localizations', + type: 'object', + required: false, + description: `Localization dictionary for name field.`, + }, + { + name: 'nsfw', + type: 'boolean', + required: false, + description: `Whether the command is age-restricted.`, + }, + { + name: 'options', + type: 'array', + required: false, + description: `Array of command option objects (for CHAT_INPUT type, up to 25 options).`, + }, + ], + }, + { + name: 'discordbot_create_group_dm', + description: `Create a new group DM channel with multiple users using their OAuth2 access tokens (granted the gdm.join scope). Returns a DM channel object. This endpoint was intended to be used with the now-deprecated GameBridge SDK and is limited to 10 active group DMs. Fires a Channel Create Gateway event.`, + params: [ + { + name: 'access_tokens', + type: 'array', + required: true, + description: `Access tokens of users that have granted your app the gdm.join scope.`, + }, + { + name: 'nicks', + type: 'object', + required: false, + description: `A dictionary of user ids to their respective nicknames.`, + }, + ], + }, + { + name: 'discordbot_create_guild_application_command', + description: `Create a new application command for a specific guild. Guild commands are only available in the guild they are created in. Returns the created command object.`, + params: [ + { + name: 'application_id', + type: 'string', + required: true, + description: `The ID of the application.`, + }, + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to create the command in.`, + }, + { + name: 'name', + type: 'string', + required: true, + description: `Command name (1-32 characters).`, + }, + { + name: 'type', + type: 'integer', + required: true, + description: `Command type: 1=CHAT_INPUT, 2=USER, 3=MESSAGE.`, + }, + { + name: 'default_member_permissions', + type: 'string', + required: false, + description: `Permissions required to use the command as a bitfield string.`, + }, + { + name: 'default_permission', + type: 'boolean', + required: false, + description: `Whether the command is enabled by default (deprecated).`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `Command description (1-100 characters) for CHAT_INPUT commands.`, + }, + { + name: 'description_localizations', + type: 'object', + required: false, + description: `Localization dictionary for description field.`, + }, + { + name: 'name_localizations', + type: 'object', + required: false, + description: `Localization dictionary for name field.`, + }, + { + name: 'nsfw', + type: 'boolean', + required: false, + description: `Whether the command is age-restricted.`, + }, + { + name: 'options', + type: 'array', + required: false, + description: `Array of command option objects (up to 25 options).`, + }, + ], + }, + { + name: 'discordbot_create_guild_ban', + description: `Ban a user from a Discord guild. Requires BAN_MEMBERS permission. Optionally delete recent messages from the banned user.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to ban the user from.`, + }, + { + name: 'user_id', + type: 'string', + required: true, + description: `The ID of the user to ban.`, + }, + { + name: 'delete_message_seconds', + type: 'integer', + required: false, + description: `Number of seconds to delete messages for (0-604800, i.e., 0 to 7 days).`, + }, + ], + }, + { + name: 'discordbot_create_guild_channel', + description: `Create a new channel in a guild. Requires MANAGE_CHANNELS permission. Returns the new channel object. Each permission_overwrites entry may specify 'allow_names'/'deny_names' (arrays of named permission flags) instead of raw 'allow'/'deny' integers — the correct bitfield is computed automatically.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to create the channel in.`, + }, + { + name: 'name', + type: 'string', + required: true, + description: `Name of the channel (1-100 characters).`, + }, + { + name: 'available_tags', + type: 'array', + required: false, + description: `Array of tag objects for forum channels.`, + }, + { + name: 'bitrate', + type: 'integer', + required: false, + description: `Bitrate in bits for voice channels.`, + }, + { + name: 'default_auto_archive_duration', + type: 'integer', + required: false, + description: `Default thread auto-archive duration in minutes: 60, 1440, 4320, or 10080.`, + }, + { + name: 'default_forum_layout', + type: 'integer', + required: false, + description: `Default forum layout. 0=NOT_SET, 1=LIST_VIEW, 2=GALLERY_VIEW.`, + }, + { + name: 'default_reaction_emoji', + type: 'object', + required: false, + description: `Default reaction emoji for forum posts.`, + }, + { + name: 'default_sort_order', + type: 'integer', + required: false, + description: `Default sort order for forum posts. 0=LATEST_ACTIVITY, 1=CREATION_DATE.`, + }, + { + name: 'default_thread_rate_limit_per_user', + type: 'integer', + required: false, + description: `Default slowmode for new threads in forum/media channels.`, + }, + { + name: 'flags', + type: 'integer', + required: false, + description: `Channel flags combined as a bitfield. Currently only supported for Text, Voice, Announcement, Forum, and Media channels.`, + }, + { + name: 'nsfw', + type: 'boolean', + required: false, + description: `Whether the channel is NSFW.`, + }, + { + name: 'parent_id', + type: 'string', + required: false, + description: `ID of the parent category channel.`, + }, + { + name: 'permission_overwrites', + type: 'array', + required: false, + description: `Array of permission overwrite objects.`, + }, + { + name: 'position', + type: 'integer', + required: false, + description: `Sorting position of the channel.`, + }, + { + name: 'rate_limit_per_user', + type: 'integer', + required: false, + description: `Slowmode rate limit in seconds (0-21600).`, + }, + { + name: 'rtc_region', + type: 'string', + required: false, + description: `Voice region for voice/stage channels.`, + }, + { + name: 'topic', + type: 'string', + required: false, + description: `Channel topic (0-1024 characters, or 0-4096 for forums).`, + }, + { + name: 'type', + type: 'integer', + required: false, + description: `Channel type: 0=text, 2=voice, 4=category, 5=announcement, 13=stage, 15=forum, 16=media.`, + }, + { + name: 'user_limit', + type: 'integer', + required: false, + description: `Maximum number of users in a voice channel (0=unlimited, 1-99).`, + }, + { + name: 'video_quality_mode', + type: 'integer', + required: false, + description: `Video quality mode for voice channels. 1=AUTO, 2=FULL.`, + }, + ], + }, + { + name: 'discordbot_create_guild_emoji', + description: `Create a new emoji for a guild. Requires CREATE_GUILD_EXPRESSIONS permission. Returns the new emoji object.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to create the emoji in.`, + }, + { + name: 'image', + type: 'string', + required: true, + description: `Base64 encoded image data URI for the emoji (PNG, JPG, GIF supported).`, + }, + { + name: 'name', + type: 'string', + required: true, + description: `Name of the emoji (2-32 characters, alphanumeric and underscores).`, + }, + { + name: 'roles', + type: 'array', + required: false, + description: `Array of role IDs allowed to use the emoji (empty array means everyone can).`, + }, + ], + }, + { + name: 'discordbot_create_guild_role', + description: `Create a new role for a guild. Requires MANAGE_ROLES permission. Returns the new role object. Full permission flag reference (name=decimal value, OR multiple together): CREATE_INSTANT_INVITE=1, KICK_MEMBERS=2, BAN_MEMBERS=4, ADMINISTRATOR=8, MANAGE_CHANNELS=16, MANAGE_GUILD=32, ADD_REACTIONS=64, VIEW_AUDIT_LOG=128, PRIORITY_SPEAKER=256, STREAM=512, VIEW_CHANNEL=1024, SEND_MESSAGES=2048, SEND_TTS_MESSAGES=4096, MANAGE_MESSAGES=8192, EMBED_LINKS=16384, ATTACH_FILES=32768, READ_MESSAGE_HISTORY=65536, MENTION_EVERYONE=131072, USE_EXTERNAL_EMOJIS=262144, VIEW_GUILD_INSIGHTS=524288, CONNECT=1048576, SPEAK=2097152, MUTE_MEMBERS=4194304, DEAFEN_MEMBERS=8388608, MOVE_MEMBERS=16777216, USE_VAD=33554432, CHANGE_NICKNAME=67108864, MANAGE_NICKNAMES=134217728, MANAGE_ROLES=268435456, MANAGE_WEBHOOKS=536870912, MANAGE_GUILD_EXPRESSIONS=1073741824, USE_APPLICATION_COMMANDS=2147483648, REQUEST_TO_SPEAK=4294967296, MANAGE_EVENTS=8589934592, MANAGE_THREADS=17179869184, CREATE_PUBLIC_THREADS=34359738368, CREATE_PRIVATE_THREADS=68719476736, USE_EXTERNAL_STICKERS=137438953472, SEND_MESSAGES_IN_THREADS=274877906944, USE_EMBEDDED_ACTIVITIES=549755813888, MODERATE_MEMBERS=1099511627776, VIEW_CREATOR_MONETIZATION_ANALYTICS=2199023255552, USE_SOUNDBOARD=4398046511104, CREATE_GUILD_EXPRESSIONS=8796093022208, CREATE_EVENTS=17592186044416, USE_EXTERNAL_SOUNDS=35184372088832, SEND_VOICE_MESSAGES=70368744177664, SET_VOICE_CHANNEL_STATUS=281474976710656, SEND_POLLS=562949953421312, USE_EXTERNAL_APPS=1125899906842624, PIN_MESSAGES=2251799813685248, BYPASS_SLOWMODE=4503599627370496. Or use a calculator like discordapi.com/permissions.htm. Optionally provide 'permissions_names' (array of named permission flags, e.g. ["SEND_MESSAGES"]) instead of a raw 'permissions' integer — the correct bitfield is computed automatically.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to create the role in.`, + }, + { + name: 'color', + type: 'integer', + required: false, + description: `Deprecated. RGB color value of the role as an integer. Still returned by the API, but using 'colors' is recommended when making requests.`, + }, + { + name: 'colors', + type: 'object', + required: false, + description: `The role's colors object (recommended replacement for the deprecated 'color' field). Contains primary_color, and optionally secondary_color and tertiary_color for gradient/holographic roles.`, + }, + { + name: 'hoist', + type: 'boolean', + required: false, + description: `Whether the role should be displayed separately in the member list.`, + }, + { + name: 'icon', + type: 'string', + required: false, + description: `Base64 encoded role icon image (requires ROLE_ICONS guild feature).`, + }, + { + name: 'mentionable', + type: 'boolean', + required: false, + description: `Whether the role should be mentionable by everyone.`, + }, + { + name: 'name', + type: 'string', + required: false, + description: `Name of the role (1-100 characters, default 'new role').`, + }, + { + name: 'permissions', + type: 'string', + required: false, + description: `Bitwise permission value for the role as a string.`, + }, + { + name: 'permissions_names', + type: 'array', + required: false, + description: `Named permission flags to OR together, as a more reliable alternative to specifying 'permissions' as a raw bitwise integer string — no manual bit math required. If both 'permissions_names' and 'permissions' are given, 'permissions_names' takes precedence.`, + }, + { + name: 'unicode_emoji', + type: 'string', + required: false, + description: `Role's unicode emoji as a standard emoji (requires ROLE_ICONS guild feature).`, + }, + ], + }, + { + name: 'discordbot_create_guild_scheduled_event', + description: `Create a new scheduled event in a Discord guild. Entity type determines the event location: 1=STAGE_INSTANCE, 2=VOICE (requires channel_id), 3=EXTERNAL (requires entity_metadata with location and scheduled_end_time).`, + params: [ + { + name: 'entity_type', + type: 'integer', + required: true, + description: `The type of the scheduled event entity: 1=STAGE_INSTANCE, 2=VOICE, 3=EXTERNAL.`, + }, + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to create the scheduled event in.`, + }, + { + name: 'name', + type: 'string', + required: true, + description: `The name of the scheduled event (1-100 characters).`, + }, + { + name: 'privacy_level', + type: 'integer', + required: true, + description: `Privacy level for the event. Must be 2 (GUILD_ONLY).`, + }, + { + name: 'scheduled_start_time', + type: 'string', + required: true, + description: `ISO8601 timestamp for when the event starts.`, + }, + { + name: 'channel_id', + type: 'string', + required: false, + description: `The channel ID for STAGE_INSTANCE or VOICE entity types. Not required for EXTERNAL events.`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `Description of the scheduled event (up to 1000 characters).`, + }, + { + name: 'entity_metadata', + type: 'object', + required: false, + description: `Additional metadata for the event. Required for EXTERNAL events: provide {"location": "venue name"}.`, + }, + { + name: 'image', + type: 'string', + required: false, + description: `Base64 encoded cover image for the event (data URI format).`, + }, + { + name: 'recurrence_rule', + type: 'object', + required: false, + description: `Recurrence rule object for repeating events.`, + }, + { + name: 'scheduled_end_time', + type: 'string', + required: false, + description: `ISO8601 timestamp for when the event ends. Required for EXTERNAL events.`, + }, + ], + }, + { + name: 'discordbot_create_guild_soundboard_sound', + description: `Create a new soundboard sound for the guild. Requires the CREATE_GUILD_EXPRESSIONS permission. Sounds have a max file size of 512kb and a max duration of 5.2 seconds. Fires a Guild Soundboard Sound Create Gateway event. Returns the new soundboard sound object on success.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to create the soundboard sound in.`, + }, + { + name: 'name', + type: 'string', + required: true, + description: `Name of the soundboard sound (2-32 characters).`, + }, + { + name: 'sound', + type: 'string', + required: true, + description: `The mp3 or ogg sound data, base64 encoded as a data URI, similar to image data.`, + }, + { + name: 'emoji_id', + type: 'string', + required: false, + description: `The ID of the custom emoji for the soundboard sound.`, + }, + { + name: 'emoji_name', + type: 'string', + required: false, + description: `The unicode character of a standard emoji for the soundboard sound.`, + }, + { + name: 'reason', + type: 'string', + required: false, + description: `Reason for creating the sound, shown in the guild's audit log.`, + }, + { + name: 'volume', + type: 'number', + required: false, + description: `The volume of the soundboard sound, from 0 to 1. Defaults to 1.`, + }, + ], + }, + { + name: 'discordbot_create_guild_template', + description: `Create a template from a guild's current state. Requires the MANAGE_GUILD permission. Returns the created guild template object on success.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to create the template from.`, + }, + { + name: 'name', + type: 'string', + required: true, + description: `Name of the template (1-100 characters).`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `Description for the template (0-120 characters).`, + }, + ], + }, + { + name: 'discordbot_create_interaction_response', + description: `Respond to an interaction from Discord. Must be called within 3 seconds of receiving the interaction. Type determines the response kind: 1=PONG, 4=CHANNEL_MESSAGE_WITH_SOURCE, 5=DEFERRED_CHANNEL_MESSAGE_WITH_SOURCE, 6=DEFERRED_UPDATE_MESSAGE, 7=UPDATE_MESSAGE, 8=APPLICATION_COMMAND_AUTOCOMPLETE_RESULT, 9=MODAL.`, + params: [ + { + name: 'data', + type: 'object', + required: true, + description: `Response data object. Content depends on type (e.g., message data for type 4, modal data for type 9).`, + }, + { + name: 'interaction_id', + type: 'string', + required: true, + description: `The ID of the interaction to respond to.`, + }, + { + name: 'interaction_token', + type: 'string', + required: true, + description: `The token of the interaction.`, + }, + { + name: 'type', + type: 'integer', + required: true, + description: `Interaction callback type: 1=PONG, 4=message, 5=deferred message, 6=deferred update, 7=update message, 8=autocomplete, 9=modal.`, + }, + ], + }, + { + name: 'discordbot_create_lobby', + description: `Create a new Discord lobby for matchmaking, optionally adding members to it. Discord Social SDK clients cannot join or leave a lobby created via this API. Returns a lobby object.`, + params: [ + { + name: 'idle_timeout_seconds', + type: 'integer', + required: false, + description: `Seconds to wait before shutting down the lobby after it becomes idle. Between 5 and 604800 (7 days).`, + }, + { + name: 'members', + type: 'array', + required: false, + description: `Array of up to 25 lobby member objects to add to the lobby on creation. Each requires a user id and may include metadata and flags.`, + }, + { + name: 'metadata', + type: 'object', + required: false, + description: `Optional dictionary of string key/value pairs to attach to the lobby. Max total length 1000.`, + }, + ], + }, + { + name: 'discordbot_create_lobby_channel_invite_for_self', + description: `Create a single-use guild invite to a lobby's linked channel, targeted at the calling user. The lobby must have a linked channel and the caller must be a member of the lobby. The invite expires after one hour. Returns a lobby invite object.`, + params: [ + { + name: 'lobby_id', + type: 'string', + required: true, + description: `The ID of the lobby to create a channel invite for.`, + }, + ], + }, + { + name: 'discordbot_create_lobby_channel_invite_for_user', + description: `Create a single-use guild invite to a lobby's linked channel on behalf of an application, targeted at the specified user. The lobby must have a linked channel. The invite expires after one hour. Uses a Bot token for authorization. Returns a lobby invite object.`, + params: [ + { + name: 'lobby_id', + type: 'string', + required: true, + description: `The ID of the lobby to create a channel invite for.`, + }, + { + name: 'user_id', + type: 'string', + required: true, + description: `The ID of the user to target with the invite.`, + }, + ], + }, + { + name: 'discordbot_create_message', + description: `Send a message to a Discord channel. At least one of content, embeds, sticker_ids, or components must be provided. Supports rich embeds, message references for replies, and components.`, + params: [ + { + name: 'channel_id', + type: 'string', + required: true, + description: `The ID of the channel to send the message to.`, + }, + { + name: 'allowed_mentions', + type: 'object', + required: false, + description: `Controls which mentions are allowed in the message. Example: {"parse": ["users", "roles"]}`, + }, + { + name: 'components', + type: 'array', + required: false, + description: `Array of message component objects (buttons, select menus, etc.).`, + }, + { + name: 'content', + type: 'string', + required: false, + description: `The text content of the message (up to 2000 characters).`, + }, + { + name: 'embeds', + type: 'array', + required: false, + description: `Array of embed objects to attach to the message (up to 10 embeds).`, + }, + { + name: 'enforce_nonce', + type: 'boolean', + required: false, + description: `If true and nonce is present, the nonce is checked for uniqueness in the past few minutes. If another message was created by the same author with the same nonce, that message is returned and no new message is created.`, + }, + { + name: 'flags', + type: 'integer', + required: false, + description: `Message flags. Use 64 for SUPPRESS_EMBEDS or 4096 for SUPPRESS_NOTIFICATIONS.`, + }, + { + name: 'message_reference', + type: 'object', + required: false, + description: `Message reference object for replying to a message. Example: {"message_id": "123"}`, + }, + { + name: 'nonce', + type: 'string', + required: false, + description: `A nonce value (string or integer) used for message deduplication.`, + }, + { + name: 'poll', + type: 'object', + required: false, + description: `A poll request object to attach to the message.`, + }, + { + name: 'shared_client_theme', + type: 'object', + required: false, + description: `The custom client-side theme to share via the message.`, + }, + { + name: 'sticker_ids', + type: 'array', + required: false, + description: `Array of sticker IDs to attach to the message (up to 3 stickers).`, + }, + { + name: 'tts', + type: 'boolean', + required: false, + description: `Whether the message should be sent as text-to-speech.`, + }, + ], + }, + { + name: 'discordbot_create_or_join_lobby', + description: `Create a new lobby identified by a secret, or join the calling user to the existing lobby with that secret if one already exists. Updates lobby metadata and the calling member's metadata on join. Returns a lobby object.`, + params: [ + { + name: 'secret', + type: 'string', + required: true, + description: `Secret used to identify the lobby. If a lobby for this application already exists with this secret, the caller joins it; otherwise a new lobby is created. Max 250 characters.`, + }, + { + name: 'idle_timeout_seconds', + type: 'integer', + required: false, + description: `Seconds to wait before shutting down the lobby after it becomes idle. Between 5 and 604800 (7 days).`, + }, + { + name: 'lobby_metadata', + type: 'object', + required: false, + description: `Optional dictionary of string key/value pairs to set on the lobby. Max total length 1000. Overwrites any existing lobby metadata.`, + }, + { + name: 'member_metadata', + type: 'object', + required: false, + description: `Optional dictionary of string key/value pairs to set on the calling user's lobby member. Max total length 1000.`, + }, + ], + }, + { + name: 'discordbot_create_reaction', + description: `Add a reaction to a message in a Discord channel. The emoji parameter should be URL-encoded (e.g., a Unicode emoji like %F0%9F%94%A5 for 🔥, or name:id for custom emojis).`, + params: [ + { + name: 'channel_id', + type: 'string', + required: true, + description: `The ID of the channel containing the message.`, + }, + { + name: 'emoji', + type: 'string', + required: true, + description: `The emoji to react with. Use URL-encoded Unicode for standard emojis (e.g., %F0%9F%94%A5) or name:id format for custom emojis.`, + }, + { + name: 'message_id', + type: 'string', + required: true, + description: `The ID of the message to react to.`, + }, + ], + }, + { + name: 'discordbot_create_stage_instance', + description: `Create a new Stage instance associated with a Stage channel, making the channel go live. Requires the user to be a moderator of the Stage channel (MANAGE_CHANNELS, MUTE_MEMBERS, and MOVE_MEMBERS permissions). Fires a Stage Instance Create Gateway event. Returns the new Stage instance object.`, + params: [ + { + name: 'channel_id', + type: 'string', + required: true, + description: `The ID of the Stage channel to create the Stage instance for.`, + }, + { + name: 'topic', + type: 'string', + required: true, + description: `The topic of the Stage instance (1-120 characters).`, + }, + { + name: 'guild_scheduled_event_id', + type: 'string', + required: false, + description: `The ID of the guild scheduled event to associate with this Stage instance.`, + }, + { + name: 'privacy_level', + type: 'integer', + required: false, + description: `The privacy level of the Stage instance: 1=PUBLIC (deprecated), 2=GUILD_ONLY. Defaults to GUILD_ONLY (2) if omitted.`, + }, + { + name: 'reason', + type: 'string', + required: false, + description: `Reason for creating the Stage instance, shown in the guild's audit log.`, + }, + { + name: 'send_start_notification', + type: 'boolean', + required: false, + description: `Whether to notify @everyone that a Stage instance has started. The stage moderator must have the MENTION_EVERYONE permission for the notification to be sent.`, + }, + ], + }, + { + name: 'discordbot_create_test_entitlement', + description: `Create a test entitlement to a given SKU for a given guild or user. Discord will act as though that user or guild has entitlement to your premium offering. After creating a test entitlement, reload your Discord client to see the server or user gain premium access. Returns a partial entitlement object — it does not contain subscription_id, starts_at, or ends_at, since it's valid in perpetuity.`, + params: [ + { + name: 'application_id', + type: 'string', + required: true, + description: `The ID of the application to create the test entitlement for.`, + }, + { + name: 'owner_id', + type: 'string', + required: true, + description: `The ID of the guild or user to grant the entitlement to.`, + }, + { + name: 'owner_type', + type: 'integer', + required: true, + description: `The type of owner to grant the entitlement to: 1 for a guild subscription, 2 for a user subscription.`, + }, + { + name: 'sku_id', + type: 'string', + required: true, + description: `The ID of the SKU to grant the entitlement to.`, + }, + ], + }, + { + name: 'discordbot_create_webhook', + description: `Create a new webhook for a Discord channel. Requires MANAGE_WEBHOOKS permission. Returns the newly created webhook object with its token.`, + params: [ + { + name: 'channel_id', + type: 'string', + required: true, + description: `The ID of the channel to create the webhook in.`, + }, + { + name: 'name', + type: 'string', + required: true, + description: `The name of the webhook (1-80 characters). Cannot be 'clyde'.`, + }, + { + name: 'avatar', + type: 'string', + required: false, + description: `Base64 encoded avatar image for the webhook (data URI format, e.g., data:image/png;base64,...).`, + }, + ], + }, + { + name: 'discordbot_crosspost_message', + description: `Crosspost a message in an announcement channel to all following channels. Requires SEND_MESSAGES permission if the current user wrote the message, or MANAGE_MESSAGES if they did not.`, + params: [ + { + name: 'channel_id', + type: 'string', + required: true, + description: `The ID of the announcement channel containing the message.`, + }, + { + name: 'message_id', + type: 'string', + required: true, + description: `The ID of the message to crosspost.`, + }, + ], + }, + { + name: 'discordbot_delete_all_reactions', + description: `Delete all reactions on a message. Requires MANAGE_MESSAGES permission. Returns 204 No Content on success.`, + params: [ + { + name: 'channel_id', + type: 'string', + required: true, + description: `The ID of the channel containing the message.`, + }, + { + name: 'message_id', + type: 'string', + required: true, + description: `The ID of the message to clear all reactions from.`, + }, + ], + }, + { + name: 'discordbot_delete_all_reactions_for_emoji', + description: `Delete all reactions for a specific emoji on a message. Requires MANAGE_MESSAGES permission. Use URL-encoded emoji format. Returns 204 No Content on success.`, + params: [ + { + name: 'channel_id', + type: 'string', + required: true, + description: `The ID of the channel containing the message.`, + }, + { + name: 'emoji', + type: 'string', + required: true, + description: `The emoji whose reactions to remove. For custom emoji use name:id format. For unicode emoji use the URL-encoded character.`, + }, + { + name: 'message_id', + type: 'string', + required: true, + description: `The ID of the message to remove emoji reactions from.`, + }, + ], + }, + { + name: 'discordbot_delete_application_emoji', + description: `Delete an emoji owned by a Discord application. Returns 204 No Content on success.`, + params: [ + { + name: 'application_id', + type: 'string', + required: true, + description: `The ID of the application that owns the emoji.`, + }, + { + name: 'emoji_id', + type: 'string', + required: true, + description: `The ID of the emoji to delete.`, + }, + ], + }, + { + name: 'discordbot_delete_auto_moderation_rule', + description: `Delete an Auto Moderation rule for a guild. Requires the MANAGE_GUILD permission. Fires an Auto Moderation Rule Delete Gateway event. Returns 204 No Content on success.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild the rule belongs to.`, + }, + { + name: 'rule_id', + type: 'string', + required: true, + description: `The ID of the Auto Moderation rule to delete.`, + }, + { + name: 'reason', + type: 'string', + required: false, + description: `Reason for deleting the rule, shown in the guild's audit log.`, + }, + ], + }, + { + name: 'discordbot_delete_channel', + description: `Delete a channel or close a private message. For guild channels, requires MANAGE_CHANNELS permission. Deleting a category does not delete its child channels. Returns the deleted channel object.`, + params: [ + { + name: 'channel_id', + type: 'string', + required: true, + description: `The ID of the channel to delete.`, + }, + ], + }, + { + name: 'discordbot_delete_channel_invite', + description: `Delete an invite by its code. Requires MANAGE_CHANNELS permission for guild channel invites or MANAGE_GUILD. Returns the deleted invite object.`, + params: [ + { + name: 'invite_code', + type: 'string', + required: true, + description: `The invite code to delete.`, + }, + { + name: 'reason', + type: 'string', + required: false, + description: `Reason for deleting the invite, shown in the guild's audit log.`, + }, + ], + }, + { + name: 'discordbot_delete_channel_permission', + description: `Delete a channel permission overwrite for a user or role in a channel. Requires MANAGE_ROLES permission. Returns 204 No Content on success.`, + params: [ + { + name: 'channel_id', + type: 'string', + required: true, + description: `The ID of the channel to delete permissions from.`, + }, + { + name: 'overwrite_id', + type: 'string', + required: true, + description: `The ID of the role or user permission overwrite to delete.`, + }, + ], + }, + { + name: 'discordbot_delete_global_application_command', + description: `Delete a global application command. Returns 204 No Content on success.`, + params: [ + { + name: 'application_id', + type: 'string', + required: true, + description: `The ID of the application.`, + }, + { + name: 'command_id', + type: 'string', + required: true, + description: `The ID of the command to delete.`, + }, + ], + }, + { + name: 'discordbot_delete_guild_application_command', + description: `Delete a guild application command. Returns 204 No Content on success.`, + params: [ + { + name: 'application_id', + type: 'string', + required: true, + description: `The ID of the application.`, + }, + { + name: 'command_id', + type: 'string', + required: true, + description: `The ID of the command to delete.`, + }, + { name: 'guild_id', type: 'string', required: true, description: `The ID of the guild.` }, + ], + }, + { + name: 'discordbot_delete_guild_emoji', + description: `Delete a guild emoji. Requires MANAGE_GUILD_EXPRESSIONS permission. Returns 204 No Content on success.`, + params: [ + { + name: 'emoji_id', + type: 'string', + required: true, + description: `The ID of the emoji to delete.`, + }, + { name: 'guild_id', type: 'string', required: true, description: `The ID of the guild.` }, + ], + }, + { + name: 'discordbot_delete_guild_integration', + description: `Delete an attached integration for a guild. Deletes any associated webhooks and kicks the associated bot if there is one. Requires MANAGE_GUILD permission. Returns 204 No Content on success.`, + params: [ + { name: 'guild_id', type: 'string', required: true, description: `The ID of the guild.` }, + { + name: 'integration_id', + type: 'string', + required: true, + description: `The ID of the integration to delete.`, + }, + { + name: 'reason', + type: 'string', + required: false, + description: `Reason for deleting the integration, shown in the guild's audit log.`, + }, + ], + }, + { + name: 'discordbot_delete_guild_invite', + description: `Delete an invite by its code. Requires the MANAGE_CHANNELS permission on the channel this invite belongs to, or MANAGE_GUILD to remove any invite across the guild. Discord's invite-deletion endpoint is not guild-scoped in the URL — the invite code alone identifies it. Returns the deleted invite object.`, + params: [ + { + name: 'invite_code', + type: 'string', + required: true, + description: `The invite code to delete.`, + }, + { + name: 'reason', + type: 'string', + required: false, + description: `Reason for deleting the invite, shown in the guild's audit log.`, + }, + ], + }, + { + name: 'discordbot_delete_guild_role', + description: `Delete a guild role. Requires MANAGE_ROLES permission. Returns 204 No Content on success.`, + params: [ + { name: 'guild_id', type: 'string', required: true, description: `The ID of the guild.` }, + { + name: 'role_id', + type: 'string', + required: true, + description: `The ID of the role to delete.`, + }, + ], + }, + { + name: 'discordbot_delete_guild_scheduled_event', + description: `Delete a guild scheduled event. Requires MANAGE_EVENTS permission. Returns 204 No Content on success.`, + params: [ + { name: 'guild_id', type: 'string', required: true, description: `The ID of the guild.` }, + { + name: 'guild_scheduled_event_id', + type: 'string', + required: true, + description: `The ID of the scheduled event to delete.`, + }, + ], + }, + { + name: 'discordbot_delete_guild_soundboard_sound', + description: `Delete the given guild soundboard sound. For sounds created by the current user, requires either the CREATE_GUILD_EXPRESSIONS or MANAGE_GUILD_EXPRESSIONS permission. For other sounds, requires the MANAGE_GUILD_EXPRESSIONS permission. Fires a Guild Soundboard Sound Delete Gateway event. Returns 204 No Content on success.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild the soundboard sound belongs to.`, + }, + { + name: 'sound_id', + type: 'string', + required: true, + description: `The ID of the soundboard sound to delete.`, + }, + { + name: 'reason', + type: 'string', + required: false, + description: `Reason for deleting the sound, shown in the guild's audit log.`, + }, + ], + }, + { + name: 'discordbot_delete_guild_sticker', + description: `Delete a guild sticker. Requires MANAGE_GUILD_EXPRESSIONS permission. Returns 204 No Content on success.`, + params: [ + { name: 'guild_id', type: 'string', required: true, description: `The ID of the guild.` }, + { + name: 'sticker_id', + type: 'string', + required: true, + description: `The ID of the sticker to delete.`, + }, + ], + }, + { + name: 'discordbot_delete_guild_template', + description: `Delete a guild template. Requires the MANAGE_GUILD permission. Returns the deleted guild template object on success.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild the template belongs to.`, + }, + { + name: 'template_code', + type: 'string', + required: true, + description: `The template code to delete.`, + }, + ], + }, + { + name: 'discordbot_delete_lobby', + description: `Delete a Discord lobby if it exists. Safe to call even if the lobby is already deleted. Returns nothing.`, + params: [ + { + name: 'lobby_id', + type: 'string', + required: true, + description: `The ID of the lobby to delete.`, + }, + ], + }, + { + name: 'discordbot_delete_message', + description: `Permanently delete a message from a Discord channel. This action is irreversible. Requires MANAGE_MESSAGES permission for messages sent by others.`, + params: [ + { + name: 'channel_id', + type: 'string', + required: true, + description: `The ID of the channel containing the message.`, + }, + { + name: 'message_id', + type: 'string', + required: true, + description: `The ID of the message to delete.`, + }, + ], + }, + { + name: 'discordbot_delete_original_interaction_response', + description: `Delete the initial response to an interaction. Returns 204 No Content on success.`, + params: [ + { + name: 'application_id', + type: 'string', + required: true, + description: `The ID of the application.`, + }, + { + name: 'interaction_token', + type: 'string', + required: true, + description: `The token of the interaction.`, + }, + ], + }, + { + name: 'discordbot_delete_own_reaction', + description: `Remove the current user's own reaction from a Discord message. The emoji parameter should be URL-encoded.`, + params: [ + { + name: 'channel_id', + type: 'string', + required: true, + description: `The ID of the channel containing the message.`, + }, + { + name: 'emoji', + type: 'string', + required: true, + description: `The emoji reaction to remove. Use URL-encoded Unicode for standard emojis or name:id for custom emojis.`, + }, + { + name: 'message_id', + type: 'string', + required: true, + description: `The ID of the message to remove the reaction from.`, + }, + ], + }, + { + name: 'discordbot_delete_stage_instance', + description: `Delete the Stage instance for a Stage channel, ending the live Stage. Requires the user to be a moderator of the Stage channel (MANAGE_CHANNELS, MUTE_MEMBERS, and MOVE_MEMBERS permissions). Fires a Stage Instance Delete Gateway event. Returns 204 No Content on success.`, + params: [ + { + name: 'channel_id', + type: 'string', + required: true, + description: `The ID of the Stage channel whose Stage instance should be deleted.`, + }, + { + name: 'reason', + type: 'string', + required: false, + description: `Reason for deleting the Stage instance, shown in the guild's audit log.`, + }, + ], + }, + { + name: 'discordbot_delete_test_entitlement', + description: `Delete a currently-active test entitlement. Discord will act as though that user or guild no longer has entitlement to your premium offering. Returns 204 No Content on success.`, + params: [ + { + name: 'application_id', + type: 'string', + required: true, + description: `The ID of the application that owns the entitlement.`, + }, + { + name: 'entitlement_id', + type: 'string', + required: true, + description: `The ID of the test entitlement to delete.`, + }, + ], + }, + { + name: 'discordbot_delete_user_reaction', + description: `Delete a reaction made by a specific user on a message. Requires MANAGE_MESSAGES permission. Use URL-encoded emoji format (e.g., %F0%9F%94%A5 for fire emoji, or name:id for custom emoji).`, + params: [ + { + name: 'channel_id', + type: 'string', + required: true, + description: `The ID of the channel containing the message.`, + }, + { + name: 'emoji', + type: 'string', + required: true, + description: `The emoji to remove. For custom emoji use name:id format. For unicode emoji use the URL-encoded character.`, + }, + { + name: 'message_id', + type: 'string', + required: true, + description: `The ID of the message to remove the reaction from.`, + }, + { + name: 'user_id', + type: 'string', + required: true, + description: `The ID of the user whose reaction to remove.`, + }, + ], + }, + { + name: 'discordbot_delete_webhook', + description: `Permanently delete a Discord webhook. Requires MANAGE_WEBHOOKS permission. This action is irreversible.`, + params: [ + { + name: 'webhook_id', + type: 'string', + required: true, + description: `The ID of the webhook to delete.`, + }, + ], + }, + { + name: 'discordbot_delete_webhook_message', + description: `Delete a previously sent webhook message. Returns 204 No Content on success.`, + params: [ + { + name: 'message_id', + type: 'string', + required: true, + description: `The ID of the message to delete.`, + }, + { name: 'webhook_id', type: 'string', required: true, description: `The ID of the webhook.` }, + { + name: 'webhook_token', + type: 'string', + required: true, + description: `The token of the webhook.`, + }, + { + name: 'thread_id', + type: 'string', + required: false, + description: `ID of the thread the message is in (if applicable).`, + }, + ], + }, + { + name: 'discordbot_delete_webhook_with_token', + description: `Delete a webhook using its token instead of OAuth authentication. Returns 204 No Content on success.`, + params: [ + { + name: 'webhook_id', + type: 'string', + required: true, + description: `The ID of the webhook to delete.`, + }, + { + name: 'webhook_token', + type: 'string', + required: true, + description: `The token of the webhook.`, + }, + ], + }, + { + name: 'discordbot_edit_channel_permissions', + description: `Edit the channel permission overwrites for a user or role in a channel. Only usable for guild channels. Requires MANAGE_ROLES permission. Returns 204 No Content on success. Full permission flag reference (name=decimal value, OR multiple together): CREATE_INSTANT_INVITE=1, KICK_MEMBERS=2, BAN_MEMBERS=4, ADMINISTRATOR=8, MANAGE_CHANNELS=16, MANAGE_GUILD=32, ADD_REACTIONS=64, VIEW_AUDIT_LOG=128, PRIORITY_SPEAKER=256, STREAM=512, VIEW_CHANNEL=1024, SEND_MESSAGES=2048, SEND_TTS_MESSAGES=4096, MANAGE_MESSAGES=8192, EMBED_LINKS=16384, ATTACH_FILES=32768, READ_MESSAGE_HISTORY=65536, MENTION_EVERYONE=131072, USE_EXTERNAL_EMOJIS=262144, VIEW_GUILD_INSIGHTS=524288, CONNECT=1048576, SPEAK=2097152, MUTE_MEMBERS=4194304, DEAFEN_MEMBERS=8388608, MOVE_MEMBERS=16777216, USE_VAD=33554432, CHANGE_NICKNAME=67108864, MANAGE_NICKNAMES=134217728, MANAGE_ROLES=268435456, MANAGE_WEBHOOKS=536870912, MANAGE_GUILD_EXPRESSIONS=1073741824, USE_APPLICATION_COMMANDS=2147483648, REQUEST_TO_SPEAK=4294967296, MANAGE_EVENTS=8589934592, MANAGE_THREADS=17179869184, CREATE_PUBLIC_THREADS=34359738368, CREATE_PRIVATE_THREADS=68719476736, USE_EXTERNAL_STICKERS=137438953472, SEND_MESSAGES_IN_THREADS=274877906944, USE_EMBEDDED_ACTIVITIES=549755813888, MODERATE_MEMBERS=1099511627776, VIEW_CREATOR_MONETIZATION_ANALYTICS=2199023255552, USE_SOUNDBOARD=4398046511104, CREATE_GUILD_EXPRESSIONS=8796093022208, CREATE_EVENTS=17592186044416, USE_EXTERNAL_SOUNDS=35184372088832, SEND_VOICE_MESSAGES=70368744177664, SET_VOICE_CHANNEL_STATUS=281474976710656, SEND_POLLS=562949953421312, USE_EXTERNAL_APPS=1125899906842624, PIN_MESSAGES=2251799813685248, BYPASS_SLOWMODE=4503599627370496. Or use a calculator like discordapi.com/permissions.htm. Optionally provide 'allow_names'/'deny_names' (arrays of named permission flags) instead of raw 'allow'/'deny' integers — the correct bitfield is computed automatically.`, + params: [ + { + name: 'channel_id', + type: 'string', + required: true, + description: `The ID of the channel to edit permissions for.`, + }, + { + name: 'overwrite_id', + type: 'string', + required: true, + description: `The ID of the role or user to set permissions for.`, + }, + { + name: 'type', + type: 'integer', + required: true, + description: `Type of overwrite: 0 for role, 1 for member. Required by Discord's API.`, + }, + { + name: 'allow', + type: 'string', + required: false, + description: `Bitwise value of all allowed permissions as a string.`, + }, + { + name: 'allow_names', + type: 'array', + required: false, + description: `Named permission flags to OR together for 'allow', as a more reliable alternative to a raw bitwise integer string — no manual bit math required. If both 'allow_names' and 'allow' are given, 'allow_names' takes precedence.`, + }, + { + name: 'deny', + type: 'string', + required: false, + description: `Bitwise value of all denied permissions as a string.`, + }, + { + name: 'deny_names', + type: 'array', + required: false, + description: `Named permission flags to OR together for 'deny', as a more reliable alternative to a raw bitwise integer string — no manual bit math required. If both 'deny_names' and 'deny' are given, 'deny_names' takes precedence.`, + }, + ], + }, + { + name: 'discordbot_edit_current_application', + description: `Edit properties of the app associated with the requesting bot user. Only properties that are passed are updated. Returns the updated application object on success.`, + params: [ + { + name: 'cover_image', + type: 'string', + required: false, + description: `Base64 encoded image data URI for the app's default rich presence invite cover image, or null to remove it.`, + }, + { + name: 'custom_install_url', + type: 'string', + required: false, + description: `Default custom authorization URL for the app, if enabled.`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `Description of the app.`, + }, + { + name: 'event_webhooks_status', + type: 'integer', + required: false, + description: `Whether event webhooks are enabled for the app. Use 1 to disable and 2 to enable.`, + }, + { + name: 'event_webhooks_types', + type: 'array', + required: false, + description: `List of webhook event types to subscribe to.`, + }, + { + name: 'event_webhooks_url', + type: 'string', + required: false, + description: `Event webhooks URL for the app to receive webhook events.`, + }, + { + name: 'flags', + type: 'integer', + required: false, + description: `App's public flags. Only limited intent flags (GATEWAY_PRESENCE_LIMITED, GATEWAY_GUILD_MEMBERS_LIMITED, and GATEWAY_MESSAGE_CONTENT_LIMITED) can be updated via the API.`, + }, + { + name: 'icon', + type: 'string', + required: false, + description: `Base64 encoded image data URI for the icon of the app, or null to remove it.`, + }, + { + name: 'install_params', + type: 'object', + required: false, + description: `Settings for the app's default in-app authorization link, if enabled. An object with 'scopes' (array of strings) and 'permissions' (string).`, + }, + { + name: 'integration_types_config', + type: 'object', + required: false, + description: `Default scopes and permissions for each supported installation context, keyed by application integration type (0 for guild install, 1 for user install).`, + }, + { + name: 'interactions_endpoint_url', + type: 'string', + required: false, + description: `Interactions endpoint URL for the app. Discord validates this URL by sending a PING interaction before accepting the update.`, + }, + { + name: 'role_connections_verification_url', + type: 'string', + required: false, + description: `Role connection verification URL for the app.`, + }, + { + name: 'tags', + type: 'array', + required: false, + description: `List of tags describing the content and functionality of the app. Max of 20 characters per tag, and a max of 5 tags.`, + }, + ], + }, + { + name: 'discordbot_edit_global_application_command', + description: `Edit a global application command. Returns the updated command object.`, + params: [ + { + name: 'application_id', + type: 'string', + required: true, + description: `The ID of the application.`, + }, + { + name: 'command_id', + type: 'string', + required: true, + description: `The ID of the command to edit.`, + }, + { + name: 'default_member_permissions', + type: 'string', + required: false, + description: `Permissions required to use the command as a bitfield string.`, + }, + { + name: 'default_permission', + type: 'boolean', + required: false, + description: `Whether the command is enabled by default (deprecated).`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `New command description (1-100 characters).`, + }, + { + name: 'description_localizations', + type: 'object', + required: false, + description: `Localization dictionary for description field.`, + }, + { + name: 'dm_permission', + type: 'boolean', + required: false, + description: `Whether the command is available in DMs (deprecated).`, + }, + { + name: 'name', + type: 'string', + required: false, + description: `New command name (1-32 characters).`, + }, + { + name: 'name_localizations', + type: 'object', + required: false, + description: `Localization dictionary for name field.`, + }, + { + name: 'nsfw', + type: 'boolean', + required: false, + description: `Whether the command is age-restricted.`, + }, + { + name: 'options', + type: 'array', + required: false, + description: `New array of command option objects.`, + }, + ], + }, + { + name: 'discordbot_edit_guild_application_command', + description: `Edit a guild application command. Returns the updated command object.`, + params: [ + { + name: 'application_id', + type: 'string', + required: true, + description: `The ID of the application.`, + }, + { + name: 'command_id', + type: 'string', + required: true, + description: `The ID of the command to edit.`, + }, + { name: 'guild_id', type: 'string', required: true, description: `The ID of the guild.` }, + { + name: 'default_member_permissions', + type: 'string', + required: false, + description: `Permissions required to use the command as a bitfield string.`, + }, + { + name: 'default_permission', + type: 'boolean', + required: false, + description: `Whether the command is enabled by default (deprecated).`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `New command description.`, + }, + { + name: 'description_localizations', + type: 'object', + required: false, + description: `Localization dictionary for description field.`, + }, + { name: 'name', type: 'string', required: false, description: `New command name.` }, + { + name: 'name_localizations', + type: 'object', + required: false, + description: `Localization dictionary for name field.`, + }, + { + name: 'nsfw', + type: 'boolean', + required: false, + description: `Whether the command is age-restricted.`, + }, + { + name: 'options', + type: 'array', + required: false, + description: `New array of command option objects.`, + }, + ], + }, + { + name: 'discordbot_edit_message', + description: `Edit a previously sent message in a Discord channel. Only the author of the message can edit it. Supports updating content, embeds, flags, allowed mentions, components, and attachments.`, + params: [ + { + name: 'channel_id', + type: 'string', + required: true, + description: `The ID of the channel containing the message.`, + }, + { + name: 'message_id', + type: 'string', + required: true, + description: `The ID of the message to edit.`, + }, + { + name: 'allowed_mentions', + type: 'object', + required: false, + description: `Controls which mentions are allowed in the edited message.`, + }, + { + name: 'attachments', + type: 'array', + required: false, + description: `Array of attachment objects to keep or modify on the message.`, + }, + { + name: 'components', + type: 'array', + required: false, + description: `Array of updated message component objects.`, + }, + { + name: 'content', + type: 'string', + required: false, + description: `New text content for the message (up to 2000 characters). Pass null to remove content.`, + }, + { + name: 'embeds', + type: 'array', + required: false, + description: `Array of updated embed objects. Pass empty array to remove all embeds.`, + }, + { + name: 'flags', + type: 'integer', + required: false, + description: `Updated message flags. Use 64 to suppress embeds.`, + }, + ], + }, + { + name: 'discordbot_edit_original_interaction_response', + description: `Edit the initial response to an interaction. Returns the updated message object.`, + params: [ + { + name: 'application_id', + type: 'string', + required: true, + description: `The ID of the application.`, + }, + { + name: 'interaction_token', + type: 'string', + required: true, + description: `The token of the interaction.`, + }, + { + name: 'allowed_mentions', + type: 'object', + required: false, + description: `Allowed mentions object.`, + }, + { + name: 'attachments', + type: 'array', + required: false, + description: `Array of attachment objects.`, + }, + { + name: 'components', + type: 'array', + required: false, + description: `Array of message component objects.`, + }, + { name: 'content', type: 'string', required: false, description: `Updated message content.` }, + { name: 'embeds', type: 'array', required: false, description: `Array of embed objects.` }, + { name: 'flags', type: 'integer', required: false, description: `Message flags.` }, + ], + }, + { + name: 'discordbot_edit_webhook_message', + description: `Edit a previously sent webhook message. Returns the updated message object.`, + params: [ + { + name: 'message_id', + type: 'string', + required: true, + description: `The ID of the message to edit.`, + }, + { name: 'webhook_id', type: 'string', required: true, description: `The ID of the webhook.` }, + { + name: 'webhook_token', + type: 'string', + required: true, + description: `The token of the webhook.`, + }, + { + name: 'allowed_mentions', + type: 'object', + required: false, + description: `Allowed mentions object controlling which mentions are processed.`, + }, + { + name: 'attachments', + type: 'array', + required: false, + description: `Array of attachment objects to include with the message.`, + }, + { + name: 'components', + type: 'array', + required: false, + description: `Array of message component objects.`, + }, + { + name: 'content', + type: 'string', + required: false, + description: `New message content (up to 2000 characters).`, + }, + { name: 'embeds', type: 'array', required: false, description: `Array of embed objects.` }, + { + name: 'flags', + type: 'integer', + required: false, + description: `Message flags (only SUPPRESS_EMBEDS can be set/unset).`, + }, + { + name: 'poll', + type: 'object', + required: false, + description: `A poll request object to attach to the message. Polls can only be added when editing a deferred interaction response.`, + }, + { + name: 'thread_id', + type: 'string', + required: false, + description: `ID of the thread the message is in (query parameter).`, + }, + { + name: 'with_components', + type: 'boolean', + required: false, + description: `Whether to respect the components field of the request (defaults to false). When enabled, allows application-owned webhooks to use all components and non-owned webhooks to use non-interactive components.`, + }, + ], + }, + { + name: 'discordbot_end_poll', + description: `Immediately end an active poll in a Discord message. You cannot end polls created by other users.`, + params: [ + { + name: 'channel_id', + type: 'string', + required: true, + description: `The ID of the channel containing the poll message.`, + }, + { + name: 'message_id', + type: 'string', + required: true, + description: `The ID of the poll message to end.`, + }, + ], + }, + { + name: 'discordbot_execute_github_compatible_webhook', + description: `Send a GitHub webhook event payload to a Discord webhook, for use as the Payload URL when configuring a GitHub repository webhook. Supports the commit_comment, create, delete, fork, issue_comment, issues, member, public, pull_request, pull_request_review, pull_request_review_comment, push, release, watch, check_run, check_suite, discussion, and discussion_comment GitHub events.`, + params: [ + { + name: 'sender', + type: 'object', + required: true, + description: `The GitHub user object that triggered the event.`, + }, + { + name: 'webhook_id', + type: 'string', + required: true, + description: `The ID of the webhook to execute.`, + }, + { + name: 'webhook_token', + type: 'string', + required: true, + description: `The token of the webhook.`, + }, + { + name: 'action', + type: 'string', + required: false, + description: `The GitHub event action, such as opened, closed, or created.`, + }, + { + name: 'answer', + type: 'object', + required: false, + description: `The GitHub discussion answer comment object, present for discussion answer events.`, + }, + { + name: 'check_run', + type: 'object', + required: false, + description: `The GitHub check run object, present for check_run events.`, + }, + { + name: 'check_suite', + type: 'object', + required: false, + description: `The GitHub check suite object, present for check_suite events.`, + }, + { + name: 'comment', + type: 'object', + required: false, + description: `The GitHub comment object, present for comment_comment, issue_comment, pull_request_review_comment, and discussion_comment events.`, + }, + { + name: 'commits', + type: 'array', + required: false, + description: `Array of GitHub commit objects included in a push event.`, + }, + { + name: 'compare', + type: 'string', + required: false, + description: `URL to compare the before and after states of a push event.`, + }, + { + name: 'discussion', + type: 'object', + required: false, + description: `The GitHub discussion object, present for discussion events.`, + }, + { + name: 'forced', + type: 'boolean', + required: false, + description: `Whether the push event was a force push.`, + }, + { + name: 'forkee', + type: 'object', + required: false, + description: `The GitHub repository object for the new fork, present for fork events.`, + }, + { + name: 'head_commit', + type: 'object', + required: false, + description: `The head GitHub commit object for a push event.`, + }, + { + name: 'issue', + type: 'object', + required: false, + description: `The GitHub issue object, present for issues and issue_comment events.`, + }, + { + name: 'member', + type: 'object', + required: false, + description: `The GitHub user object for the affected member, present for member events.`, + }, + { + name: 'pull_request', + type: 'object', + required: false, + description: `The GitHub pull request object, present for pull_request, pull_request_review, and pull_request_review_comment events.`, + }, + { + name: 'ref', + type: 'string', + required: false, + description: `The full git ref that was pushed, created, or deleted, such as refs/heads/main.`, + }, + { + name: 'ref_type', + type: 'string', + required: false, + description: `The type of ref affected, such as branch or tag, present for create and delete events.`, + }, + { + name: 'release', + type: 'object', + required: false, + description: `The GitHub release object, present for release events.`, + }, + { + name: 'repository', + type: 'object', + required: false, + description: `The GitHub repository object the event occurred in.`, + }, + { + name: 'review', + type: 'object', + required: false, + description: `The GitHub pull request review object, present for pull_request_review events.`, + }, + { + name: 'thread_id', + type: 'string', + required: false, + description: `ID of the thread to send the message in.`, + }, + { + name: 'wait', + type: 'boolean', + required: false, + description: `Waits for server confirmation of message send before responding. Defaults to true; when false, a message that fails to save does not return an error.`, + }, + ], + }, + { + name: 'discordbot_execute_slack_compatible_webhook', + description: `Send a message to a Discord webhook using a Slack-compatible payload format, so tools that only speak Slack's incoming webhook format can post into Discord. Discord does not support Slack's channel, icon_emoji, mrkdwn, or mrkdwn_in properties.`, + params: [ + { + name: 'webhook_id', + type: 'string', + required: true, + description: `The ID of the webhook to execute.`, + }, + { + name: 'webhook_token', + type: 'string', + required: true, + description: `The token of the webhook.`, + }, + { + name: 'attachments', + type: 'array', + required: false, + description: `Array of Slack-style attachment objects to include with the message.`, + }, + { + name: 'icon_url', + type: 'string', + required: false, + description: `URL of an image to use as the icon for this message, overriding the webhook's default avatar.`, + }, + { + name: 'text', + type: 'string', + required: false, + description: `The message text content (up to 2000 characters).`, + }, + { + name: 'thread_id', + type: 'string', + required: false, + description: `ID of the thread to send the message in.`, + }, + { + name: 'username', + type: 'string', + required: false, + description: `Override the webhook's default username for this message.`, + }, + { + name: 'wait', + type: 'boolean', + required: false, + description: `Waits for server confirmation of message send before responding. Defaults to true; when false, a message that fails to save does not return an error.`, + }, + ], + }, + { + name: 'discordbot_execute_webhook', + description: `Send a message via a Discord webhook. Supports custom username, avatar, embeds, and components. File attachments (multipart/form-data) are not supported by this tool. Use the wait query parameter to receive the created message object in the response.`, + params: [ + { + name: 'webhook_id', + type: 'string', + required: true, + description: `The ID of the webhook to execute.`, + }, + { + name: 'webhook_token', + type: 'string', + required: true, + description: `The token of the webhook.`, + }, + { + name: 'allowed_mentions', + type: 'object', + required: false, + description: `Allowed mentions object to control mention behavior.`, + }, + { + name: 'applied_tags', + type: 'array', + required: false, + description: `Array of tag IDs to apply to the thread (requires the webhook channel to be a forum or media channel).`, + }, + { + name: 'attachments', + type: 'array', + required: false, + description: `Array of partial attachment request objects providing metadata for the attachments on this message.`, + }, + { + name: 'avatar_url', + type: 'string', + required: false, + description: `URL of the avatar image to use instead of the webhook's default avatar.`, + }, + { + name: 'components', + type: 'array', + required: false, + description: `Array of message component objects.`, + }, + { + name: 'content', + type: 'string', + required: false, + description: `The message text content (up to 2000 characters).`, + }, + { + name: 'embeds', + type: 'array', + required: false, + description: `Array of embed objects to include in the message (up to 10).`, + }, + { + name: 'flags', + type: 'integer', + required: false, + description: `Message flags. Use 64 for SUPPRESS_EMBEDS.`, + }, + { + name: 'poll', + type: 'object', + required: false, + description: `A poll request object to attach to the message.`, + }, + { + name: 'thread_id', + type: 'string', + required: false, + description: `Send the message to this thread within a forum or media channel.`, + }, + { + name: 'thread_name', + type: 'string', + required: false, + description: `Name of the thread to create (only for forum/media channels).`, + }, + { + name: 'tts', + type: 'boolean', + required: false, + description: `Whether the message should be sent as text-to-speech.`, + }, + { + name: 'username', + type: 'string', + required: false, + description: `Override the webhook's default username for this message.`, + }, + { + name: 'wait', + type: 'boolean', + required: false, + description: `If true, waits for the message to be created and returns the message object.`, + }, + { + name: 'with_components', + type: 'boolean', + required: false, + description: `Whether to respect the components field of the request. When enabled, allows application-owned webhooks to use all components and non-owned webhooks to use non-interactive components. Defaults to false.`, + }, + ], + }, + { + name: 'discordbot_follow_announcement_channel', + description: `Follow an announcement channel to send messages to a target channel. Requires MANAGE_WEBHOOKS permission in the target channel. Returns a followed channel object.`, + params: [ + { + name: 'channel_id', + type: 'string', + required: true, + description: `The ID of the announcement channel to follow.`, + }, + { + name: 'webhook_channel_id', + type: 'string', + required: true, + description: `The ID of the target channel to receive crossposted messages.`, + }, + ], + }, + { + name: 'discordbot_get_answer_voters', + description: `Retrieve a list of users who voted for a specific answer in a Discord poll.`, + params: [ + { + name: 'answer_id', + type: 'string', + required: true, + description: `The ID of the poll answer to get voters for.`, + }, + { + name: 'channel_id', + type: 'string', + required: true, + description: `The ID of the channel containing the poll message.`, + }, + { + name: 'message_id', + type: 'string', + required: true, + description: `The ID of the poll message.`, + }, + { + name: 'after', + type: 'string', + required: false, + description: `Get users after this user ID (snowflake) for pagination.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of voters to return (1-100). Default is 25.`, + }, + ], + }, + { + name: 'discordbot_get_application_activity_instance', + description: `Retrieve a serialized activity instance for an application, if it exists. Useful for preventing unwanted activity sessions.`, + params: [ + { + name: 'application_id', + type: 'string', + required: true, + description: `The ID of the application that owns the activity instance.`, + }, + { + name: 'instance_id', + type: 'string', + required: true, + description: `The ID of the activity instance to retrieve.`, + }, + ], + }, + { + name: 'discordbot_get_application_emoji', + description: `Retrieve a specific emoji owned by a Discord application by its emoji ID.`, + params: [ + { + name: 'application_id', + type: 'string', + required: true, + description: `The ID of the application that owns the emoji.`, + }, + { + name: 'emoji_id', + type: 'string', + required: true, + description: `The ID of the emoji to retrieve.`, + }, + ], + }, + { + name: 'discordbot_get_application_role_connection_metadata', + description: `Fetch the list of application role connection metadata records configured for an application. Returns an array of application role connection metadata objects, each describing a comparison type, dictionary key, name, and description used to verify a user's role connection.`, + params: [ + { + name: 'application_id', + type: 'string', + required: true, + description: `The ID of the application.`, + }, + ], + }, + { + name: 'discordbot_get_auto_moderation_rule', + description: `Get a single Auto Moderation rule for a guild by its ID. Requires the MANAGE_GUILD permission. Returns an auto moderation rule object.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild the rule belongs to.`, + }, + { + name: 'rule_id', + type: 'string', + required: true, + description: `The ID of the Auto Moderation rule to retrieve.`, + }, + ], + }, + { + name: 'discordbot_get_channel', + description: `Retrieve a Discord channel by its ID. Returns channel information including type, name, topic, permissions, and other metadata.`, + params: [ + { + name: 'channel_id', + type: 'string', + required: true, + description: `The ID of the channel to retrieve.`, + }, + ], + }, + { + name: 'discordbot_get_channel_invites', + description: `Retrieve a list of invites for a Discord channel. Requires MANAGE_CHANNELS permission. Returns invite objects with metadata.`, + params: [ + { + name: 'channel_id', + type: 'string', + required: true, + description: `The ID of the channel to retrieve invites for.`, + }, + ], + }, + { + name: 'discordbot_get_channel_message', + description: `Retrieve a specific message from a Discord channel by its message ID.`, + params: [ + { + name: 'channel_id', + type: 'string', + required: true, + description: `The ID of the channel containing the message.`, + }, + { + name: 'message_id', + type: 'string', + required: true, + description: `The ID of the message to retrieve.`, + }, + ], + }, + { + name: 'discordbot_get_channel_webhooks', + description: `Retrieve all webhooks for a Discord channel. Requires MANAGE_WEBHOOKS permission.`, + params: [ + { + name: 'channel_id', + type: 'string', + required: true, + description: `The ID of the channel to retrieve webhooks for.`, + }, + ], + }, + { + name: 'discordbot_get_current_application', + description: `Retrieve the full application object associated with the requesting bot user, including installation settings, integration type configuration, and webhook event configuration.`, + params: [], + }, + { + name: 'discordbot_get_current_bot_application', + description: `Retrieve the bot's own application object, including its public Client ID, name, icon, and description. Per Discord's official OpenAPI spec, this endpoint is Bot Token only.`, + params: [], + }, + { + name: 'discordbot_get_current_user_voice_state', + description: `Retrieve the current user's (the bot's) voice state in a guild, including the connected voice channel, mute and deafen status, and stage speaking request timestamp.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to get the current user's voice state for.`, + }, + ], + }, + { + name: 'discordbot_get_entitlement', + description: `Retrieve a single entitlement for an application by ID. Use to check whether a specific entitlement is active, its type, and its expiration window.`, + params: [ + { + name: 'application_id', + type: 'string', + required: true, + description: `The ID of the application that owns the entitlement.`, + }, + { + name: 'entitlement_id', + type: 'string', + required: true, + description: `The ID of the entitlement to retrieve.`, + }, + ], + }, + { + name: 'discordbot_get_global_application_command', + description: `Fetch a specific global application command. Returns the application command object.`, + params: [ + { + name: 'application_id', + type: 'string', + required: true, + description: `The ID of the application.`, + }, + { + name: 'command_id', + type: 'string', + required: true, + description: `The ID of the command to retrieve.`, + }, + ], + }, + { + name: 'discordbot_get_global_application_commands', + description: `Fetch all global commands for an application. Returns an array of application command objects.`, + params: [ + { + name: 'application_id', + type: 'string', + required: true, + description: `The ID of the application.`, + }, + { + name: 'with_localizations', + type: 'boolean', + required: false, + description: `Whether to include localizations in the response.`, + }, + ], + }, + { + name: 'discordbot_get_guild', + description: `Retrieve a Discord guild (server) by its ID. Optionally include approximate member and presence counts.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to retrieve.`, + }, + { + name: 'with_counts', + type: 'boolean', + required: false, + description: `When true, returns approximate_member_count and approximate_presence_count.`, + }, + ], + }, + { + name: 'discordbot_get_guild_application_command', + description: `Fetch a specific application command registered in a guild. Returns the application command object.`, + params: [ + { + name: 'application_id', + type: 'string', + required: true, + description: `The ID of the application.`, + }, + { + name: 'command_id', + type: 'string', + required: true, + description: `The ID of the command to retrieve.`, + }, + { name: 'guild_id', type: 'string', required: true, description: `The ID of the guild.` }, + ], + }, + { + name: 'discordbot_get_guild_application_command_permissions', + description: `Fetch permissions for all commands in a guild. Returns an array of guild application command permissions objects.`, + params: [ + { + name: 'application_id', + type: 'string', + required: true, + description: `The ID of the application.`, + }, + { name: 'guild_id', type: 'string', required: true, description: `The ID of the guild.` }, + ], + }, + { + name: 'discordbot_get_guild_application_commands', + description: `Fetch all application commands registered in a specific guild. Returns an array of application command objects.`, + params: [ + { + name: 'application_id', + type: 'string', + required: true, + description: `The ID of the application.`, + }, + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to get commands for.`, + }, + { + name: 'with_localizations', + type: 'boolean', + required: false, + description: `Whether to include localizations in the response.`, + }, + ], + }, + { + name: 'discordbot_get_guild_audit_log', + description: `Retrieve the audit log for a Discord guild. Returns a list of audit log entries with details about administrative actions. Requires VIEW_AUDIT_LOG permission.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to retrieve the audit log for.`, + }, + { + name: 'action_type', + type: 'integer', + required: false, + description: `Filter by audit log event type (e.g., 1=GUILD_UPDATE, 10=CHANNEL_CREATE, 20=MEMBER_KICK).`, + }, + { + name: 'after', + type: 'string', + required: false, + description: `Return entries after this audit log entry ID for pagination.`, + }, + { + name: 'before', + type: 'string', + required: false, + description: `Return entries before this audit log entry ID for pagination.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Number of entries to return (1-100). Default is 50.`, + }, + { + name: 'user_id', + type: 'string', + required: false, + description: `Filter audit log entries by the user who performed the action.`, + }, + ], + }, + { + name: 'discordbot_get_guild_ban', + description: `Retrieve the ban record for a specific user in a Discord guild. Requires BAN_MEMBERS permission.`, + params: [ + { name: 'guild_id', type: 'string', required: true, description: `The ID of the guild.` }, + { + name: 'user_id', + type: 'string', + required: true, + description: `The ID of the banned user to retrieve information for.`, + }, + ], + }, + { + name: 'discordbot_get_guild_bans', + description: `Retrieve a list of ban objects for users banned from a Discord guild. Requires BAN_MEMBERS permission. Supports pagination via before and after.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to retrieve bans for.`, + }, + { + name: 'after', + type: 'string', + required: false, + description: `Return bans after this user ID (snowflake) for pagination.`, + }, + { + name: 'before', + type: 'string', + required: false, + description: `Return bans before this user ID (snowflake) for pagination.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Number of bans to return (1-1000). Default is 1000.`, + }, + ], + }, + { + name: 'discordbot_get_guild_emoji', + description: `Retrieve a specific custom emoji from a Discord guild by its emoji ID.`, + params: [ + { + name: 'emoji_id', + type: 'string', + required: true, + description: `The ID of the emoji to retrieve.`, + }, + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild containing the emoji.`, + }, + ], + }, + { + name: 'discordbot_get_guild_integrations', + description: `Retrieve a list of integration objects for a Discord guild. Requires MANAGE_GUILD permission. Returns a maximum of 50 integrations.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to retrieve integrations for.`, + }, + ], + }, + { + name: 'discordbot_get_guild_invites', + description: `Retrieve a list of all active invites for a Discord guild. Requires MANAGE_GUILD permission. Returns invite objects with metadata.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to retrieve invites for.`, + }, + ], + }, + { + name: 'discordbot_get_guild_member', + description: `Retrieve a specific member of a Discord guild by their user ID. Returns the guild member object including roles, nickname, and join date.`, + params: [ + { name: 'guild_id', type: 'string', required: true, description: `The ID of the guild.` }, + { + name: 'user_id', + type: 'string', + required: true, + description: `The ID of the user to retrieve guild member information for.`, + }, + ], + }, + { + name: 'discordbot_get_guild_onboarding', + description: `Get the onboarding configuration for a guild. Returns the guild onboarding object.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to get onboarding information for.`, + }, + ], + }, + { + name: 'discordbot_get_guild_preview', + description: `Retrieve a preview of a Discord guild. For public guilds this is accessible without being a member. Returns guild name, description, icon, emojis, stickers, and approximate counts.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to preview.`, + }, + ], + }, + { + name: 'discordbot_get_guild_prune_count', + description: `Get the number of members that would be removed by a prune operation. Requires KICK_MEMBERS permission.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to check prune count for.`, + }, + { + name: 'days', + type: 'integer', + required: false, + description: `Number of days of inactivity to check for (1-30, default 7).`, + }, + { + name: 'include_roles', + type: 'string', + required: false, + description: `Comma-separated list of role IDs to include in the prune count.`, + }, + ], + }, + { + name: 'discordbot_get_guild_role', + description: `Retrieve a specific role object from a Discord guild by its role ID.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild containing the role.`, + }, + { + name: 'role_id', + type: 'string', + required: true, + description: `The ID of the role to retrieve.`, + }, + ], + }, + { + name: 'discordbot_get_guild_role_member_counts', + description: `Retrieve a map of role IDs to the number of guild members with that role. Does not include the @everyone role.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to retrieve role member counts for.`, + }, + ], + }, + { + name: 'discordbot_get_guild_scheduled_event', + description: `Retrieve a specific scheduled event in a Discord guild by its event ID.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild containing the scheduled event.`, + }, + { + name: 'guild_scheduled_event_id', + type: 'string', + required: true, + description: `The ID of the scheduled event to retrieve.`, + }, + { + name: 'with_user_count', + type: 'boolean', + required: false, + description: `Include the user subscription count for the event.`, + }, + ], + }, + { + name: 'discordbot_get_guild_scheduled_event_users', + description: `Get a list of users subscribed to a guild scheduled event. Returns a list of guild scheduled event user objects.`, + params: [ + { name: 'guild_id', type: 'string', required: true, description: `The ID of the guild.` }, + { + name: 'guild_scheduled_event_id', + type: 'string', + required: true, + description: `The ID of the scheduled event.`, + }, + { + name: 'after', + type: 'string', + required: false, + description: `Get users after this user ID (for pagination).`, + }, + { + name: 'before', + type: 'string', + required: false, + description: `Get users before this user ID (for pagination).`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of users to return (1-100, default 100).`, + }, + { + name: 'with_member', + type: 'boolean', + required: false, + description: `Whether to include guild member objects for each user.`, + }, + ], + }, + { + name: 'discordbot_get_guild_soundboard_sound', + description: `Retrieve a soundboard sound object for the given sound id in a guild. Includes the user field if the bot has the CREATE_GUILD_EXPRESSIONS or MANAGE_GUILD_EXPRESSIONS permission.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild containing the soundboard sound.`, + }, + { + name: 'sound_id', + type: 'string', + required: true, + description: `The ID of the soundboard sound to retrieve.`, + }, + ], + }, + { + name: 'discordbot_get_guild_sticker', + description: `Retrieve a specific custom sticker from a Discord guild by its sticker ID.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild containing the sticker.`, + }, + { + name: 'sticker_id', + type: 'string', + required: true, + description: `The ID of the sticker to retrieve.`, + }, + ], + }, + { + name: 'discordbot_get_guild_vanity_url', + description: `Get the vanity URL for a guild. Requires MANAGE_GUILD permission. The guild must have the VANITY_URL feature enabled. Returns a partial invite object with code and uses.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to get the vanity URL for.`, + }, + ], + }, + { + name: 'discordbot_get_guild_voice_regions', + description: `Get a list of voice regions available for a guild. Returns optimal regions that can be used when updating a guild or voice channel's region.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to get voice regions for.`, + }, + ], + }, + { + name: 'discordbot_get_guild_webhooks', + description: `Retrieve all webhooks for a Discord guild. Requires MANAGE_WEBHOOKS permission.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to retrieve webhooks for.`, + }, + ], + }, + { + name: 'discordbot_get_guild_welcome_screen', + description: `Retrieve the welcome screen for a Discord guild. The welcome screen is shown to new members when they join.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to retrieve the welcome screen for.`, + }, + ], + }, + { + name: 'discordbot_get_guild_widget_settings', + description: `Get the widget settings for a guild. Requires MANAGE_GUILD permission. Returns the guild widget settings object.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to get widget settings for.`, + }, + ], + }, + { + name: 'discordbot_get_invite_target_users', + description: `Get the users allowed to see and accept an invite. Response is a CSV file with the header user_id and each user ID from the file originally passed to invite create, one per line. Requires the caller to be the inviter, or have MANAGE_GUILD permission, or have VIEW_AUDIT_LOG permission.`, + params: [ + { + name: 'invite_code', + type: 'string', + required: true, + description: `The invite code to get the target users for.`, + }, + ], + }, + { + name: 'discordbot_get_invite_target_users_job_status', + description: `Check the status of the asynchronous job that processes target users from a CSV when creating or updating an invite. Requires the caller to be the inviter, or have MANAGE_GUILD permission, or have VIEW_AUDIT_LOG permission. Status values: 0=UNSPECIFIED, 1=PROCESSING, 2=COMPLETED, 3=FAILED (see error_message for details).`, + params: [ + { + name: 'invite_code', + type: 'string', + required: true, + description: `The invite code to check the target users job status for.`, + }, + ], + }, + { + name: 'discordbot_get_lobby', + description: `Retrieve a Discord lobby object for the specified lobby id, if it exists.`, + params: [ + { + name: 'lobby_id', + type: 'string', + required: true, + description: `The ID of the lobby to retrieve.`, + }, + ], + }, + { + name: 'discordbot_get_lobby_messages', + description: `Retrieve the most recent messages in a Discord lobby. The calling user must be a member of the lobby. Returns an array of lobby message objects.`, + params: [ + { + name: 'lobby_id', + type: 'string', + required: true, + description: `The ID of the lobby to retrieve messages from.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of messages to return (1-200). Defaults to 50.`, + }, + ], + }, + { + name: 'discordbot_get_original_interaction_response', + description: `Get the initial response to an interaction. Returns the message object.`, + params: [ + { + name: 'application_id', + type: 'string', + required: true, + description: `The ID of the application.`, + }, + { + name: 'interaction_token', + type: 'string', + required: true, + description: `The token of the interaction.`, + }, + { + name: 'thread_id', + type: 'string', + required: false, + description: `ID of the thread the message is in.`, + }, + ], + }, + { + name: 'discordbot_get_pinned_messages', + description: `Retrieve pinned messages in a Discord channel using Discord's current paginated pins endpoint (introduced June 2025, replacing the deprecated /channels/{channel.id}/pins). Returns pinned messages ordered most-recently-pinned first.`, + params: [ + { + name: 'channel_id', + type: 'string', + required: true, + description: `The ID of the channel to retrieve pinned messages from.`, + }, + { + name: 'before', + type: 'string', + required: false, + description: `ISO8601 timestamp; only returns pins created before this time. Used for paginating through channels with many pins.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of pins to return (1-50, default 50).`, + }, + ], + }, + { + name: 'discordbot_get_reactions', + description: `Retrieve a list of users who reacted to a Discord message with a specific emoji.`, + params: [ + { + name: 'channel_id', + type: 'string', + required: true, + description: `The ID of the channel containing the message.`, + }, + { + name: 'emoji', + type: 'string', + required: true, + description: `The emoji to get reactions for. Use URL-encoded Unicode or name:id format.`, + }, + { + name: 'message_id', + type: 'string', + required: true, + description: `The ID of the message to get reactions for.`, + }, + { + name: 'after', + type: 'string', + required: false, + description: `Get users after this user ID (snowflake) for pagination.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of users to return (1-100). Default is 25.`, + }, + { + name: 'type', + type: 'integer', + required: false, + description: `The type of reaction (0 for normal, 1 for burst/super reactions).`, + }, + ], + }, + { + name: 'discordbot_get_sku_subscription', + description: `Retrieve a single subscription for a SKU by its ID. Returns a subscription object with its status, current billing period, and the entitlements it grants.`, + params: [ + { + name: 'sku_id', + type: 'string', + required: true, + description: `The ID of the SKU the subscription belongs to.`, + }, + { + name: 'subscription_id', + type: 'string', + required: true, + description: `The ID of the subscription to retrieve.`, + }, + { + name: 'user_id', + type: 'string', + required: false, + description: `Optional user ID to verify the subscription belongs to.`, + }, + ], + }, + { + name: 'discordbot_get_stage_instance', + description: `Retrieve the Stage instance associated with a Stage channel, if one exists (the channel is currently live).`, + params: [ + { + name: 'channel_id', + type: 'string', + required: true, + description: `The ID of the Stage channel to look up the Stage instance for.`, + }, + ], + }, + { + name: 'discordbot_get_sticker', + description: `Retrieve a Discord sticker by its ID. Returns sticker information including name, description, format type, and pack details.`, + params: [ + { + name: 'sticker_id', + type: 'string', + required: true, + description: `The ID of the sticker to retrieve.`, + }, + ], + }, + { + name: 'discordbot_get_sticker_pack', + description: `Retrieve a Discord standard sticker pack by its ID. Returns the sticker pack including its name, description, contained stickers, cover sticker, and banner asset.`, + params: [ + { + name: 'pack_id', + type: 'string', + required: true, + description: `The ID of the sticker pack to retrieve.`, + }, + ], + }, + { + name: 'discordbot_get_thread_member', + description: `Get a member of a thread. Returns a thread member object.`, + params: [ + { + name: 'channel_id', + type: 'string', + required: true, + description: `The ID of the thread channel.`, + }, + { + name: 'user_id', + type: 'string', + required: true, + description: `The ID of the thread member to retrieve.`, + }, + { + name: 'with_member', + type: 'boolean', + required: false, + description: `Whether to include a guild member object for the thread member.`, + }, + ], + }, + { + name: 'discordbot_get_user', + description: `Retrieve information about any Discord user by ID. Pass '@me' as user_id to fetch the bot's own user profile. Returns username, avatar, discriminator, locale, and premium status.`, + params: [ + { + name: 'user_id', + type: 'string', + required: true, + description: `The ID of the user to retrieve, or '@me' to fetch the bot's own user profile.`, + }, + ], + }, + { + name: 'discordbot_get_user_voice_state', + description: `Retrieve the specified user's voice state in a guild, including the connected voice channel, mute and deafen status, and stage speaking request timestamp. If the user is connected to a voice channel, the bot must have permission to connect to that channel.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to get the user's voice state for.`, + }, + { + name: 'user_id', + type: 'string', + required: true, + description: `The ID of the user to retrieve the voice state for.`, + }, + ], + }, + { + name: 'discordbot_get_webhook', + description: `Retrieve a Discord webhook by its ID. Returns the webhook object including name, channel, guild, and token.`, + params: [ + { + name: 'webhook_id', + type: 'string', + required: true, + description: `The ID of the webhook to retrieve.`, + }, + ], + }, + { + name: 'discordbot_get_webhook_message', + description: `Get a previously sent webhook message. Returns the message object.`, + params: [ + { + name: 'message_id', + type: 'string', + required: true, + description: `The ID of the message to retrieve.`, + }, + { name: 'webhook_id', type: 'string', required: true, description: `The ID of the webhook.` }, + { + name: 'webhook_token', + type: 'string', + required: true, + description: `The token of the webhook.`, + }, + { + name: 'thread_id', + type: 'string', + required: false, + description: `ID of the thread the message is in (if in a forum/thread channel).`, + }, + ], + }, + { + name: 'discordbot_get_webhook_with_token', + description: `Retrieve a Discord webhook using both its ID and token. Does not require bot authentication. Returns the webhook object without the user field.`, + params: [ + { + name: 'webhook_id', + type: 'string', + required: true, + description: `The ID of the webhook to retrieve.`, + }, + { + name: 'webhook_token', + type: 'string', + required: true, + description: `The token of the webhook.`, + }, + ], + }, + { + name: 'discordbot_group_dm_add_recipient', + description: `Add a recipient to a Group DM using their OAuth2 access token, which must have been granted the gdm.join scope. Returns 201 if the user was added, or 204 if already a recipient.`, + params: [ + { + name: 'access_token', + type: 'string', + required: true, + description: `OAuth2 access token of the user to add, granted with the gdm.join scope.`, + }, + { + name: 'channel_id', + type: 'string', + required: true, + description: `The ID of the Group DM channel to add the recipient to.`, + }, + { + name: 'user_id', + type: 'string', + required: true, + description: `The ID of the user to add to the Group DM.`, + }, + { + name: 'nick', + type: 'string', + required: false, + description: `Nickname to assign to the user being added.`, + }, + ], + }, + { + name: 'discordbot_group_dm_remove_recipient', + description: `Remove a recipient from a Group DM. Returns 204 No Content on success.`, + params: [ + { + name: 'channel_id', + type: 'string', + required: true, + description: `The ID of the Group DM channel to remove the recipient from.`, + }, + { + name: 'user_id', + type: 'string', + required: true, + description: `The ID of the user to remove from the Group DM.`, + }, + ], + }, + { + name: 'discordbot_join_thread', + description: `Add the current user to a thread. Requires the thread to not be archived. Returns 204 No Content on success.`, + params: [ + { + name: 'channel_id', + type: 'string', + required: true, + description: `The ID of the thread channel to join.`, + }, + ], + }, + { + name: 'discordbot_kick_guild_member', + description: `Remove (kick) a member from a Discord guild. The user can rejoin via a new invite. Requires KICK_MEMBERS permission.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to kick the member from.`, + }, + { + name: 'user_id', + type: 'string', + required: true, + description: `The ID of the member to kick.`, + }, + ], + }, + { + name: 'discordbot_leave_guild', + description: `Remove the bot from a guild it belongs to. Returns 204 No Content on success.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to leave.`, + }, + ], + }, + { + name: 'discordbot_leave_lobby', + description: `Remove the calling user from the specified Discord lobby. Safe to call even if the user is no longer a member, but fails if the lobby does not exist. Returns nothing.`, + params: [ + { + name: 'lobby_id', + type: 'string', + required: true, + description: `The ID of the lobby to leave.`, + }, + ], + }, + { + name: 'discordbot_leave_thread', + description: `Remove the current user from a thread. Requires the thread to not be archived. Returns 204 No Content on success.`, + params: [ + { + name: 'channel_id', + type: 'string', + required: true, + description: `The ID of the thread channel to leave.`, + }, + ], + }, + { + name: 'discordbot_link_channel_to_lobby', + description: `Link an existing guild text channel to a Discord lobby, or unlink any currently linked channel by omitting channel_id. The caller must be a lobby member with the CanLinkLobby lobby member flag. Returns the updated lobby object.`, + params: [ + { + name: 'lobby_id', + type: 'string', + required: true, + description: `The ID of the lobby to link or unlink a channel for.`, + }, + { + name: 'channel_id', + type: 'string', + required: false, + description: `The ID of the channel to link to the lobby. If omitted, any currently linked channel is unlinked from the lobby.`, + }, + ], + }, + { + name: 'discordbot_list_active_guild_threads', + description: `List all active threads in a guild, including public and private threads. Returns a list of channel objects and thread member objects for the current user.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to list active threads from.`, + }, + ], + }, + { + name: 'discordbot_list_application_emojis', + description: `Retrieve all emojis owned by a Discord application (app emojis). Returns an object containing a list of emoji objects under the items key.`, + params: [ + { + name: 'application_id', + type: 'string', + required: true, + description: `The ID of the application to retrieve emojis for.`, + }, + ], + }, + { + name: 'discordbot_list_auto_moderation_rules', + description: `Get a list of all Auto Moderation rules currently configured for a guild. Requires the MANAGE_GUILD permission. Returns a list of auto moderation rule objects.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to list Auto Moderation rules for.`, + }, + ], + }, + { + name: 'discordbot_list_channel_messages', + description: `Retrieve a list of messages from a Discord channel. Supports pagination using around, before, and after message IDs with a configurable limit.`, + params: [ + { + name: 'channel_id', + type: 'string', + required: true, + description: `The ID of the channel to retrieve messages from.`, + }, + { + name: 'after', + type: 'string', + required: false, + description: `Get messages after this message ID (snowflake).`, + }, + { + name: 'around', + type: 'string', + required: false, + description: `Get messages around this message ID (snowflake).`, + }, + { + name: 'before', + type: 'string', + required: false, + description: `Get messages before this message ID (snowflake).`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of messages to return (1-100). Default is 50.`, + }, + ], + }, + { + name: 'discordbot_list_default_soundboard_sounds', + description: `Retrieve an array of default soundboard sound objects that can be used by all users.`, + params: [], + }, + { + name: 'discordbot_list_guild_channels', + description: `Retrieve all channels in a Discord guild (server). Returns a list of channel objects including text channels, voice channels, categories, and threads.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to retrieve channels for.`, + }, + ], + }, + { + name: 'discordbot_list_guild_emojis', + description: `Retrieve all custom emojis for a Discord guild. Returns a list of emoji objects.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to retrieve emojis for.`, + }, + ], + }, + { + name: 'discordbot_list_guild_members', + description: `Retrieve a list of members in a Discord guild. Requires the GUILD_MEMBERS privileged intent or appropriate bot permissions. Supports pagination via the after parameter.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to list members for.`, + }, + { + name: 'after', + type: 'string', + required: false, + description: `Return members after this user ID (snowflake) for pagination.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of members to return (1-1000). Default is 1.`, + }, + ], + }, + { + name: 'discordbot_list_guild_roles', + description: `Retrieve all roles in a Discord guild. Returns a list of role objects including permissions, color, and position.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to retrieve roles for.`, + }, + ], + }, + { + name: 'discordbot_list_guild_scheduled_events', + description: `Retrieve a list of scheduled events for a Discord guild. Optionally include user subscription counts.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to retrieve scheduled events for.`, + }, + { + name: 'with_user_count', + type: 'boolean', + required: false, + description: `Include the user count for each scheduled event.`, + }, + ], + }, + { + name: 'discordbot_list_guild_soundboard_sounds', + description: `Retrieve the guild's soundboard sounds. Includes user fields if the bot has the CREATE_GUILD_EXPRESSIONS or MANAGE_GUILD_EXPRESSIONS permission. Returns an object with an items array of soundboard sound objects.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to retrieve soundboard sounds for.`, + }, + ], + }, + { + name: 'discordbot_list_guild_stickers', + description: `Retrieve all custom stickers for a Discord guild. Returns a list of sticker objects.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to retrieve stickers for.`, + }, + ], + }, + { + name: 'discordbot_list_guild_templates', + description: `Retrieve all guild templates for a guild. Requires the MANAGE_GUILD permission. Returns a list of guild template objects.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to retrieve templates for.`, + }, + ], + }, + { + name: 'discordbot_list_joined_private_archived_threads', + description: `List private archived threads in a channel that the current user has joined. Returns threads in descending order of archive timestamp.`, + params: [ + { + name: 'channel_id', + type: 'string', + required: true, + description: `The ID of the channel to list joined private archived threads from.`, + }, + { + name: 'before', + type: 'string', + required: false, + description: `Returns threads archived before this thread ID (snowflake).`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of threads to return.`, + }, + ], + }, + { + name: 'discordbot_list_private_archived_threads', + description: `List all private archived threads in a channel. Requires MANAGE_THREADS permission and READ_MESSAGE_HISTORY permission. Returns threads in descending order of archive timestamp.`, + params: [ + { + name: 'channel_id', + type: 'string', + required: true, + description: `The ID of the channel to list private archived threads from.`, + }, + { + name: 'before', + type: 'string', + required: false, + description: `Returns threads archived before this timestamp (ISO8601 format).`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of threads to return.`, + }, + ], + }, + { + name: 'discordbot_list_public_archived_threads', + description: `List all public archived threads in a channel. Returns threads in descending order of archive timestamp. Requires READ_MESSAGE_HISTORY permission.`, + params: [ + { + name: 'channel_id', + type: 'string', + required: true, + description: `The ID of the channel to list archived threads from.`, + }, + { + name: 'before', + type: 'string', + required: false, + description: `Returns threads archived before this timestamp (ISO8601 format).`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of threads to return.`, + }, + ], + }, + { + name: 'discordbot_list_sku_subscriptions', + description: `Retrieve all subscriptions containing a given SKU, filtered by user. Returns a list of subscription objects representing recurring payments for that SKU. With Bot Token auth, user_id is required since the bot has no implicit 'current user' context. Supports cursor-based pagination via before/after and limit.`, + params: [ + { + name: 'sku_id', + type: 'string', + required: true, + description: `The ID of the SKU to list subscriptions for.`, + }, + { + name: 'user_id', + type: 'string', + required: true, + description: `The ID of the user to return subscriptions for. Required for Bot Token requests.`, + }, + { + name: 'after', + type: 'string', + required: false, + description: `List subscriptions after this subscription ID (for pagination).`, + }, + { + name: 'before', + type: 'string', + required: false, + description: `List subscriptions before this subscription ID (for pagination).`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Number of results to return (1-100). Defaults to 50.`, + }, + ], + }, + { + name: 'discordbot_list_skus', + description: `Retrieve all SKUs (stock-keeping units) for a given Discord application. SKUs represent premium offerings, such as subscriptions, that can be made available to the application's users or guilds. Returns an array of SKU objects.`, + params: [ + { + name: 'application_id', + type: 'string', + required: true, + description: `The ID of the application to retrieve SKUs for.`, + }, + ], + }, + { + name: 'discordbot_list_thread_members', + description: `List all members of a thread. Returns an array of thread member objects. When with_member is true, results are paginated using after and limit.`, + params: [ + { + name: 'channel_id', + type: 'string', + required: true, + description: `The ID of the thread channel.`, + }, + { + name: 'after', + type: 'string', + required: false, + description: `Get thread members after this user ID (for pagination when with_member is true).`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of thread members to return (1-100, default 100).`, + }, + { + name: 'with_member', + type: 'boolean', + required: false, + description: `Whether to include guild member objects for each thread member.`, + }, + ], + }, + { + name: 'discordbot_list_threads', + description: `Retrieve archived public threads in a Discord channel. Returns threads in descending order by archive timestamp. Requires READ_MESSAGE_HISTORY permission. Note: Discord has no single endpoint that lists every thread type at once — this tool calls the same public-archived-threads endpoint as discordbot_list_public_archived_threads. Use discordbot_list_active_guild_threads for active (non-archived) threads across a guild, or discordbot_list_private_archived_threads for archived private threads.`, + params: [ + { + name: 'channel_id', + type: 'string', + required: true, + description: `The ID of the channel to retrieve archived threads from.`, + }, + { + name: 'before', + type: 'string', + required: false, + description: `Returns threads archived before this ISO8601 timestamp.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of threads to return.`, + }, + ], + }, + { + name: 'discordbot_list_voice_regions', + description: `Retrieve a list of all available voice regions on Discord. Returns region IDs, names, and whether they are optimal or deprecated.`, + params: [], + }, + { + name: 'discordbot_modify_application_emoji', + description: `Modify the name of an emoji owned by a Discord application. Returns the updated emoji object.`, + params: [ + { + name: 'application_id', + type: 'string', + required: true, + description: `The ID of the application that owns the emoji.`, + }, + { + name: 'emoji_id', + type: 'string', + required: true, + description: `The ID of the emoji to modify.`, + }, + { + name: 'name', + type: 'string', + required: true, + description: `New name for the emoji (2-32 characters, alphanumeric and underscores).`, + }, + ], + }, + { + name: 'discordbot_modify_auto_moderation_rule', + description: `Modify an existing Auto Moderation rule for a guild. Requires the MANAGE_GUILD permission. All parameters are optional. Fires an Auto Moderation Rule Update Gateway event. Returns the updated auto moderation rule object on success.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild the rule belongs to.`, + }, + { + name: 'rule_id', + type: 'string', + required: true, + description: `The ID of the Auto Moderation rule to modify.`, + }, + { + name: 'actions', + type: 'array', + required: false, + description: `The actions which will execute when the rule is triggered. Each action is an object with a 'type' (1=BLOCK_MESSAGE, 2=SEND_ALERT_MESSAGE, 3=TIMEOUT, 4=BLOCK_MEMBER_INTERACTION) and optional 'metadata'.`, + }, + { + name: 'enabled', + type: 'boolean', + required: false, + description: `Whether the rule is enabled.`, + }, + { + name: 'event_type', + type: 'integer', + required: false, + description: `The rule event type: 1=MESSAGE_SEND (when a member sends or edits a message), 2=MEMBER_UPDATE (when a member edits their profile).`, + }, + { + name: 'exempt_channels', + type: 'array', + required: false, + description: `Channel IDs that should not be affected by the rule (maximum of 50).`, + }, + { + name: 'exempt_roles', + type: 'array', + required: false, + description: `Role IDs that should not be affected by the rule (maximum of 20).`, + }, + { name: 'name', type: 'string', required: false, description: `The rule name.` }, + { + name: 'reason', + type: 'string', + required: false, + description: `Reason for modifying the rule, shown in the guild's audit log.`, + }, + { + name: 'trigger_metadata', + type: 'object', + required: false, + description: `Additional data used to determine whether the rule triggers, relevant fields depend on the rule's trigger_type (e.g. keyword_filter, regex_patterns, presets, allow_list, mention_total_limit, mention_raid_protection_enabled).`, + }, + ], + }, + { + name: 'discordbot_modify_channel', + description: `Modify a channel's settings. Supports text, voice, announcement, stage, and forum channels. Returns the updated channel object. Each permission_overwrites entry may specify 'allow_names'/'deny_names' (arrays of named permission flags) instead of raw 'allow'/'deny' integers — the correct bitfield is computed automatically.`, + params: [ + { + name: 'channel_id', + type: 'string', + required: true, + description: `The ID of the channel to modify.`, + }, + { + name: 'applied_tags', + type: 'array', + required: false, + description: `IDs of tags (from the forum/media channel's available_tags) applied to this thread. Only valid when modifying a thread in a forum or media channel; maximum of 5 tags.`, + }, + { + name: 'archived', + type: 'boolean', + required: false, + description: `Whether the thread is archived. Unarchiving with locked also false only requires the SEND_MESSAGES permission; otherwise requires MANAGE_THREADS.`, + }, + { + name: 'auto_archive_duration', + type: 'integer', + required: false, + description: `Duration in minutes of inactivity after which this thread auto-archives: 60, 1440, 4320, or 10080.`, + }, + { + name: 'available_tags', + type: 'array', + required: false, + description: `Array of tag objects available in a forum channel.`, + }, + { + name: 'bitrate', + type: 'integer', + required: false, + description: `Bitrate in bits for voice channels (8000-96000, or up to 128000 for VIP servers).`, + }, + { + name: 'default_auto_archive_duration', + type: 'integer', + required: false, + description: `Default duration (in minutes) for auto-archiving threads: 60, 1440, 4320, or 10080.`, + }, + { + name: 'default_forum_layout', + type: 'integer', + required: false, + description: `Default layout for forum channels. 0=NOT_SET, 1=LIST_VIEW, 2=GALLERY_VIEW.`, + }, + { + name: 'default_reaction_emoji', + type: 'object', + required: false, + description: `Default emoji for reactions in forum posts. Object with emoji_id or emoji_name.`, + }, + { + name: 'default_sort_order', + type: 'integer', + required: false, + description: `Default sort order for forum posts. 0=LATEST_ACTIVITY, 1=CREATION_DATE.`, + }, + { + name: 'default_thread_rate_limit_per_user', + type: 'integer', + required: false, + description: `Default slowmode rate limit (in seconds) for new threads in the channel.`, + }, + { + name: 'flags', + type: 'integer', + required: false, + description: `Channel flags as a bitfield.`, + }, + { + name: 'invitable', + type: 'boolean', + required: false, + description: `Whether non-moderators can add other non-moderators to a private thread. Only applies to private threads.`, + }, + { + name: 'locked', + type: 'boolean', + required: false, + description: `Whether the thread is locked. When locked, only users with the MANAGE_THREADS permission can unarchive it.`, + }, + { + name: 'name', + type: 'string', + required: false, + description: `New name for the channel (1-100 characters).`, + }, + { + name: 'nsfw', + type: 'boolean', + required: false, + description: `Whether the channel is NSFW (not safe for work).`, + }, + { + name: 'parent_id', + type: 'string', + required: false, + description: `ID of the new parent category for the channel.`, + }, + { + name: 'permission_overwrites', + type: 'array', + required: false, + description: `Array of permission overwrite objects for the channel.`, + }, + { + name: 'position', + type: 'integer', + required: false, + description: `Sorting position of the channel.`, + }, + { + name: 'rate_limit_per_user', + type: 'integer', + required: false, + description: `Slowmode rate limit in seconds (0-21600). Users can send one message per this many seconds.`, + }, + { + name: 'rtc_region', + type: 'string', + required: false, + description: `Voice region for voice/stage channels. null for automatic.`, + }, + { + name: 'topic', + type: 'string', + required: false, + description: `Channel topic (0-4096 characters for forum/media channels, 0-1024 for others).`, + }, + { + name: 'type', + type: 'integer', + required: false, + description: `Channel type. Can convert between text (0) and announcement (5) channels.`, + }, + { + name: 'user_limit', + type: 'integer', + required: false, + description: `Maximum number of users in a voice channel (0 for unlimited, 1-99).`, + }, + { + name: 'video_quality_mode', + type: 'integer', + required: false, + description: `Camera video quality mode for voice channels. 1=AUTO, 2=FULL.`, + }, + ], + }, + { + name: 'discordbot_modify_current_member', + description: `Modify the current user's guild member attributes. Returns the updated guild member object.`, + params: [ + { name: 'guild_id', type: 'string', required: true, description: `The ID of the guild.` }, + { + name: 'avatar', + type: 'string', + required: false, + description: `Avatar image to set for the current user in the guild, as a base64 data URI (null to reset).`, + }, + { + name: 'banner', + type: 'string', + required: false, + description: `Banner image to set for the current user in the guild, as a base64 data URI (null to reset).`, + }, + { + name: 'bio', + type: 'string', + required: false, + description: `Bio to set for the current user in the guild (null to reset).`, + }, + { + name: 'nick', + type: 'string', + required: false, + description: `Nickname to set for the current user in the guild (null to reset).`, + }, + ], + }, + { + name: 'discordbot_modify_current_user', + description: `Modify the bot's own username, avatar, or banner. Returns the updated user object.`, + params: [ + { + name: 'avatar', + type: 'string', + required: false, + description: `Base64 encoded image data URI for the user's avatar (or null to remove).`, + }, + { + name: 'banner', + type: 'string', + required: false, + description: `Base64 encoded image data URI for the user's banner (or null to remove).`, + }, + { + name: 'username', + type: 'string', + required: false, + description: `New username for the account (changing username may require a discriminator change).`, + }, + ], + }, + { + name: 'discordbot_modify_current_user_nick', + description: `Deprecated in favor of Modify Current Member. Modifies the nickname of the current user in a guild. Requires CHANGE_NICKNAME permission. Returns a 200 with the nickname on success.`, + params: [ + { name: 'guild_id', type: 'string', required: true, description: `The ID of the guild.` }, + { + name: 'nick', + type: 'string', + required: false, + description: `Value to set the current user's nickname to (null to reset).`, + }, + { + name: 'reason', + type: 'string', + required: false, + description: `Reason for changing the nickname, shown in the guild's audit log.`, + }, + ], + }, + { + name: 'discordbot_modify_current_user_voice_state', + description: `Update the current user's (the bot's) voice state in a stage channel. Returns 204 No Content on success. channel_id must currently point to a stage channel the bot has already joined. MUTE_MEMBERS permission is required to unsuppress; REQUEST_TO_SPEAK permission is required to request to speak, but the bot can always suppress itself or clear its own speak request.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to modify the current user's voice state in.`, + }, + { + name: 'channel_id', + type: 'string', + required: false, + description: `The ID of the stage channel the current user is currently in. Must currently point to a stage channel already joined.`, + }, + { + name: 'request_to_speak_timestamp', + type: 'string', + required: false, + description: `ISO8601 timestamp for when the current user requested to speak (any present or future time). Requires the REQUEST_TO_SPEAK permission; the bot can always clear its own request.`, + }, + { + name: 'suppress', + type: 'boolean', + required: false, + description: `Toggles the current user's suppress state. Requires the MUTE_MEMBERS permission to unsuppress; the bot can always suppress itself.`, + }, + ], + }, + { + name: 'discordbot_modify_guild', + description: `Modify a guild's settings. Requires MANAGE_GUILD permission. Returns the updated guild object.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to modify.`, + }, + { + name: 'afk_channel_id', + type: 'string', + required: false, + description: `ID of the AFK channel (null to remove).`, + }, + { + name: 'afk_timeout', + type: 'integer', + required: false, + description: `AFK timeout in seconds (60, 300, 900, 1800, 3600).`, + }, + { + name: 'banner', + type: 'string', + required: false, + description: `Base64 encoded guild banner image (requires BANNER feature).`, + }, + { + name: 'default_message_notifications', + type: 'integer', + required: false, + description: `Default message notification level: 0=ALL_MESSAGES, 1=ONLY_MENTIONS.`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `Guild description (for discoverable guilds).`, + }, + { + name: 'discovery_splash', + type: 'string', + required: false, + description: `Base64 encoded discovery splash image (requires DISCOVERABLE feature).`, + }, + { + name: 'explicit_content_filter', + type: 'integer', + required: false, + description: `Explicit content filter level: 0=DISABLED, 1=MEMBERS_WITHOUT_ROLES, 2=ALL_MEMBERS.`, + }, + { + name: 'features', + type: 'array', + required: false, + description: `Array of guild features to enable/disable.`, + }, + { + name: 'icon', + type: 'string', + required: false, + description: `Base64 encoded guild icon image.`, + }, + { + name: 'name', + type: 'string', + required: false, + description: `New name for the guild (2-100 characters).`, + }, + { + name: 'preferred_locale', + type: 'string', + required: false, + description: `Preferred locale for the guild (e.g., en-US, de).`, + }, + { + name: 'premium_progress_bar_enabled', + type: 'boolean', + required: false, + description: `Whether the guild has the premium progress bar enabled.`, + }, + { + name: 'public_updates_channel_id', + type: 'string', + required: false, + description: `ID of the channel where admins and moderators receive Discord updates.`, + }, + { + name: 'region', + type: 'string', + required: false, + description: `Voice region ID (deprecated).`, + }, + { + name: 'rules_channel_id', + type: 'string', + required: false, + description: `ID of the channel for community guilds' rules.`, + }, + { + name: 'safety_alerts_channel_id', + type: 'string', + required: false, + description: `ID of the channel where Discord sends safety alerts.`, + }, + { + name: 'splash', + type: 'string', + required: false, + description: `Base64 encoded guild splash image (requires INVITE_SPLASH feature).`, + }, + { + name: 'system_channel_flags', + type: 'integer', + required: false, + description: `System channel flags bitfield.`, + }, + { + name: 'system_channel_id', + type: 'string', + required: false, + description: `ID of the channel for system messages.`, + }, + { + name: 'verification_level', + type: 'integer', + required: false, + description: `Verification level: 0=NONE, 1=LOW, 2=MEDIUM, 3=HIGH, 4=VERY_HIGH.`, + }, + ], + }, + { + name: 'discordbot_modify_guild_channel_positions', + description: `Modify the positions of channels in a guild. Requires MANAGE_CHANNELS permission. Only channels to be modified need to be included. Returns 204 No Content on success.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to modify channel positions in.`, + }, + { + name: 'positions', + type: 'array', + required: true, + description: `Array of objects with channel id (required) and optional position, lock_permissions (boolean), and parent_id (string).`, + }, + ], + }, + { + name: 'discordbot_modify_guild_emoji', + description: `Modify a guild emoji. Requires MANAGE_GUILD_EXPRESSIONS permission. Returns the updated emoji object.`, + params: [ + { + name: 'emoji_id', + type: 'string', + required: true, + description: `The ID of the emoji to modify.`, + }, + { name: 'guild_id', type: 'string', required: true, description: `The ID of the guild.` }, + { name: 'name', type: 'string', required: false, description: `New name for the emoji.` }, + { + name: 'roles', + type: 'array', + required: false, + description: `Array of role IDs allowed to use the emoji (null to allow everyone).`, + }, + ], + }, + { + name: 'discordbot_modify_guild_incident_actions', + description: `Modify the incident actions of a guild, used to temporarily disable invites or direct messages during a raid or spam incident. Requires MANAGE_GUILD permission. Both fields can be enabled for a maximum of 24 hours in the future; supplying null disables the action. Returns the updated incidents data object.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to modify incident actions for.`, + }, + { + name: 'dms_disabled_until', + type: 'string', + required: false, + description: `ISO8601 timestamp until which direct messages will be disabled for the guild (max 24 hours in the future). Null disables the action.`, + }, + { + name: 'invites_disabled_until', + type: 'string', + required: false, + description: `ISO8601 timestamp until which invites will be disabled for the guild (max 24 hours in the future). Null disables the action.`, + }, + ], + }, + { + name: 'discordbot_modify_guild_member', + description: `Modify attributes of a guild member. Returns the updated guild member object.`, + params: [ + { name: 'guild_id', type: 'string', required: true, description: `The ID of the guild.` }, + { + name: 'user_id', + type: 'string', + required: true, + description: `The ID of the guild member to modify.`, + }, + { + name: 'channel_id', + type: 'string', + required: false, + description: `Move member to a different voice channel (null to disconnect).`, + }, + { + name: 'communication_disabled_until', + type: 'string', + required: false, + description: `ISO8601 timestamp until which the member is timed out (null to remove timeout).`, + }, + { + name: 'deaf', + type: 'boolean', + required: false, + description: `Whether the member should be server-deafened.`, + }, + { + name: 'flags', + type: 'integer', + required: false, + description: `Guild member flags as a bitfield.`, + }, + { + name: 'mute', + type: 'boolean', + required: false, + description: `Whether the member should be server-muted.`, + }, + { + name: 'nick', + type: 'string', + required: false, + description: `Nickname to set for the member (null to reset).`, + }, + { + name: 'roles', + type: 'array', + required: false, + description: `Array of role IDs to assign to the member.`, + }, + ], + }, + { + name: 'discordbot_modify_guild_onboarding', + description: `Modify the onboarding configuration of a guild. Requires MANAGE_GUILD and MANAGE_ROLES permissions. Onboarding enforces constraints when enabled: at least 7 default channels, at least 5 of which allow sending messages to @everyone. Returns the updated guild onboarding object.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to modify onboarding for.`, + }, + { + name: 'default_channel_ids', + type: 'array', + required: false, + description: `Channel IDs that members get opted into automatically.`, + }, + { + name: 'enabled', + type: 'boolean', + required: false, + description: `Whether onboarding is enabled in the guild.`, + }, + { + name: 'mode', + type: 'integer', + required: false, + description: `The onboarding mode: 0 for ONBOARDING_DEFAULT (counts only default channels), 1 for ONBOARDING_ADVANCED (counts default channels and questions).`, + }, + { + name: 'prompts', + type: 'array', + required: false, + description: `Prompts shown during onboarding and in customize community. Each prompt object has id, type, options, title, single_select, required, and in_onboarding fields.`, + }, + { + name: 'reason', + type: 'string', + required: false, + description: `Reason for modifying onboarding, shown in the guild's audit log.`, + }, + ], + }, + { + name: 'discordbot_modify_guild_role', + description: `Modify a guild role's settings. Requires MANAGE_ROLES permission. Returns the updated role object. Full permission flag reference (name=decimal value, OR multiple together): CREATE_INSTANT_INVITE=1, KICK_MEMBERS=2, BAN_MEMBERS=4, ADMINISTRATOR=8, MANAGE_CHANNELS=16, MANAGE_GUILD=32, ADD_REACTIONS=64, VIEW_AUDIT_LOG=128, PRIORITY_SPEAKER=256, STREAM=512, VIEW_CHANNEL=1024, SEND_MESSAGES=2048, SEND_TTS_MESSAGES=4096, MANAGE_MESSAGES=8192, EMBED_LINKS=16384, ATTACH_FILES=32768, READ_MESSAGE_HISTORY=65536, MENTION_EVERYONE=131072, USE_EXTERNAL_EMOJIS=262144, VIEW_GUILD_INSIGHTS=524288, CONNECT=1048576, SPEAK=2097152, MUTE_MEMBERS=4194304, DEAFEN_MEMBERS=8388608, MOVE_MEMBERS=16777216, USE_VAD=33554432, CHANGE_NICKNAME=67108864, MANAGE_NICKNAMES=134217728, MANAGE_ROLES=268435456, MANAGE_WEBHOOKS=536870912, MANAGE_GUILD_EXPRESSIONS=1073741824, USE_APPLICATION_COMMANDS=2147483648, REQUEST_TO_SPEAK=4294967296, MANAGE_EVENTS=8589934592, MANAGE_THREADS=17179869184, CREATE_PUBLIC_THREADS=34359738368, CREATE_PRIVATE_THREADS=68719476736, USE_EXTERNAL_STICKERS=137438953472, SEND_MESSAGES_IN_THREADS=274877906944, USE_EMBEDDED_ACTIVITIES=549755813888, MODERATE_MEMBERS=1099511627776, VIEW_CREATOR_MONETIZATION_ANALYTICS=2199023255552, USE_SOUNDBOARD=4398046511104, CREATE_GUILD_EXPRESSIONS=8796093022208, CREATE_EVENTS=17592186044416, USE_EXTERNAL_SOUNDS=35184372088832, SEND_VOICE_MESSAGES=70368744177664, SET_VOICE_CHANNEL_STATUS=281474976710656, SEND_POLLS=562949953421312, USE_EXTERNAL_APPS=1125899906842624, PIN_MESSAGES=2251799813685248, BYPASS_SLOWMODE=4503599627370496. Or use a calculator like discordapi.com/permissions.htm. Optionally provide 'permissions_names' (array of named permission flags, e.g. ["SEND_MESSAGES"]) instead of a raw 'permissions' integer — the correct bitfield is computed automatically.`, + params: [ + { name: 'guild_id', type: 'string', required: true, description: `The ID of the guild.` }, + { + name: 'role_id', + type: 'string', + required: true, + description: `The ID of the role to modify.`, + }, + { + name: 'color', + type: 'integer', + required: false, + description: `Deprecated. RGB color value of the role as an integer. Still returned by the API, but using 'colors' is recommended when making requests.`, + }, + { + name: 'colors', + type: 'object', + required: false, + description: `The role's colors object (recommended replacement for the deprecated 'color' field). Contains primary_color, and optionally secondary_color and tertiary_color for gradient/holographic roles.`, + }, + { + name: 'hoist', + type: 'boolean', + required: false, + description: `Whether the role should be displayed separately in the member list.`, + }, + { + name: 'icon', + type: 'string', + required: false, + description: `Base64 encoded role icon image (requires ROLE_ICONS guild feature).`, + }, + { + name: 'mentionable', + type: 'boolean', + required: false, + description: `Whether the role should be mentionable by everyone.`, + }, + { name: 'name', type: 'string', required: false, description: `New name for the role.` }, + { + name: 'permissions', + type: 'string', + required: false, + description: `Bitwise permission value for the role as a string.`, + }, + { + name: 'permissions_names', + type: 'array', + required: false, + description: `Named permission flags to OR together, as a more reliable alternative to specifying 'permissions' as a raw bitwise integer string — no manual bit math required. If both 'permissions_names' and 'permissions' are given, 'permissions_names' takes precedence.`, + }, + { + name: 'unicode_emoji', + type: 'string', + required: false, + description: `Role's unicode emoji (requires ROLE_ICONS guild feature).`, + }, + ], + }, + { + name: 'discordbot_modify_guild_role_positions', + description: `Modify the positions of roles in a guild. Requires MANAGE_ROLES permission. Returns a list of all guild role objects.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to modify role positions in.`, + }, + { + name: 'positions', + type: 'array', + required: true, + description: `Array of objects with role id (required) and optional position (integer).`, + }, + ], + }, + { + name: 'discordbot_modify_guild_scheduled_event', + description: `Modify a guild scheduled event. Requires MANAGE_EVENTS permission. To start or end an event, modify the status field. Returns the modified scheduled event object.`, + params: [ + { name: 'guild_id', type: 'string', required: true, description: `The ID of the guild.` }, + { + name: 'guild_scheduled_event_id', + type: 'string', + required: true, + description: `The ID of the scheduled event to modify.`, + }, + { + name: 'channel_id', + type: 'string', + required: false, + description: `Channel ID of the event (required for STAGE_INSTANCE and VOICE entity types).`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `Description of the event (up to 1000 characters).`, + }, + { + name: 'entity_metadata', + type: 'object', + required: false, + description: `Entity metadata for the event. For EXTERNAL type, include location string.`, + }, + { + name: 'entity_type', + type: 'integer', + required: false, + description: `Entity type: 1=STAGE_INSTANCE, 2=VOICE, 3=EXTERNAL.`, + }, + { + name: 'image', + type: 'string', + required: false, + description: `Base64 encoded cover image for the event.`, + }, + { + name: 'name', + type: 'string', + required: false, + description: `Name of the scheduled event (1-100 characters).`, + }, + { + name: 'privacy_level', + type: 'integer', + required: false, + description: `Privacy level: 2=GUILD_ONLY.`, + }, + { + name: 'recurrence_rule', + type: 'object', + required: false, + description: `Recurrence rule object for repeating events. Set to null to clear an existing recurrence rule.`, + }, + { + name: 'scheduled_end_time', + type: 'string', + required: false, + description: `ISO8601 timestamp for when the event ends.`, + }, + { + name: 'scheduled_start_time', + type: 'string', + required: false, + description: `ISO8601 timestamp for when the event starts.`, + }, + { + name: 'status', + type: 'integer', + required: false, + description: `Event status: 1=SCHEDULED, 2=ACTIVE, 3=COMPLETED, 4=CANCELED.`, + }, + ], + }, + { + name: 'discordbot_modify_guild_soundboard_sound', + description: `Modify the given guild soundboard sound. For sounds created by the current user, requires either the CREATE_GUILD_EXPRESSIONS or MANAGE_GUILD_EXPRESSIONS permission. For other sounds, requires the MANAGE_GUILD_EXPRESSIONS permission. All parameters are optional. Fires a Guild Soundboard Sound Update Gateway event. Returns the updated soundboard sound object on success.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild the soundboard sound belongs to.`, + }, + { + name: 'sound_id', + type: 'string', + required: true, + description: `The ID of the soundboard sound to modify.`, + }, + { + name: 'emoji_id', + type: 'string', + required: false, + description: `The ID of the custom emoji for the soundboard sound.`, + }, + { + name: 'emoji_name', + type: 'string', + required: false, + description: `The unicode character of a standard emoji for the soundboard sound.`, + }, + { + name: 'name', + type: 'string', + required: false, + description: `New name for the soundboard sound (2-32 characters).`, + }, + { + name: 'reason', + type: 'string', + required: false, + description: `Reason for modifying the sound, shown in the guild's audit log.`, + }, + { + name: 'volume', + type: 'number', + required: false, + description: `The volume of the soundboard sound, from 0 to 1.`, + }, + ], + }, + { + name: 'discordbot_modify_guild_sticker', + description: `Modify a guild sticker's details. Requires MANAGE_GUILD_EXPRESSIONS permission. Returns the updated sticker object.`, + params: [ + { name: 'guild_id', type: 'string', required: true, description: `The ID of the guild.` }, + { + name: 'sticker_id', + type: 'string', + required: true, + description: `The ID of the sticker to modify.`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `New description for the sticker (2-100 characters).`, + }, + { + name: 'name', + type: 'string', + required: false, + description: `New name for the sticker (2-30 characters).`, + }, + { + name: 'tags', + type: 'string', + required: false, + description: `New autocomplete tags for the sticker (max 200 characters).`, + }, + ], + }, + { + name: 'discordbot_modify_guild_template', + description: `Modify a guild template's metadata. Requires the MANAGE_GUILD permission. Returns the guild template object on success.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild the template belongs to.`, + }, + { + name: 'template_code', + type: 'string', + required: true, + description: `The template code to modify.`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `New description for the template (0-120 characters).`, + }, + { + name: 'name', + type: 'string', + required: false, + description: `New name for the template (1-100 characters).`, + }, + ], + }, + { + name: 'discordbot_modify_guild_welcome_screen', + description: `Modify the welcome screen of a Community guild. Requires MANAGE_GUILD permission. Returns the updated welcome screen object.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to modify the welcome screen for.`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `The server description shown in the welcome screen.`, + }, + { + name: 'enabled', + type: 'boolean', + required: false, + description: `Whether the welcome screen is enabled.`, + }, + { + name: 'welcome_channels', + type: 'array', + required: false, + description: `Array of welcome channel objects with channel_id, description, and optional emoji_id/emoji_name.`, + }, + ], + }, + { + name: 'discordbot_modify_guild_widget', + description: `Modify the widget settings for a guild. Requires MANAGE_GUILD permission. Returns the updated guild widget settings object.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to modify the widget for.`, + }, + { + name: 'channel_id', + type: 'string', + required: false, + description: `The channel ID to generate an invite for the widget. Set to null to disable.`, + }, + { + name: 'enabled', + type: 'boolean', + required: false, + description: `Whether the widget is enabled.`, + }, + ], + }, + { + name: 'discordbot_modify_lobby', + description: `Modify a Discord lobby with new values, if provided. When members is provided, it replaces the full member list — any current member not included is removed from the lobby. Returns the updated lobby object.`, + params: [ + { + name: 'lobby_id', + type: 'string', + required: true, + description: `The ID of the lobby to modify.`, + }, + { + name: 'idle_timeout_seconds', + type: 'integer', + required: false, + description: `Seconds to wait before shutting down the lobby after it becomes idle. Between 5 and 604800 (7 days).`, + }, + { + name: 'members', + type: 'array', + required: false, + description: `Optional array of up to 25 lobby member objects to replace the lobby members with. Members not included in this list are removed from the lobby.`, + }, + { + name: 'metadata', + type: 'object', + required: false, + description: `Optional dictionary of string key/value pairs. Max total length 1000. Overwrites any existing metadata.`, + }, + ], + }, + { + name: 'discordbot_modify_stage_instance', + description: `Update fields of an existing Stage instance. Requires the user to be a moderator of the Stage channel (MANAGE_CHANNELS, MUTE_MEMBERS, and MOVE_MEMBERS permissions). Fires a Stage Instance Update Gateway event. Returns the updated Stage instance object.`, + params: [ + { + name: 'channel_id', + type: 'string', + required: true, + description: `The ID of the Stage channel whose Stage instance should be updated.`, + }, + { + name: 'privacy_level', + type: 'integer', + required: false, + description: `The privacy level of the Stage instance: 1=PUBLIC (deprecated), 2=GUILD_ONLY.`, + }, + { + name: 'reason', + type: 'string', + required: false, + description: `Reason for updating the Stage instance, shown in the guild's audit log.`, + }, + { + name: 'topic', + type: 'string', + required: false, + description: `The new topic of the Stage instance (1-120 characters).`, + }, + ], + }, + { + name: 'discordbot_modify_user_voice_state', + description: `Update another user's voice state in a stage channel. Returns 204 No Content on success. channel_id must currently point to a stage channel the user has already joined. Requires the MUTE_MEMBERS permission. When unsuppressed, non-bot users have their request_to_speak_timestamp set to the current time; bot users do not. When suppressed, the user's request_to_speak_timestamp is removed.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to modify the user's voice state in.`, + }, + { + name: 'user_id', + type: 'string', + required: true, + description: `The ID of the user whose voice state to modify.`, + }, + { + name: 'channel_id', + type: 'string', + required: false, + description: `The ID of the stage channel the user is currently in. Must currently point to a stage channel already joined.`, + }, + { + name: 'suppress', + type: 'boolean', + required: false, + description: `Toggles the user's suppress state. Requires the MUTE_MEMBERS permission.`, + }, + ], + }, + { + name: 'discordbot_modify_webhook', + description: `Modify a webhook. Requires MANAGE_WEBHOOKS permission. Returns the updated webhook object.`, + params: [ + { + name: 'webhook_id', + type: 'string', + required: true, + description: `The ID of the webhook to modify.`, + }, + { + name: 'avatar', + type: 'string', + required: false, + description: `Base64 encoded avatar image for the webhook.`, + }, + { + name: 'channel_id', + type: 'string', + required: false, + description: `ID of the channel to move the webhook to.`, + }, + { + name: 'name', + type: 'string', + required: false, + description: `New default name for the webhook.`, + }, + ], + }, + { + name: 'discordbot_modify_webhook_with_token', + description: `Modify a webhook using its token instead of OAuth authentication. Does not support channel_id field. Returns the updated webhook object (without token).`, + params: [ + { + name: 'webhook_id', + type: 'string', + required: true, + description: `The ID of the webhook to modify.`, + }, + { + name: 'webhook_token', + type: 'string', + required: true, + description: `The token of the webhook.`, + }, + { + name: 'avatar', + type: 'string', + required: false, + description: `Base64 encoded avatar image for the webhook.`, + }, + { + name: 'name', + type: 'string', + required: false, + description: `New default name for the webhook.`, + }, + ], + }, + { + name: 'discordbot_pin_message', + description: `Pin a message in a Discord channel using Discord's current pins endpoint (introduced June 2025, replacing the deprecated /channels/{channel.id}/pins/{message.id}). Requires PIN_MESSAGES permission. A channel can have up to 50 pinned messages.`, + params: [ + { + name: 'channel_id', + type: 'string', + required: true, + description: `The ID of the channel containing the message to pin.`, + }, + { + name: 'message_id', + type: 'string', + required: true, + description: `The ID of the message to pin.`, + }, + ], + }, + { + name: 'discordbot_remove_guild_ban', + description: `Remove a ban for a user in a Discord guild, allowing them to rejoin. Requires BAN_MEMBERS permission.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to remove the ban from.`, + }, + { + name: 'user_id', + type: 'string', + required: true, + description: `The ID of the user to unban.`, + }, + ], + }, + { + name: 'discordbot_remove_guild_member_role', + description: `Remove a role from a guild member. Requires MANAGE_ROLES permission. Returns 204 No Content on success.`, + params: [ + { name: 'guild_id', type: 'string', required: true, description: `The ID of the guild.` }, + { + name: 'role_id', + type: 'string', + required: true, + description: `The ID of the role to remove from the member.`, + }, + { + name: 'user_id', + type: 'string', + required: true, + description: `The ID of the guild member to remove the role from.`, + }, + ], + }, + { + name: 'discordbot_remove_lobby_member', + description: `Remove the specified user from a Discord lobby. Safe to call even if the user is no longer a member of the lobby, but fails if the lobby does not exist. Returns nothing.`, + params: [ + { + name: 'lobby_id', + type: 'string', + required: true, + description: `The ID of the lobby to remove the member from.`, + }, + { + name: 'user_id', + type: 'string', + required: true, + description: `The ID of the user to remove from the lobby.`, + }, + ], + }, + { + name: 'discordbot_remove_thread_member', + description: `Remove a user from a thread. Requires MANAGE_THREADS permission or that the current user is the creator of the thread. Returns 204 No Content on success.`, + params: [ + { + name: 'channel_id', + type: 'string', + required: true, + description: `The ID of the thread channel.`, + }, + { + name: 'user_id', + type: 'string', + required: true, + description: `The ID of the user to remove from the thread.`, + }, + ], + }, + { + name: 'discordbot_search_guild_members', + description: `Search for guild members in a Discord guild whose username or nickname starts with the given query string.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to search members in.`, + }, + { + name: 'query', + type: 'string', + required: true, + description: `Query string to match against usernames and nicknames. Returns members whose username or nickname starts with this string.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of members to return (1-1000). Default is 1.`, + }, + ], + }, + { + name: 'discordbot_search_guild_messages', + description: `Search for messages matching a query across a Discord guild. Returns matching messages without the reactions key. Requires the READ_MESSAGE_HISTORY permission and access is restricted according to whether the MESSAGE_CONTENT privileged intent is enabled for the application. If the searched entity is not yet indexed, Discord returns a 202 response instead of results.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild to search messages in.`, + }, + { + name: 'attachment_extension', + type: 'array', + required: false, + description: `Filter messages by attachment extension, e.g. txt (max 256 characters per entry, max 100 entries).`, + }, + { + name: 'attachment_filename', + type: 'array', + required: false, + description: `Filter messages by attachment filename (max 1024 characters per entry, max 100 entries).`, + }, + { + name: 'author_id', + type: 'array', + required: false, + description: `Filter messages by these author user IDs (max 100).`, + }, + { + name: 'author_type', + type: 'array', + required: false, + description: `Filter messages by author type. Prefix a value with - to negate it, e.g. -bot.`, + }, + { + name: 'channel_id', + type: 'array', + required: false, + description: `Filter messages by these channel IDs (max 500).`, + }, + { + name: 'content', + type: 'string', + required: false, + description: `Filter messages by content (max 1024 characters).`, + }, + { + name: 'embed_provider', + type: 'array', + required: false, + description: `Filter messages by embed provider name, case-sensitive, e.g. Tenor (max 256 characters per entry, max 100 entries).`, + }, + { + name: 'embed_type', + type: 'array', + required: false, + description: `Filter messages by embed type (max 5 entries).`, + }, + { + name: 'has', + type: 'array', + required: false, + description: `Filter messages by whether they have specific things. Prefix a value with - to negate it, e.g. -embed.`, + }, + { + name: 'include_nsfw', + type: 'boolean', + required: false, + description: `Whether to include results from age-restricted channels. Defaults to false.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Max number of messages to return (1-25). Default is 25.`, + }, + { + name: 'link_hostname', + type: 'array', + required: false, + description: `Filter messages by link hostname, e.g. discordapp.com (max 256 characters per entry, max 100 entries).`, + }, + { + name: 'max_id', + type: 'string', + required: false, + description: `Get messages before this message ID.`, + }, + { + name: 'mention_everyone', + type: 'boolean', + required: false, + description: `Filter messages by whether they do or do not mention @everyone.`, + }, + { + name: 'mentions', + type: 'array', + required: false, + description: `Filter messages that mention these user IDs (max 100).`, + }, + { + name: 'mentions_role_id', + type: 'array', + required: false, + description: `Filter messages that mention these role IDs (max 100).`, + }, + { + name: 'min_id', + type: 'string', + required: false, + description: `Get messages after this message ID.`, + }, + { + name: 'offset', + type: 'integer', + required: false, + description: `Number to offset the returned messages by (max 9975).`, + }, + { + name: 'pinned', + type: 'boolean', + required: false, + description: `Filter messages by whether they are or are not pinned.`, + }, + { + name: 'replied_to_message_id', + type: 'array', + required: false, + description: `Filter messages that reply to these message IDs (max 100).`, + }, + { + name: 'replied_to_user_id', + type: 'array', + required: false, + description: `Filter messages that reply to these user IDs (max 100).`, + }, + { + name: 'slop', + type: 'integer', + required: false, + description: `Max number of words to skip between matching tokens in the search content (max 100, default 2).`, + }, + { + name: 'sort_by', + type: 'string', + required: false, + description: `The sorting algorithm to use: timestamp (default) or relevance. Sort order is not respected when sorting by relevance.`, + }, + { + name: 'sort_order', + type: 'string', + required: false, + description: `The direction to sort: asc or desc. Defaults to desc.`, + }, + ], + }, + { + name: 'discordbot_send_lobby_message', + description: `Send a message to a Discord lobby. The calling user must be a member of the lobby. If the lobby has a linked channel, the message is also forwarded there; if forwarding fails (for example due to AutoMod), the lobby message is still delivered to other lobby members. Returns the created lobby message object.`, + params: [ + { + name: 'content', + type: 'string', + required: true, + description: `Message content. Must be non-empty.`, + }, + { + name: 'lobby_id', + type: 'string', + required: true, + description: `The ID of the lobby to send the message to.`, + }, + { + name: 'flags', + type: 'integer', + required: false, + description: `Optional message flags combined as a bitfield. Only flags creatable by the Social SDK are accepted.`, + }, + { + name: 'metadata', + type: 'object', + required: false, + description: `Optional dictionary of string key/value pairs delivered alongside the message to active clients via the Social SDK. Not persisted on the linked channel message.`, + }, + ], + }, + { + name: 'discordbot_send_soundboard_sound', + description: `Send a soundboard sound to a voice channel the user is connected to. Requires the SPEAK and USE_SOUNDBOARD permissions, and also USE_EXTERNAL_SOUNDS if the sound is from a different guild. The user must be connected to the voice channel with a voice state that has deaf, self_deaf, mute, and suppress all disabled. Fires a Voice Channel Effect Send Gateway event. Returns 204 No Content on success.`, + params: [ + { + name: 'channel_id', + type: 'string', + required: true, + description: `The ID of the voice channel to send the soundboard sound to.`, + }, + { + name: 'sound_id', + type: 'string', + required: true, + description: `The ID of the soundboard sound to play.`, + }, + { + name: 'source_guild_id', + type: 'string', + required: false, + description: `The ID of the guild the soundboard sound is from. Required to play sounds from a different guild than the voice channel's guild.`, + }, + ], + }, + { + name: 'discordbot_set_voice_channel_status', + description: `Set a voice channel's status. Requires the SET_VOICE_CHANNEL_STATUS permission, and additionally the MANAGE_CHANNELS permission if the current user is not connected to the voice channel. Returns 204 No Content on success. Fires a Voice Channel Status Update Gateway event.`, + params: [ + { + name: 'channel_id', + type: 'string', + required: true, + description: `The ID of the voice channel to set the status for.`, + }, + { + name: 'status', + type: 'string', + required: true, + description: `The new voice channel status, up to 500 characters. Pass null to clear the current status.`, + }, + ], + }, + { + name: 'discordbot_start_thread_from_message', + description: `Create a new thread from an existing message in a channel. The thread is a public thread by default. Requires CREATE_PUBLIC_THREADS permission. Returns the new thread channel object.`, + params: [ + { + name: 'channel_id', + type: 'string', + required: true, + description: `The ID of the channel containing the message.`, + }, + { + name: 'message_id', + type: 'string', + required: true, + description: `The ID of the message to create the thread from.`, + }, + { + name: 'name', + type: 'string', + required: true, + description: `The name of the thread (1-100 characters).`, + }, + { + name: 'auto_archive_duration', + type: 'integer', + required: false, + description: `Duration in minutes to auto-archive the thread: 60, 1440, 4320, or 10080.`, + }, + { + name: 'rate_limit_per_user', + type: 'integer', + required: false, + description: `Slowmode rate limit in seconds for thread members (0-21600).`, + }, + ], + }, + { + name: 'discordbot_start_thread_in_forum_channel', + description: `Create a new post (thread) in a forum or media channel, along with its first message. At least one of content, embeds, or sticker_ids must be provided for the message. The current user must have the SEND_MESSAGES permission. Returns the new thread channel object with a nested message object.`, + params: [ + { + name: 'channel_id', + type: 'string', + required: true, + description: `The ID of the forum or media channel to post in.`, + }, + { + name: 'name', + type: 'string', + required: true, + description: `The name of the post/thread (1-100 characters).`, + }, + { + name: 'allowed_mentions', + type: 'object', + required: false, + description: `Controls which mentions are allowed in the first message. Example: {"parse": ["users", "roles"]}`, + }, + { + name: 'applied_tags', + type: 'array', + required: false, + description: `IDs of the available_tags to apply to this post (forum/media channel tags).`, + }, + { + name: 'auto_archive_duration', + type: 'integer', + required: false, + description: `Duration in minutes to auto-archive the thread: 60, 1440, 4320, or 10080.`, + }, + { + name: 'content', + type: 'string', + required: false, + description: `The text content of the first message (up to 2000 characters).`, + }, + { + name: 'embeds', + type: 'array', + required: false, + description: `Array of embed objects to attach to the first message (up to 10 embeds).`, + }, + { + name: 'rate_limit_per_user', + type: 'integer', + required: false, + description: `Slowmode rate limit in seconds for the thread (0-21600).`, + }, + { + name: 'sticker_ids', + type: 'array', + required: false, + description: `Array of sticker IDs to attach to the first message (up to 3 stickers).`, + }, + ], + }, + { + name: 'discordbot_start_thread_without_message', + description: `Create a new thread that is not attached to an existing message. Type 10=ANNOUNCEMENT_THREAD (in announcement channel), 11=PUBLIC_THREAD, 12=PRIVATE_THREAD. Returns the new thread channel object.`, + params: [ + { + name: 'channel_id', + type: 'string', + required: true, + description: `The ID of the channel to create the thread in.`, + }, + { + name: 'name', + type: 'string', + required: true, + description: `The name of the thread (1-100 characters).`, + }, + { + name: 'type', + type: 'integer', + required: true, + description: `The type of thread. 10=ANNOUNCEMENT_THREAD, 11=PUBLIC_THREAD, 12=PRIVATE_THREAD.`, + }, + { + name: 'auto_archive_duration', + type: 'integer', + required: false, + description: `Duration in minutes to auto-archive the thread: 60, 1440, 4320, or 10080.`, + }, + { + name: 'invitable', + type: 'boolean', + required: false, + description: `Whether non-moderators can add other users to the private thread.`, + }, + { + name: 'rate_limit_per_user', + type: 'integer', + required: false, + description: `Slowmode rate limit in seconds for thread members (0-21600).`, + }, + ], + }, + { + name: 'discordbot_sync_guild_template', + description: `Sync a template to the guild's current state. Requires the MANAGE_GUILD permission. Returns the guild template object on success.`, + params: [ + { + name: 'guild_id', + type: 'string', + required: true, + description: `The ID of the guild the template belongs to.`, + }, + { + name: 'template_code', + type: 'string', + required: true, + description: `The template code to sync.`, + }, + ], + }, + { + name: 'discordbot_trigger_typing', + description: `Post a typing indicator to a Discord channel. The typing indicator lasts for 10 seconds or until a message is sent. Useful for indicating that a bot is processing a request.`, + params: [ + { + name: 'channel_id', + type: 'string', + required: true, + description: `The ID of the channel to show the typing indicator in.`, + }, + ], + }, + { + name: 'discordbot_unpin_message', + description: `Unpin a previously pinned message from a Discord channel using Discord's current pins endpoint (introduced June 2025, replacing the deprecated /channels/{channel.id}/pins/{message.id}). Requires PIN_MESSAGES permission.`, + params: [ + { + name: 'channel_id', + type: 'string', + required: true, + description: `The ID of the channel containing the pinned message.`, + }, + { + name: 'message_id', + type: 'string', + required: true, + description: `The ID of the message to unpin.`, + }, + ], + }, + { + name: 'discordbot_update_application_role_connection_metadata', + description: `Update and return the list of application role connection metadata records for an application. Takes a full list of metadata objects to replace the existing ones; any records not included are removed. An application can have a maximum of 5 metadata records.`, + params: [ + { + name: 'application_id', + type: 'string', + required: true, + description: `The ID of the application.`, + }, + { + name: 'records', + type: 'array', + required: true, + description: `Full list of application role connection metadata objects (max 5) to replace the existing records. Each object requires type, key, name, and description; name_localizations and description_localizations are optional.`, + }, + ], + }, + { + name: 'discordbot_update_lobby_message_moderation_metadata', + description: `Set the moderation metadata for a lobby message. The metadata is app-scoped and delivered to active game clients via the Social SDK as a realtime message update. Uses a Bot token for authorization. Returns HTTP 204 No Content on success.`, + params: [ + { + name: 'lobby_id', + type: 'string', + required: true, + description: `The ID of the lobby the message belongs to.`, + }, + { + name: 'message_id', + type: 'string', + required: true, + description: `The ID of the lobby message to set moderation metadata on.`, + }, + { + name: 'moderation_metadata', + type: 'object', + required: true, + description: `Free-form key/value pairs describing the moderation decision. Up to 5 keys; key length up to 1024 characters; value length up to 2000 characters. This object is sent as the entire request body.`, + }, + ], + }, +] diff --git a/src/data/agent-connectors/mixpanelanalytics.ts b/src/data/agent-connectors/mixpanelanalytics.ts new file mode 100644 index 000000000..ba0a772e8 --- /dev/null +++ b/src/data/agent-connectors/mixpanelanalytics.ts @@ -0,0 +1,1540 @@ +import type { Tool } from '../../types/agent-connectors' + +export const tools: Tool[] = [ + { + name: 'mixpanelanalytics_activity_stream', + description: `Get the raw event stream (activity feed) for one or more specific users over a date range — every event each user did, in order. Useful for inspecting an individual user's journey rather than aggregate analytics. Rate limited to 60 queries/hour and 5 concurrent queries.`, + params: [ + { + name: 'distinct_ids', + type: 'array', + required: true, + description: `The user distinct_ids to fetch activity for, as a JSON array of strings.`, + }, + { + name: 'from_date', + type: 'string', + required: true, + description: `Start date of the query range, in yyyy-mm-dd format (inclusive).`, + }, + { + name: 'project_id', + type: 'integer', + required: true, + description: `Your Mixpanel numeric Project ID (Project Settings > Overview). Required when authenticating with a Service Account; not needed with a legacy Project Secret.`, + }, + { + name: 'to_date', + type: 'string', + required: true, + description: `End date of the query range, in yyyy-mm-dd format (inclusive).`, + }, + { + name: 'workspace_id', + type: 'integer', + required: false, + description: `The numeric ID of the Mixpanel workspace to query, for projects with multiple workspaces. Omit to use the project's default workspace.`, + }, + ], + }, + { + name: 'mixpanelanalytics_cohorts_list', + description: `List every saved cohort in a Mixpanel project, including each cohort's numeric id, name, member count, description, and creation date. Use the id with 'mixpanelanalytics_profiles_query' (filter_by_cohort) to fetch the profiles in a cohort.`, + params: [ + { + name: 'project_id', + type: 'integer', + required: true, + description: `Your Mixpanel numeric Project ID (Project Settings > Overview). Required when authenticating with a Service Account; not needed with a legacy Project Secret.`, + }, + { + name: 'workspace_id', + type: 'integer', + required: false, + description: `The numeric ID of the Mixpanel workspace to query, for projects with multiple workspaces. Omit to use the project's default workspace.`, + }, + ], + }, + { + name: 'mixpanelanalytics_event_properties', + description: `Get a time series broken down by the values of a single event property, e.g. purchase count per day segmented by product_category. Similar to segmentation, but focused on exploring one property's values rather than an arbitrary 'on' expression.`, + params: [ + { + name: 'event', + type: 'string', + required: true, + description: `The single event name to get data for, e.g. "purchase". Not an array.`, + }, + { + name: 'name', + type: 'string', + required: true, + description: `The name of the event property to analyze, e.g. "product_category".`, + }, + { + name: 'project_id', + type: 'integer', + required: true, + description: `Your Mixpanel numeric Project ID (Project Settings > Overview). Required when authenticating with a Service Account; not needed with a legacy Project Secret.`, + }, + { + name: 'type', + type: 'string', + required: true, + description: `The analysis type: 'general' for total count, 'unique' for distinct user count, or 'average' for count per unique user.`, + }, + { + name: 'unit', + type: 'string', + required: true, + description: `The time bucket granularity: 'minute', 'hour', 'day', 'week', or 'month'.`, + }, + { + name: 'from_date', + type: 'string', + required: false, + description: `Start date of the query range, in yyyy-mm-dd format (inclusive). Required unless 'interval' is set.`, + }, + { + name: 'interval', + type: 'integer', + required: false, + description: `Number of time units (see 'unit') to return, counting back from now. Alternative to 'from_date'/'to_date'.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of property values to return.`, + }, + { + name: 'to_date', + type: 'string', + required: false, + description: `End date of the query range, in yyyy-mm-dd format (inclusive). Required unless 'interval' is set.`, + }, + { + name: 'values', + type: 'array', + required: false, + description: `A specific list of property values to return data for, as a JSON array. Omit to return the top values automatically.`, + }, + { + name: 'workspace_id', + type: 'integer', + required: false, + description: `The numeric ID of the Mixpanel workspace to query, for projects with multiple workspaces. Omit to use the project's default workspace.`, + }, + ], + }, + { + name: 'mixpanelanalytics_event_top_properties', + description: `List the property names most commonly sent with a given event, along with how many times each appears. Useful for discovering what properties are available before writing a segmentation query or property-values lookup.`, + params: [ + { + name: 'event', + type: 'string', + required: true, + description: `The single event name to get property data for, e.g. "purchase". Not an array.`, + }, + { + name: 'project_id', + type: 'integer', + required: true, + description: `Your Mixpanel numeric Project ID (Project Settings > Overview). Required when authenticating with a Service Account; not needed with a legacy Project Secret.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of properties to return.`, + }, + { + name: 'workspace_id', + type: 'integer', + required: false, + description: `The numeric ID of the Mixpanel workspace to query, for projects with multiple workspaces. Omit to use the project's default workspace.`, + }, + ], + }, + { + name: 'mixpanelanalytics_event_top_property_values', + description: `List the most common values seen for a given event property, e.g. the top product_category values sent with the 'purchase' event. Useful for discovering what filter/segment values are available before writing a query.`, + params: [ + { + name: 'event', + type: 'string', + required: true, + description: `The single event name to get data for, e.g. "purchase". Not an array.`, + }, + { + name: 'name', + type: 'string', + required: true, + description: `The name of the event property to list values for, e.g. "product_category".`, + }, + { + name: 'project_id', + type: 'integer', + required: true, + description: `Your Mixpanel numeric Project ID (Project Settings > Overview). Required when authenticating with a Service Account; not needed with a legacy Project Secret.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of values to return.`, + }, + { + name: 'workspace_id', + type: 'integer', + required: false, + description: `The numeric ID of the Mixpanel workspace to query, for projects with multiple workspaces. Omit to use the project's default workspace.`, + }, + ], + }, + { + name: 'mixpanelanalytics_events_query', + description: `Get aggregate counts for one or more events over time, without any property segmentation. Faster and simpler than 'mixpanelanalytics_segmentation_query' when you just need raw counts for a set of events, e.g. daily counts of 'login' and 'signup' side by side.`, + params: [ + { + name: 'event', + type: 'array', + required: true, + description: `The event name(s) to get data for, as a JSON array of strings, e.g. ["login", "signup"].`, + }, + { + name: 'project_id', + type: 'integer', + required: true, + description: `Your Mixpanel numeric Project ID (Project Settings > Overview). Required when authenticating with a Service Account; not needed with a legacy Project Secret.`, + }, + { + name: 'type', + type: 'string', + required: true, + description: `The analysis type: 'general' for total count, 'unique' for distinct user count, or 'average' for count per unique user.`, + }, + { + name: 'unit', + type: 'string', + required: true, + description: `The time bucket granularity: 'minute', 'hour', 'day', 'week', or 'month'.`, + }, + { + name: 'from_date', + type: 'string', + required: false, + description: `Start date of the query range, in yyyy-mm-dd format (inclusive). Required unless 'interval' is set.`, + }, + { + name: 'interval', + type: 'integer', + required: false, + description: `How many time buckets to return: 1 for the current period only, 2 for current plus previous, etc. Alternative to 'from_date'/'to_date'.`, + }, + { + name: 'to_date', + type: 'string', + required: false, + description: `End date of the query range, in yyyy-mm-dd format (inclusive). Required unless 'interval' is set.`, + }, + { + name: 'workspace_id', + type: 'integer', + required: false, + description: `The numeric ID of the Mixpanel workspace to query, for projects with multiple workspaces. Omit to use the project's default workspace.`, + }, + ], + }, + { + name: 'mixpanelanalytics_events_top_names', + description: `List the most common event names tracked in the project over its lifetime, ranked by the given analysis type. Useful for discovering what events exist before writing a segmentation or funnel query.`, + params: [ + { + name: 'project_id', + type: 'integer', + required: true, + description: `Your Mixpanel numeric Project ID (Project Settings > Overview). Required when authenticating with a Service Account; not needed with a legacy Project Secret.`, + }, + { + name: 'type', + type: 'string', + required: true, + description: `The analysis type to rank by: 'general' for total event count, 'unique' for distinct user count, or 'average' for count per unique user.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of event names to return.`, + }, + { + name: 'workspace_id', + type: 'integer', + required: false, + description: `The numeric ID of the Mixpanel workspace to query, for projects with multiple workspaces. Omit to use the project's default workspace.`, + }, + ], + }, + { + name: 'mixpanelanalytics_events_top_today', + description: `Get the top events for today, ranked by count, along with their percent change compared to the same time yesterday. Useful for a quick 'what's happening right now' snapshot.`, + params: [ + { + name: 'project_id', + type: 'integer', + required: true, + description: `Your Mixpanel numeric Project ID (Project Settings > Overview). Required when authenticating with a Service Account; not needed with a legacy Project Secret.`, + }, + { + name: 'type', + type: 'string', + required: true, + description: `The analysis type: 'general' for total event count, 'unique' for distinct user count, or 'average' for count per unique user.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of events to return.`, + }, + { + name: 'workspace_id', + type: 'integer', + required: false, + description: `The numeric ID of the Mixpanel workspace to query, for projects with multiple workspaces. Omit to use the project's default workspace.`, + }, + ], + }, + { + name: 'mixpanelanalytics_funnels_list_saved', + description: `List all saved funnels in a Mixpanel project, returning each funnel's numeric funnel_id and name. Use the funnel_id with 'mixpanelanalytics_funnels_query' to fetch its conversion data.`, + params: [ + { + name: 'project_id', + type: 'integer', + required: true, + description: `Your Mixpanel numeric Project ID (Project Settings > Overview). Required when authenticating with a Service Account; not needed with a legacy Project Secret.`, + }, + { + name: 'workspace_id', + type: 'integer', + required: false, + description: `The numeric ID of the Mixpanel workspace to query, for projects with multiple workspaces. Omit to use the project's default workspace.`, + }, + ], + }, + { + name: 'mixpanelanalytics_funnels_query', + description: `Get conversion data for an existing saved funnel by its funnel_id, showing per-step counts and conversion ratios over time. Use 'mixpanelanalytics_funnels_list_saved' to find a funnel_id. Note: Mixpanel considers this endpoint in maintenance mode and recommends building the funnel in the Insights report and using 'mixpanelanalytics_insights_query' instead where possible.`, + params: [ + { + name: 'from_date', + type: 'string', + required: true, + description: `Start date of the query range, in yyyy-mm-dd format (inclusive).`, + }, + { + name: 'funnel_id', + type: 'integer', + required: true, + description: `The numeric ID of the saved funnel to get data for. Find this via 'mixpanelanalytics_funnels_list_saved'.`, + }, + { + name: 'project_id', + type: 'integer', + required: true, + description: `Your Mixpanel numeric Project ID (Project Settings > Overview). Required when authenticating with a Service Account; not needed with a legacy Project Secret.`, + }, + { + name: 'to_date', + type: 'string', + required: true, + description: `End date of the query range, in yyyy-mm-dd format (inclusive).`, + }, + { + name: 'interval', + type: 'integer', + required: false, + description: `Number of days per bucket in the returned time series.`, + }, + { + name: 'length', + type: 'integer', + required: false, + description: `The number of time units (see 'length_unit') a user has to complete the funnel. Max 90 days. Defaults to the funnel's saved conversion window if omitted.`, + }, + { + name: 'length_unit', + type: 'string', + required: false, + description: `The unit for 'length': 'second', 'minute', 'hour', or 'day'. Defaults to the funnel's saved setting if omitted.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of top property values to return when 'on' is set. Max 10,000.`, + }, + { + name: 'on', + type: 'string', + required: false, + description: `A Mixpanel property expression to segment the funnel by, e.g. properties["Plan"].`, + }, + { + name: 'unit', + type: 'string', + required: false, + description: `Alternative to 'interval': time bucket granularity as 'day', 'week', or 'month'.`, + }, + { + name: 'where', + type: 'string', + required: false, + description: `A Mixpanel expression to filter which events are included, e.g. properties["plan"] == "paid".`, + }, + { + name: 'workspace_id', + type: 'integer', + required: false, + description: `The numeric ID of the Mixpanel workspace to query, for projects with multiple workspaces. Omit to use the project's default workspace.`, + }, + ], + }, + { + name: 'mixpanelanalytics_insights_query', + description: `Get the computed data for an existing saved Insights report by its bookmark_id. This is Mixpanel's recommended, actively maintained way to pull report data (in place of the older segmentation/funnels/retention query endpoints), but it can only run a report that already exists in the Mixpanel UI — it does not accept an ad hoc query definition. Find the bookmark_id in the report's URL, e.g. the number after 'report-' in .../reports/1234/report-56789.`, + params: [ + { + name: 'bookmark_id', + type: 'integer', + required: true, + description: `The ID of the saved Insights report, found in its URL (the number after 'report-').`, + }, + { + name: 'project_id', + type: 'integer', + required: true, + description: `Your Mixpanel numeric Project ID (Project Settings > Overview). Required when authenticating with a Service Account; not needed with a legacy Project Secret.`, + }, + { + name: 'workspace_id', + type: 'integer', + required: false, + description: `The numeric ID of the Mixpanel workspace to query, for projects with multiple workspaces. Omit to use the project's default workspace.`, + }, + ], + }, + { + name: 'mixpanelanalytics_jql_query', + description: `Run a custom JQL (JavaScript Query Language) script against raw Mixpanel event/profile data for analysis that the standard segmentation/funnel/retention/insights endpoints can't express, e.g. custom aggregations, joins across events and profiles, or arbitrary groupBy/reduce pipelines. The script must define a top-level 'function main(){...}' that returns the result. Returns a JSON array.`, + params: [ + { + name: 'project_id', + type: 'integer', + required: true, + description: `Your Mixpanel numeric Project ID (Project Settings > Overview). Required when authenticating with a Service Account; not needed with a legacy Project Secret.`, + }, + { + name: 'script', + type: 'string', + required: true, + description: `The JQL script to run, as JavaScript source defining 'function main(){...}'. Example: function main(){ return Events(params).groupBy(["name"], mixpanel.reducer.count()) }`, + }, + { + name: 'params', + type: 'object', + required: false, + description: `A JSON object made available to the script as the global 'params' variable, e.g. {"from_date": "2024-01-01T00:00:00.000Z"}. Use this to parameterize the script instead of hard-coding values.`, + }, + { + name: 'workspace_id', + type: 'integer', + required: false, + description: `The numeric ID of the Mixpanel workspace to query, for projects with multiple workspaces. Omit to use the project's default workspace.`, + }, + ], + }, + { + name: 'mixpanelanalytics_profiles_query', + description: `Query Mixpanel user (or group) profiles and return a paginated list of profiles matching the given filters. Supports filtering by a specific list of distinct_ids, a free-form 'where' expression, or a saved cohort. Rate limited to 60 queries/hour and 5 concurrent queries.`, + params: [ + { + name: 'project_id', + type: 'integer', + required: true, + description: `Your Mixpanel numeric Project ID (Project Settings > Overview). Required when authenticating with a Service Account; not needed with a legacy Project Secret.`, + }, + { + name: 'as_of_timestamp', + type: 'integer', + required: false, + description: `Unix timestamp to evaluate 'behaviors' against. Required if using 'behaviors' against more than 1,000 profiles.`, + }, + { + name: 'data_group_id', + type: 'string', + required: false, + description: `The group key ID to query group profiles instead of user profiles. Omit to query user profiles.`, + }, + { + name: 'distinct_id', + type: 'string', + required: false, + description: `Return only the single profile with this distinct_id.`, + }, + { + name: 'distinct_ids', + type: 'array', + required: false, + description: `Return only the profiles matching these distinct_ids, as a JSON array of strings.`, + }, + { + name: 'filter_by_cohort', + type: 'object', + required: false, + description: `Restrict results to members of a saved cohort, e.g. {"id": 12345}. Mutually exclusive with 'behaviors'. Find cohort IDs via 'mixpanelanalytics_cohorts_list'.`, + }, + { + name: 'include_all_users', + type: 'boolean', + required: false, + description: `When using 'filter_by_cohort', whether to include profiles with no associated user data. Defaults to true.`, + }, + { + name: 'output_properties', + type: 'array', + required: false, + description: `Restrict which profile properties are returned, as a JSON array of property names. Omit to return all properties.`, + }, + { + name: 'page', + type: 'integer', + required: false, + description: `The page of results to return, starting at 0. Requires 'session_id' when greater than 0.`, + }, + { + name: 'session_id', + type: 'string', + required: false, + description: `The session_id token returned by a previous call, used to fetch subsequent pages of the same query.`, + }, + { + name: 'where', + type: 'string', + required: false, + description: `A Mixpanel expression to filter profiles by, e.g. properties["$email"] == "test@example.com".`, + }, + { + name: 'workspace_id', + type: 'integer', + required: false, + description: `The numeric ID of the Mixpanel workspace to query, for projects with multiple workspaces. Omit to use the project's default workspace.`, + }, + ], + }, + { + name: 'mixpanelanalytics_retention_frequency_query', + description: `Measure how frequently users return to do an event within a period, broken into fine-grained buckets (e.g. how many of the hours in each day a user was active). Useful for engagement/'stickiness' analysis.`, + params: [ + { + name: 'addiction_unit', + type: 'string', + required: true, + description: `The granularity of each bucket within a period: 'hour' or 'day'.`, + }, + { + name: 'from_date', + type: 'string', + required: true, + description: `Start date of the query range, in yyyy-mm-dd format (inclusive).`, + }, + { + name: 'project_id', + type: 'integer', + required: true, + description: `Your Mixpanel numeric Project ID (Project Settings > Overview). Required when authenticating with a Service Account; not needed with a legacy Project Secret.`, + }, + { + name: 'to_date', + type: 'string', + required: true, + description: `End date of the query range, in yyyy-mm-dd format (inclusive).`, + }, + { + name: 'unit', + type: 'string', + required: true, + description: `The overall period each bucket set covers: 'day', 'week', or 'month'.`, + }, + { + name: 'event', + type: 'string', + required: false, + description: `The event to measure return frequency for. Omit to measure across any event.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Return only the top N segmentation values. Only applies when 'on' is set.`, + }, + { + name: 'on', + type: 'string', + required: false, + description: `A Mixpanel property expression to segment results by, e.g. properties["Plan"].`, + }, + { + name: 'where', + type: 'string', + required: false, + description: `A Mixpanel expression to filter which occurrences of the event count.`, + }, + { + name: 'workspace_id', + type: 'integer', + required: false, + description: `The numeric ID of the Mixpanel workspace to query, for projects with multiple workspaces. Omit to use the project's default workspace.`, + }, + ], + }, + { + name: 'mixpanelanalytics_retention_query', + description: `Measure how many users who did a 'born' event came back to do a later event, bucketed into cohorts. Supports 'birth' retention (users grouped by when they first did the born event) or 'compounded' retention (users grouped by every time they did the born event).`, + params: [ + { + name: 'from_date', + type: 'string', + required: true, + description: `Start date of the query range, in yyyy-mm-dd format (inclusive).`, + }, + { + name: 'project_id', + type: 'integer', + required: true, + description: `Your Mixpanel numeric Project ID (Project Settings > Overview). Required when authenticating with a Service Account; not needed with a legacy Project Secret.`, + }, + { + name: 'to_date', + type: 'string', + required: true, + description: `End date of the query range, in yyyy-mm-dd format (inclusive).`, + }, + { + name: 'born_event', + type: 'string', + required: false, + description: `The event that defines when a user enters a cohort. Required when 'retention_type' is 'birth' (the default).`, + }, + { + name: 'born_where', + type: 'string', + required: false, + description: `A Mixpanel expression to filter which occurrences of 'born_event' count.`, + }, + { + name: 'event', + type: 'string', + required: false, + description: `The returning event to measure retention against. Omit to measure retention against any event.`, + }, + { + name: 'interval', + type: 'integer', + required: false, + description: `Number of units (see 'unit') per retention bucket. Max 90 days.`, + }, + { + name: 'interval_count', + type: 'integer', + required: false, + description: `Number of intervals to return in the response.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Return only the top N segmentation values. Only applies when 'on' is set.`, + }, + { + name: 'on', + type: 'string', + required: false, + description: `A Mixpanel property expression to segment the returning event by, e.g. properties["Plan"].`, + }, + { + name: 'retention_type', + type: 'string', + required: false, + description: `'birth' groups users by when they first did 'born_event'. 'compounded' groups users by every time they did 'born_event'.`, + }, + { + name: 'unbounded_retention', + type: 'boolean', + required: false, + description: `If true, accumulate retention counts from right to left across all subsequent intervals instead of a single fixed bucket.`, + }, + { + name: 'unit', + type: 'string', + required: false, + description: `The bucket time unit: 'day', 'week', or 'month'.`, + }, + { + name: 'where', + type: 'string', + required: false, + description: `A Mixpanel expression to filter which occurrences of the returning event count.`, + }, + { + name: 'workspace_id', + type: 'integer', + required: false, + description: `The numeric ID of the Mixpanel workspace to query, for projects with multiple workspaces. Omit to use the project's default workspace.`, + }, + ], + }, + { + name: 'mixpanelanalytics_schema_delete', + description: `Permanently delete the Lexicon schema for a single event or profile property, identified by entity type and name. This removes only the Lexicon schema definition; the underlying event or profile property is not deleted and will show as un-schematized until a new schema is uploaded. This action is irreversible.`, + params: [ + { + name: 'entity_type', + type: 'string', + required: true, + description: `Which kind of Lexicon entity this schema describes: 'event' for a Mixpanel event schema, or 'profile' for a user profile property schema.`, + }, + { + name: 'name', + type: 'string', + required: true, + description: `The exact event name or profile property name this schema describes, matching how it appears in Lexicon, e.g. "Added to Cart" for an event or "Plan" for a profile property.`, + }, + { + name: 'project_id', + type: 'string', + required: true, + description: `Your numeric Mixpanel Project ID, required to authenticate Service Account requests. Find it in Mixpanel under Project Settings > Overview.`, + }, + ], + }, + { + name: 'mixpanelanalytics_schema_get', + description: `Retrieve the Lexicon schema for a single event or profile property, identified by entity type and name. Returns the schema's description, JSON-schema-style property definitions, and Lexicon metadata such as display name, tags, and owners. Returns an error if no schema exists for that entity type and name; use 'mixpanelanalytics_schemas_list_by_entity' first if you're unsure of the exact name.`, + params: [ + { + name: 'entity_type', + type: 'string', + required: true, + description: `Which kind of Lexicon entity this schema describes: 'event' for a Mixpanel event schema, or 'profile' for a user profile property schema.`, + }, + { + name: 'name', + type: 'string', + required: true, + description: `The exact event name or profile property name this schema describes, matching how it appears in Lexicon, e.g. "Added to Cart" for an event or "Plan" for a profile property.`, + }, + { + name: 'project_id', + type: 'string', + required: true, + description: `Your numeric Mixpanel Project ID, required to authenticate Service Account requests. Find it in Mixpanel under Project Settings > Overview.`, + }, + ], + }, + { + name: 'mixpanelanalytics_schema_upload', + description: `Create or replace the Lexicon schema for a single event or profile property, identified by entity type and name. Any existing schema for this entity type and name is fully overwritten with the fields you provide. Use 'description' for a human-readable summary of the entity, 'properties' for JSON-schema-style definitions of its data properties, and 'metadata' for Lexicon display settings such as tags, owners, or visibility. Use 'mixpanelanalytics_schemas_upload_batch' instead to upload many schemas in one call.`, + params: [ + { + name: 'entity_type', + type: 'string', + required: true, + description: `Which kind of Lexicon entity this schema describes: 'event' for a Mixpanel event schema, or 'profile' for a user profile property schema.`, + }, + { + name: 'name', + type: 'string', + required: true, + description: `The exact event name or profile property name this schema describes, matching how it appears in Lexicon, e.g. "Added to Cart" for an event or "Plan" for a profile property.`, + }, + { + name: 'project_id', + type: 'string', + required: true, + description: `Your numeric Mixpanel Project ID, required to authenticate Service Account requests. Find it in Mixpanel under Project Settings > Overview.`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `A human-readable description of this event or profile property, shown in Lexicon.`, + }, + { + name: 'metadata', + type: 'object', + required: false, + description: `Lexicon display metadata for this entity, such as a custom display name, tags, or ownership contacts, nested under a "com.mixpanel" key. Example: {"com.mixpanel": {"displayName": "Added to Cart", "tags": ["ecommerce"]}}.`, + }, + { + name: 'properties', + type: 'object', + required: false, + description: `JSON-schema-style definitions for this entity's data properties, keyed by property name. Each value is an object such as {"type": "string", "description": "..."}. Omit to leave the entity's property definitions unset.`, + }, + ], + }, + { + name: 'mixpanelanalytics_schemas_delete_all', + description: `Permanently delete every schema in the project's Lexicon data dictionary, for both event and profile-property entity types. This removes only the Lexicon schema definitions (descriptions, JSON-schema property definitions, and metadata); the underlying events and profile properties are not deleted and will simply show as un-schematized until new schemas are uploaded. This action is irreversible and removes ALL schemas in the project; use 'mixpanelanalytics_schemas_delete_by_entity' or 'mixpanelanalytics_schema_delete' if you only need to remove a narrower subset.`, + params: [ + { + name: 'project_id', + type: 'string', + required: true, + description: `Your numeric Mixpanel Project ID, required to authenticate Service Account requests. Find it in Mixpanel under Project Settings > Overview.`, + }, + ], + }, + { + name: 'mixpanelanalytics_schemas_delete_by_entity', + description: `Permanently delete every Lexicon schema for one entity type ('event' or 'profile') in a Mixpanel project, leaving schemas for the other entity type untouched. Pass 'entity_name' to narrow this to a single schema by name instead of deleting all schemas for the entity type. This removes only the Lexicon schema definitions; the underlying events or profile properties are not deleted and will show as un-schematized until new schemas are uploaded. This action is irreversible; use 'mixpanelanalytics_schema_delete' to remove a single schema by path instead, or 'mixpanelanalytics_schemas_delete_all' to clear the entire project.`, + params: [ + { + name: 'entity_type', + type: 'string', + required: true, + description: `Which kind of Lexicon entity to delete schemas for: 'event' for Mixpanel event schemas, or 'profile' for user profile property schemas. All schemas of this entity type are deleted unless 'entity_name' narrows it further.`, + }, + { + name: 'project_id', + type: 'string', + required: true, + description: `Your numeric Mixpanel Project ID, required to authenticate Service Account requests. Find it in Mixpanel under Project Settings > Overview.`, + }, + { + name: 'entity_name', + type: 'string', + required: false, + description: `Narrow the deletion down to the schema with this exact entity name. Omit to delete every schema for the given entity type.`, + }, + ], + }, + { + name: 'mixpanelanalytics_schemas_list', + description: `List all schemas (data dictionary entries) defined in a Mixpanel project's Lexicon, across both event and profile-property entity types. Each schema includes the entity's description, JSON-schema-style property definitions, and Lexicon metadata such as display name, tags, and owners. Only entities that already have an associated schema are returned; events or properties visible in the Lexicon UI without one won't appear here. Use 'mixpanelanalytics_schemas_list_by_entity' to filter to a single entity type, or 'mixpanelanalytics_schema_get' to fetch one schema by name.`, + params: [ + { + name: 'project_id', + type: 'string', + required: true, + description: `Your numeric Mixpanel Project ID, required to authenticate Service Account requests. Find it in Mixpanel under Project Settings > Overview.`, + }, + ], + }, + { + name: 'mixpanelanalytics_schemas_list_by_entity', + description: `List the Lexicon schemas for one entity type ('event' or 'profile') in a Mixpanel project. Optionally pass 'entity_name' to filter the results down to a single schema by name. Only entities that already have an associated schema are returned. Use 'mixpanelanalytics_schemas_list' to list schemas across both entity types at once, or 'mixpanelanalytics_schema_get' to fetch a single schema directly.`, + params: [ + { + name: 'entity_type', + type: 'string', + required: true, + description: `Which kind of Lexicon entity to list schemas for: 'event' for Mixpanel event schemas, or 'profile' for user profile property schemas.`, + }, + { + name: 'project_id', + type: 'string', + required: true, + description: `Your numeric Mixpanel Project ID, required to authenticate Service Account requests. Find it in Mixpanel under Project Settings > Overview.`, + }, + { + name: 'entity_name', + type: 'string', + required: false, + description: `Filter the results down to the schema with this exact entity name. Omit to list every schema for the given entity type.`, + }, + ], + }, + { + name: 'mixpanelanalytics_schemas_upload_batch', + description: `Create or replace multiple Lexicon schemas in a single call. Each object in 'entries' defines one event or profile property's schema (entity type, name, and JSON-schema definition) and is merged into the project's existing data dictionary. Set 'truncate' to true to first remove every schema not present in this upload, effectively replacing the entire data dictionary; use with caution, since this permanently deletes any schemas you don't include. Use 'mixpanelanalytics_schema_upload' instead when you only need to create or update a single schema.`, + params: [ + { + name: 'entries', + type: 'array', + required: true, + description: `Array of schema entries to create or replace, merged into the project's existing data dictionary. Each entry is a JSON object describing one event or profile property's schema, e.g. {"entityType": "event", "name": "Added to Cart", "schemaJson": {"properties": {"amount": {"type": "number"}}}}. Passed through as-is; see Mixpanel's Lexicon Schemas API docs for the full entry shape.`, + }, + { + name: 'project_id', + type: 'string', + required: true, + description: `Your numeric Mixpanel Project ID, required to authenticate Service Account requests. Find it in Mixpanel under Project Settings > Overview.`, + }, + { + name: 'truncate', + type: 'boolean', + required: false, + description: `If true, removes every existing schema not present in this upload before inserting the new entries, effectively replacing the entire data dictionary. If false (default), the uploaded entries are merged with existing schemas and nothing is removed.`, + }, + ], + }, + { + name: 'mixpanelanalytics_segmentation_average_query', + description: `Get the average value of a numeric property expression per unit time for a single event, e.g. average order value per day. Note: in maintenance mode per Mixpanel — prefer 'mixpanelanalytics_insights_query' for new use cases where possible.`, + params: [ + { + name: 'event', + type: 'string', + required: true, + description: `The single event name to get data for, e.g. "Purchase". Not an array.`, + }, + { + name: 'from_date', + type: 'string', + required: true, + description: `Start date of the query range, in yyyy-mm-dd format (inclusive).`, + }, + { + name: 'on', + type: 'string', + required: true, + description: `The numeric property expression to average per unit time, e.g. properties["amount"]. Must evaluate to a number.`, + }, + { + name: 'project_id', + type: 'integer', + required: true, + description: `Your Mixpanel numeric Project ID (Project Settings > Overview). Required when authenticating with a Service Account; not needed with a legacy Project Secret.`, + }, + { + name: 'to_date', + type: 'string', + required: true, + description: `End date of the query range, in yyyy-mm-dd format (inclusive).`, + }, + { + name: 'unit', + type: 'string', + required: false, + description: `Time bucket granularity: 'hour' or 'day'.`, + }, + { + name: 'where', + type: 'string', + required: false, + description: `A Mixpanel expression to filter which events are included, e.g. properties["plan"] == "paid".`, + }, + { + name: 'workspace_id', + type: 'integer', + required: false, + description: `The numeric ID of the Mixpanel workspace to query, for projects with multiple workspaces. Omit to use the project's default workspace.`, + }, + ], + }, + { + name: 'mixpanelanalytics_segmentation_numeric_query', + description: `Get event counts for a single event, bucketed by the numeric value of a property expression (e.g. distribution of purchase amounts). Note: in maintenance mode per Mixpanel — prefer 'mixpanelanalytics_insights_query' for new use cases where possible.`, + params: [ + { + name: 'event', + type: 'string', + required: true, + description: `The single event name to get data for, e.g. "Purchase". Not an array.`, + }, + { + name: 'from_date', + type: 'string', + required: true, + description: `Start date of the query range, in yyyy-mm-dd format (inclusive).`, + }, + { + name: 'on', + type: 'string', + required: true, + description: `A numeric property expression to bucket by, e.g. properties["amount"]. The expression must evaluate to a number.`, + }, + { + name: 'project_id', + type: 'integer', + required: true, + description: `Your Mixpanel numeric Project ID (Project Settings > Overview). Required when authenticating with a Service Account; not needed with a legacy Project Secret.`, + }, + { + name: 'to_date', + type: 'string', + required: true, + description: `End date of the query range, in yyyy-mm-dd format (inclusive).`, + }, + { + name: 'type', + type: 'string', + required: false, + description: `The analysis type: 'general' for total, 'unique' for distinct user count, or 'average' for average per unique user.`, + }, + { + name: 'unit', + type: 'string', + required: false, + description: `Time bucket granularity: 'hour' or 'day'.`, + }, + { + name: 'where', + type: 'string', + required: false, + description: `A Mixpanel expression to filter which events are included, e.g. properties["plan"] == "paid".`, + }, + { + name: 'workspace_id', + type: 'integer', + required: false, + description: `The numeric ID of the Mixpanel workspace to query, for projects with multiple workspaces. Omit to use the project's default workspace.`, + }, + ], + }, + { + name: 'mixpanelanalytics_segmentation_query', + description: `Get event counts for a single event over time, optionally segmented and filtered by properties. Note: Mixpanel's Query API team considers this endpoint in maintenance mode and recommends 'mixpanelanalytics_insights_query' (against a saved Insights report) for new use cases, but this remains fully supported for ad hoc queries.`, + params: [ + { + name: 'event', + type: 'string', + required: true, + description: `The single event name to get data for, e.g. "Purchased item". Not an array.`, + }, + { + name: 'from_date', + type: 'string', + required: true, + description: `Start date of the query range, in yyyy-mm-dd format (inclusive).`, + }, + { + name: 'project_id', + type: 'integer', + required: true, + description: `Your Mixpanel numeric Project ID (Project Settings > Overview). Required when authenticating with a Service Account; not needed with a legacy Project Secret.`, + }, + { + name: 'to_date', + type: 'string', + required: true, + description: `End date of the query range, in yyyy-mm-dd format (inclusive).`, + }, + { + name: 'interval', + type: 'integer', + required: false, + description: `Number of days to bucket results into. Alternative to 'unit' for custom bucket sizes.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of top segment values to return. Defaults to 60, max 10,000.`, + }, + { + name: 'on', + type: 'string', + required: false, + description: `A Mixpanel property expression to segment the results by, e.g. properties["Plan"]. Omit for an unsegmented total.`, + }, + { + name: 'type', + type: 'string', + required: false, + description: `The analysis type: 'general' for total event count, 'unique' for distinct user count, or 'average' for count per unique user.`, + }, + { + name: 'unit', + type: 'string', + required: false, + description: `Time bucket granularity: 'minute', 'hour', 'day', or 'month'.`, + }, + { + name: 'where', + type: 'string', + required: false, + description: `A Mixpanel expression to filter which events are included, e.g. properties["plan"] == "paid".`, + }, + { + name: 'workspace_id', + type: 'integer', + required: false, + description: `The numeric ID of the Mixpanel workspace to query, for projects with multiple workspaces. Omit to use the project's default workspace.`, + }, + ], + }, + { + name: 'mixpanelanalytics_segmentation_sum_query', + description: `Get the sum of a numeric property expression per unit time for a single event, e.g. total revenue per day. Note: in maintenance mode per Mixpanel — prefer 'mixpanelanalytics_insights_query' for new use cases where possible.`, + params: [ + { + name: 'event', + type: 'string', + required: true, + description: `The single event name to get data for, e.g. "Purchase". Not an array.`, + }, + { + name: 'from_date', + type: 'string', + required: true, + description: `Start date of the query range, in yyyy-mm-dd format (inclusive).`, + }, + { + name: 'on', + type: 'string', + required: true, + description: `The numeric property expression to sum per unit time, e.g. properties["amount"]. Must evaluate to a number.`, + }, + { + name: 'project_id', + type: 'integer', + required: true, + description: `Your Mixpanel numeric Project ID (Project Settings > Overview). Required when authenticating with a Service Account; not needed with a legacy Project Secret.`, + }, + { + name: 'to_date', + type: 'string', + required: true, + description: `End date of the query range, in yyyy-mm-dd format (inclusive).`, + }, + { + name: 'unit', + type: 'string', + required: false, + description: `Time bucket granularity: 'hour' or 'day'.`, + }, + { + name: 'where', + type: 'string', + required: false, + description: `A Mixpanel expression to filter which events are included, e.g. properties["plan"] == "paid".`, + }, + { + name: 'workspace_id', + type: 'integer', + required: false, + description: `The numeric ID of the Mixpanel workspace to query, for projects with multiple workspaces. Omit to use the project's default workspace.`, + }, + ], + }, + { + name: 'mixpanelanalytics_warehouse_import_create_event_stream', + description: `Create a new warehouse import that streams warehouse rows into Mixpanel as events. Maps a warehouse table to Mixpanel's Events dataset using 'table_params' to select the source table/columns and 'time_column_name' (plus 'event_name' or 'event_column_name') to derive each event's timestamp and name. Requires a warehouse source to already be configured in Mixpanel (Lexicon > Warehouse Sources) — pass its id as 'warehouse_source_id'. Requires Warehouse Connectors to be enabled on your Mixpanel plan; without it, calls to this endpoint return a 403 Forbidden regardless of input.`, + params: [ + { + name: 'project_id', + type: 'string', + required: true, + description: `Your numeric Mixpanel Project ID, required to authenticate Service Account requests. Find it in Mixpanel under Project Settings > Overview.`, + }, + { + name: 'sync_mode', + type: 'string', + required: true, + description: `How this import stays in sync with the warehouse table over time, e.g. a full re-sync mode or an incremental mode based on a time column. Mixpanel's Warehouse Connectors API does not fully document every valid value for this import type in one place — the sibling lookup-table import accepts 'full_sync' or 'one_time', but event/people/group streaming imports may support additional incremental modes. Check your warehouse source configuration in the Mixpanel dashboard, or current Mixpanel documentation, to confirm the exact values accepted before relying on a value here.`, + }, + { + name: 'table_params', + type: 'object', + required: true, + description: `JSON object describing which warehouse table (and columns) this import reads from, e.g. the database, schema, and table name. The exact shape depends on your warehouse type (Snowflake, BigQuery, Databricks, or Redshift) and is passed through to Mixpanel as-is — check an existing import's configuration (via 'mixpanelanalytics_warehouse_import_get') or current Mixpanel documentation for the precise fields your warehouse type expects. Example: {"schema": "public", "table_name": "events"}.`, + }, + { + name: 'time_column_name', + type: 'string', + required: true, + description: `The name of the warehouse column containing each row's event timestamp. Mixpanel uses this column to set the imported event's time.`, + }, + { + name: 'warehouse_source_id', + type: 'integer', + required: true, + description: `The numeric ID of the warehouse source (the connected Snowflake, BigQuery, Databricks, or Redshift warehouse) this import reads from. Warehouse sources are configured separately in Mixpanel under Lexicon > Warehouse Sources.`, + }, + { + name: 'company_column_name', + type: 'string', + required: false, + description: `The name of the warehouse column containing a company/account identifier to associate with each imported event, for B2B group analytics.`, + }, + { + name: 'databricks_params', + type: 'object', + required: false, + description: `Databricks-specific cluster configuration for this import, passed through to Mixpanel as-is. Only relevant when the underlying warehouse source is Databricks — omit for Snowflake, BigQuery, or Redshift sources. Check current Mixpanel documentation or an existing Databricks import (via 'mixpanelanalytics_warehouse_import_get') for the exact fields expected, such as a cluster id or SQL warehouse id.`, + }, + { + name: 'device_column_name', + type: 'string', + required: false, + description: `The name of the warehouse column containing a device identifier to associate with each imported event.`, + }, + { + name: 'event_column_name', + type: 'string', + required: false, + description: `The name of the warehouse column whose value supplies each row's event name, when different rows should become different event types. Provide this or a fixed 'event_name'.`, + }, + { + name: 'event_name', + type: 'string', + required: false, + description: `A fixed event name to apply to every row imported from this table. Provide this or 'event_column_name' (a column whose value supplies the event name per-row) — check Mixpanel's current Warehouse Connectors documentation for which one your use case requires.`, + }, + { + name: 'insert_time_column_name', + type: 'string', + required: false, + description: `The name of a warehouse column marking when each row was inserted into the warehouse, used by Mixpanel to incrementally pick up only new rows on subsequent syncs instead of rescanning the whole table.`, + }, + { + name: 'json_properties_column_name', + type: 'string', + required: false, + description: `The name of a warehouse column containing a JSON blob of additional event properties to merge into each imported event, for schemas that store extra attributes as a single JSON column rather than one column per property.`, + }, + { + name: 'property_mappings', + type: 'object', + required: false, + description: `JSON object remapping warehouse column names to different Mixpanel property names on import, e.g. {"warehouse_col": "Mixpanel Property Name"}. Omit to import columns using their original warehouse column names.`, + }, + { + name: 'run_every', + type: 'integer', + required: false, + description: `How often this warehouse import syncs, in NANOSECONDS — not seconds or milliseconds. This unit is easy to get wrong: 86400000000000 nanoseconds = 1 day (86400 seconds × 1,000,000,000). Common values: 3600000000000 = hourly, 86400000000000 = daily, 604800000000000 = weekly. Omit to keep Mixpanel's default sync frequency for this import type.`, + }, + { + name: 'user_column_name', + type: 'string', + required: false, + description: `The name of the warehouse column containing the user identifier (Mixpanel distinct_id) to associate with each imported event.`, + }, + ], + }, + { + name: 'mixpanelanalytics_warehouse_import_create_groups', + description: `Create a new warehouse import that syncs warehouse rows into Mixpanel as group profile updates, analogous to 'mixpanelanalytics_warehouse_import_create_people' but for group analytics (e.g. company/account-level profiles) instead of individual users. Maps a warehouse table using 'table_params', with 'group_key' naming the configured Mixpanel group type and 'group_id_column' identifying which warehouse column holds each row's group id. Requires a warehouse source to already be configured in Mixpanel (Lexicon > Warehouse Sources) — pass its id as 'warehouse_source_id'. Requires Group Analytics to be enabled on your Mixpanel project, and Warehouse Connectors to be enabled on your Mixpanel plan; without the latter, calls to this endpoint return a 403 Forbidden regardless of input.`, + params: [ + { + name: 'group_id_column', + type: 'string', + required: true, + description: `The name of the warehouse column containing each row's group identifier (the value for the group key above), e.g. the company name or account ID column.`, + }, + { + name: 'group_key', + type: 'string', + required: true, + description: `The name of the group key as configured in Mixpanel for this group analytics type, e.g. "Company" or "Account ID". This must match a group key already defined in your project.`, + }, + { + name: 'project_id', + type: 'string', + required: true, + description: `Your numeric Mixpanel Project ID, required to authenticate Service Account requests. Find it in Mixpanel under Project Settings > Overview.`, + }, + { + name: 'sync_mode', + type: 'string', + required: true, + description: `How this import stays in sync with the warehouse table over time, e.g. a full re-sync mode or an incremental mode based on a time column. Mixpanel's Warehouse Connectors API does not fully document every valid value for this import type in one place — the sibling lookup-table import accepts 'full_sync' or 'one_time', but event/people/group streaming imports may support additional incremental modes. Check your warehouse source configuration in the Mixpanel dashboard, or current Mixpanel documentation, to confirm the exact values accepted before relying on a value here.`, + }, + { + name: 'table_params', + type: 'object', + required: true, + description: `JSON object describing which warehouse table (and columns) this import reads from, e.g. the database, schema, and table name. The exact shape depends on your warehouse type (Snowflake, BigQuery, Databricks, or Redshift) and is passed through to Mixpanel as-is — check an existing import's configuration (via 'mixpanelanalytics_warehouse_import_get') or current Mixpanel documentation for the precise fields your warehouse type expects. Example: {"schema": "public", "table_name": "events"}.`, + }, + { + name: 'warehouse_source_id', + type: 'integer', + required: true, + description: `The numeric ID of the warehouse source (the connected Snowflake, BigQuery, Databricks, or Redshift warehouse) this import reads from. Warehouse sources are configured separately in Mixpanel under Lexicon > Warehouse Sources.`, + }, + { + name: 'databricks_params', + type: 'object', + required: false, + description: `Databricks-specific cluster configuration for this import, passed through to Mixpanel as-is. Only relevant when the underlying warehouse source is Databricks — omit for Snowflake, BigQuery, or Redshift sources. Check current Mixpanel documentation or an existing Databricks import (via 'mixpanelanalytics_warehouse_import_get') for the exact fields expected, such as a cluster id or SQL warehouse id.`, + }, + { + name: 'insert_time_column_name', + type: 'string', + required: false, + description: `The name of a warehouse column marking when each row was inserted into the warehouse, used by Mixpanel to incrementally pick up only new rows on subsequent syncs instead of rescanning the whole table.`, + }, + { + name: 'json_properties_column_name', + type: 'string', + required: false, + description: `The name of a warehouse column containing a JSON blob of additional group properties to merge into each imported group profile, for schemas that store extra attributes as a single JSON column rather than one column per property.`, + }, + { + name: 'property_mappings', + type: 'object', + required: false, + description: `JSON object remapping warehouse column names to different Mixpanel property names on import, e.g. {"warehouse_col": "Mixpanel Property Name"}. Omit to import columns using their original warehouse column names.`, + }, + { + name: 'run_every', + type: 'integer', + required: false, + description: `How often this warehouse import syncs, in NANOSECONDS — not seconds or milliseconds. This unit is easy to get wrong: 86400000000000 nanoseconds = 1 day (86400 seconds × 1,000,000,000). Common values: 3600000000000 = hourly, 86400000000000 = daily, 604800000000000 = weekly. Omit to keep Mixpanel's default sync frequency for this import type.`, + }, + ], + }, + { + name: 'mixpanelanalytics_warehouse_import_create_lookup_table', + description: `Create a new warehouse import that syncs a warehouse table into Mixpanel as a Lookup Table, joining additional properties onto events or user profiles by a shared key (similar in effect to 'mixpanelingestion_lookup_table_replace', but kept continuously in sync from the warehouse instead of being replaced manually via CSV). 'mixpanel_property' identifies which Mixpanel property this table enriches, and 'property_key_column_name' is the warehouse column holding the join key. Requires a warehouse source to already be configured in Mixpanel (Lexicon > Warehouse Sources) — pass its id as 'warehouse_source_id'. Requires Warehouse Connectors to be enabled on your Mixpanel plan; without it, calls to this endpoint return a 403 Forbidden regardless of input.`, + params: [ + { + name: 'mixpanel_property', + type: 'object', + required: true, + description: `JSON object identifying which Mixpanel property this lookup table enriches. Shape: {"value": , "resourceType": <"event" or "user">, "customPropertyId": }. Example: {"value": "Total Revenue", "resourceType": "event", "customPropertyId": null} enriches the event property "Total Revenue". Find the exact property identifiers in Lexicon.`, + }, + { + name: 'project_id', + type: 'string', + required: true, + description: `Your numeric Mixpanel Project ID, required to authenticate Service Account requests. Find it in Mixpanel under Project Settings > Overview.`, + }, + { + name: 'property_key_column_name', + type: 'string', + required: true, + description: `The name of the warehouse column containing the lookup key — the value that matches this property's values on incoming events or profiles.`, + }, + { + name: 'sync_mode', + type: 'string', + required: true, + description: `How this lookup table import stays in sync with the warehouse table. 'full_sync' re-imports the entire table on every scheduled run (see 'run_every'), keeping it continuously up to date. 'one_time' imports the table once and does not sync again automatically.`, + }, + { + name: 'table_params', + type: 'object', + required: true, + description: `JSON object describing which warehouse table (and columns) this import reads from, e.g. the database, schema, and table name. The exact shape depends on your warehouse type (Snowflake, BigQuery, Databricks, or Redshift) and is passed through to Mixpanel as-is — check an existing import's configuration (via 'mixpanelanalytics_warehouse_import_get') or current Mixpanel documentation for the precise fields your warehouse type expects. Example: {"schema": "public", "table_name": "events"}.`, + }, + { + name: 'warehouse_source_id', + type: 'integer', + required: true, + description: `The numeric ID of the warehouse source (the connected Snowflake, BigQuery, Databricks, or Redshift warehouse) this import reads from. Warehouse sources are configured separately in Mixpanel under Lexicon > Warehouse Sources.`, + }, + { + name: 'databricks_params', + type: 'object', + required: false, + description: `Databricks-specific cluster configuration for this import, passed through to Mixpanel as-is. Only relevant when the underlying warehouse source is Databricks — omit for Snowflake, BigQuery, or Redshift sources. Check current Mixpanel documentation or an existing Databricks import (via 'mixpanelanalytics_warehouse_import_get') for the exact fields expected, such as a cluster id or SQL warehouse id.`, + }, + { + name: 'run_every', + type: 'integer', + required: false, + description: `How often this warehouse import syncs, in NANOSECONDS — not seconds or milliseconds. This unit is easy to get wrong: 86400000000000 nanoseconds = 1 day (86400 seconds × 1,000,000,000). Common values: 3600000000000 = hourly, 86400000000000 = daily, 604800000000000 = weekly. Omit to keep Mixpanel's default sync frequency for this import type.`, + }, + ], + }, + { + name: 'mixpanelanalytics_warehouse_import_create_people', + description: `Create a new warehouse import that syncs warehouse rows into Mixpanel as user profile updates (equivalent to Engage '$set'). Maps a warehouse table to Mixpanel user profiles using 'table_params' to select the source table/columns and 'user_column_name' to identify which column holds each profile's distinct_id. Requires a warehouse source to already be configured in Mixpanel (Lexicon > Warehouse Sources) — pass its id as 'warehouse_source_id'. Requires Warehouse Connectors to be enabled on your Mixpanel plan; without it, calls to this endpoint return a 403 Forbidden regardless of input.`, + params: [ + { + name: 'project_id', + type: 'string', + required: true, + description: `Your numeric Mixpanel Project ID, required to authenticate Service Account requests. Find it in Mixpanel under Project Settings > Overview.`, + }, + { + name: 'sync_mode', + type: 'string', + required: true, + description: `How this import stays in sync with the warehouse table over time, e.g. a full re-sync mode or an incremental mode based on a time column. Mixpanel's Warehouse Connectors API does not fully document every valid value for this import type in one place — the sibling lookup-table import accepts 'full_sync' or 'one_time', but event/people/group streaming imports may support additional incremental modes. Check your warehouse source configuration in the Mixpanel dashboard, or current Mixpanel documentation, to confirm the exact values accepted before relying on a value here.`, + }, + { + name: 'table_params', + type: 'object', + required: true, + description: `JSON object describing which warehouse table (and columns) this import reads from, e.g. the database, schema, and table name. The exact shape depends on your warehouse type (Snowflake, BigQuery, Databricks, or Redshift) and is passed through to Mixpanel as-is — check an existing import's configuration (via 'mixpanelanalytics_warehouse_import_get') or current Mixpanel documentation for the precise fields your warehouse type expects. Example: {"schema": "public", "table_name": "events"}.`, + }, + { + name: 'user_column_name', + type: 'string', + required: true, + description: `The name of the warehouse column containing the user identifier (Mixpanel distinct_id) that each row's profile updates apply to.`, + }, + { + name: 'warehouse_source_id', + type: 'integer', + required: true, + description: `The numeric ID of the warehouse source (the connected Snowflake, BigQuery, Databricks, or Redshift warehouse) this import reads from. Warehouse sources are configured separately in Mixpanel under Lexicon > Warehouse Sources.`, + }, + { + name: 'databricks_params', + type: 'object', + required: false, + description: `Databricks-specific cluster configuration for this import, passed through to Mixpanel as-is. Only relevant when the underlying warehouse source is Databricks — omit for Snowflake, BigQuery, or Redshift sources. Check current Mixpanel documentation or an existing Databricks import (via 'mixpanelanalytics_warehouse_import_get') for the exact fields expected, such as a cluster id or SQL warehouse id.`, + }, + { + name: 'insert_time_column_name', + type: 'string', + required: false, + description: `The name of a warehouse column marking when each row was inserted into the warehouse, used by Mixpanel to incrementally pick up only new rows on subsequent syncs instead of rescanning the whole table.`, + }, + { + name: 'json_properties_column_name', + type: 'string', + required: false, + description: `The name of a warehouse column containing a JSON blob of additional profile properties to merge into each imported profile, for schemas that store extra attributes as a single JSON column rather than one column per property.`, + }, + { + name: 'property_mappings', + type: 'object', + required: false, + description: `JSON object remapping warehouse column names to different Mixpanel property names on import, e.g. {"warehouse_col": "Mixpanel Property Name"}. Omit to import columns using their original warehouse column names.`, + }, + { + name: 'run_every', + type: 'integer', + required: false, + description: `How often this warehouse import syncs, in NANOSECONDS — not seconds or milliseconds. This unit is easy to get wrong: 86400000000000 nanoseconds = 1 day (86400 seconds × 1,000,000,000). Common values: 3600000000000 = hourly, 86400000000000 = daily, 604800000000000 = weekly. Omit to keep Mixpanel's default sync frequency for this import type.`, + }, + ], + }, + { + name: 'mixpanelanalytics_warehouse_import_delete', + description: `Delete a warehouse import's sync configuration, stopping future syncs. By default this only removes the connector configuration — data already imported into Mixpanel is kept. Set 'delete_data' to true to also permanently delete the data previously imported by this connector. Use 'mixpanelanalytics_warehouse_imports_list' to find the import_id first. This cannot be undone.`, + params: [ + { + name: 'import_id', + type: 'string', + required: true, + description: `The numeric ID of the warehouse import to operate on. Use 'mixpanelanalytics_warehouse_imports_list' to look up the id for each configured import.`, + }, + { + name: 'project_id', + type: 'string', + required: true, + description: `Your numeric Mixpanel Project ID, required to authenticate Service Account requests. Find it in Mixpanel under Project Settings > Overview.`, + }, + { + name: 'delete_data', + type: 'boolean', + required: false, + description: `If true, also permanently deletes the data previously imported into Mixpanel by this connector, not just the sync configuration. If false or omitted (default), only the import configuration is removed and previously imported data is kept.`, + }, + ], + }, + { + name: 'mixpanelanalytics_warehouse_import_get', + description: `Get the full configuration and current status of a single warehouse import by id, including its sync schedule ('run_every'), pause state, and warehouse-specific parameters. Use 'mixpanelanalytics_warehouse_imports_list' first to find the import_id.`, + params: [ + { + name: 'import_id', + type: 'string', + required: true, + description: `The numeric ID of the warehouse import to operate on. Use 'mixpanelanalytics_warehouse_imports_list' to look up the id for each configured import.`, + }, + { + name: 'project_id', + type: 'string', + required: true, + description: `Your numeric Mixpanel Project ID, required to authenticate Service Account requests. Find it in Mixpanel under Project Settings > Overview.`, + }, + ], + }, + { + name: 'mixpanelanalytics_warehouse_import_history', + description: `Get the history of past sync runs for a warehouse import, e.g. to check when it last ran, whether recent runs succeeded, and how long each run took. Use 'mixpanelanalytics_warehouse_imports_list' to find the import_id first.`, + params: [ + { + name: 'import_id', + type: 'string', + required: true, + description: `The numeric ID of the warehouse import to operate on. Use 'mixpanelanalytics_warehouse_imports_list' to look up the id for each configured import.`, + }, + { + name: 'project_id', + type: 'string', + required: true, + description: `Your numeric Mixpanel Project ID, required to authenticate Service Account requests. Find it in Mixpanel under Project Settings > Overview.`, + }, + ], + }, + { + name: 'mixpanelanalytics_warehouse_import_run_sync', + description: `Manually trigger an immediate sync run for a warehouse import, outside its configured schedule ('run_every'). Use this to pull the latest warehouse data on demand instead of waiting for the next scheduled run, e.g. after fixing an upstream data issue. Use 'mixpanelanalytics_warehouse_imports_list' to find the import_id first. Requires Warehouse Connectors to be enabled on your Mixpanel plan; without it, calls to this endpoint return a 403 Forbidden regardless of input.`, + params: [ + { + name: 'import_id', + type: 'string', + required: true, + description: `The numeric ID of the warehouse import to operate on. Use 'mixpanelanalytics_warehouse_imports_list' to look up the id for each configured import.`, + }, + { + name: 'project_id', + type: 'string', + required: true, + description: `Your numeric Mixpanel Project ID, required to authenticate Service Account requests. Find it in Mixpanel under Project Settings > Overview.`, + }, + ], + }, + { + name: 'mixpanelanalytics_warehouse_import_update', + description: `Pause, resume, or reschedule an existing warehouse import. Use this to stop a sync temporarily ('paused': true), resume it ('paused': false), change how often it runs ('run_every'), or update Databricks-specific cluster settings. Use 'mixpanelanalytics_warehouse_imports_list' or 'mixpanelanalytics_warehouse_import_get' to find the import_id first. This does not change what data the import reads — to change the source table or columns, delete and recreate the import.`, + params: [ + { + name: 'import_id', + type: 'string', + required: true, + description: `The numeric ID of the warehouse import to operate on. Use 'mixpanelanalytics_warehouse_imports_list' to look up the id for each configured import.`, + }, + { + name: 'paused', + type: 'boolean', + required: true, + description: `Whether this warehouse import's sync schedule is paused. Set to true to pause the sync (no new data will be imported until resumed), or false to resume or keep it actively running.`, + }, + { + name: 'project_id', + type: 'string', + required: true, + description: `Your numeric Mixpanel Project ID, required to authenticate Service Account requests. Find it in Mixpanel under Project Settings > Overview.`, + }, + { + name: 'run_every', + type: 'integer', + required: true, + description: `How often this warehouse import syncs, in NANOSECONDS — not seconds or milliseconds. This unit is easy to get wrong: 86400000000000 nanoseconds = 1 day (86400 seconds × 1,000,000,000). Common values: 3600000000000 = hourly, 86400000000000 = daily, 604800000000000 = weekly.`, + }, + { + name: 'databricks_params', + type: 'object', + required: false, + description: `Databricks-specific cluster configuration for this import, passed through to Mixpanel as-is. Only relevant when the underlying warehouse source is Databricks — omit for Snowflake, BigQuery, or Redshift sources. Check current Mixpanel documentation or an existing Databricks import (via 'mixpanelanalytics_warehouse_import_get') for the exact fields expected, such as a cluster id or SQL warehouse id.`, + }, + ], + }, + { + name: 'mixpanelanalytics_warehouse_imports_list', + description: `List all warehouse import connectors configured for a Mixpanel project, across every warehouse source (Snowflake, BigQuery, Databricks, Redshift). Each entry includes its import id, import type (event stream, people, groups, or lookup table), warehouse source, and current sync status — use the id with 'mixpanelanalytics_warehouse_import_get' or 'mixpanelanalytics_warehouse_import_update' to inspect or change a specific import.`, + params: [ + { + name: 'project_id', + type: 'string', + required: true, + description: `Your numeric Mixpanel Project ID, required to authenticate Service Account requests. Find it in Mixpanel under Project Settings > Overview.`, + }, + ], + }, +] diff --git a/src/data/agent-connectors/mixpanelcompliance.ts b/src/data/agent-connectors/mixpanelcompliance.ts new file mode 100644 index 000000000..22b1a6ce2 --- /dev/null +++ b/src/data/agent-connectors/mixpanelcompliance.ts @@ -0,0 +1,112 @@ +import type { Tool } from '../../types/agent-connectors' + +export const tools: Tool[] = [ + { + name: 'mixpanelcompliance_gdpr_deletion_cancel', + description: `Cancel a pending GDPR/CCPA data deletion request before Mixpanel begins permanently erasing the data. Returns no content on success. Cancellation can fail once the deletion has already progressed too far to stop — check 'mixpanelcompliance_gdpr_deletion_status' first if you're unsure, and be prepared for this call to be rejected once a deletion is underway.`, + params: [ + { + name: 'project_token', + type: 'string', + required: true, + description: `Your Mixpanel Project Token (Project Settings > Overview), identifying which project this request applies to. Sent as the 'token' query parameter. This is distinct from the GDPR Compliance Token used to authenticate this connection.`, + }, + { + name: 'tracking_id', + type: 'string', + required: true, + description: `The tracking ID returned by 'mixpanelcompliance_gdpr_deletion_create' when the deletion request was created.`, + }, + ], + }, + { + name: 'mixpanelcompliance_gdpr_deletion_create', + description: `Permanently delete ALL data Mixpanel holds for the given distinct_ids — every event and profile property, across all time. This is irreversible once processing completes, and per Mixpanel's GDPR/CCPA documentation it can take up to 30 days to fully propagate through Mixpanel's systems. Only call this to fulfill a genuine right-to-erasure request — never speculatively or for testing. Use 'mixpanelcompliance_gdpr_deletion_status' with the returned tracking_id to monitor progress, and 'mixpanelcompliance_gdpr_deletion_cancel' to attempt to stop it before processing starts.`, + params: [ + { + name: 'distinct_ids', + type: 'array', + required: true, + description: `The Mixpanel distinct_ids whose data will be PERMANENTLY deleted. This cannot be undone. Mixpanel accepts at most 1999 distinct_ids per deletion request — split larger batches into multiple calls.`, + }, + { + name: 'project_token', + type: 'string', + required: true, + description: `Your Mixpanel Project Token (Project Settings > Overview), identifying which project to run this request against. Sent as the 'token' query parameter. This is distinct from the GDPR Compliance Token used to authenticate this connection.`, + }, + { + name: 'compliance_type', + type: 'string', + required: false, + description: `The privacy regulation this request is being made under. Defaults to 'GDPR' when omitted.`, + }, + ], + }, + { + name: 'mixpanelcompliance_gdpr_deletion_status', + description: `Check the status of a GDPR/CCPA data deletion request previously created with 'mixpanelcompliance_gdpr_deletion_create'. The response's status field is one of: PENDING, STAGING, STARTED, SUCCESS, FAILURE, REVOKED, NOT_FOUND, or UNKNOWN. Deletions can take up to 30 days to reach SUCCESS. While a request is still PENDING or STAGING it may still be cancellable via 'mixpanelcompliance_gdpr_deletion_cancel'.`, + params: [ + { + name: 'project_token', + type: 'string', + required: true, + description: `Your Mixpanel Project Token (Project Settings > Overview), identifying which project to check this request against. Sent as the 'token' query parameter. This is distinct from the GDPR Compliance Token used to authenticate this connection.`, + }, + { + name: 'tracking_id', + type: 'string', + required: true, + description: `The tracking ID returned by 'mixpanelcompliance_gdpr_deletion_create' when the deletion request was created.`, + }, + ], + }, + { + name: 'mixpanelcompliance_gdpr_retrieval_create', + description: `Create a GDPR or CCPA Subject Access Request (SAR) for one or more Mixpanel distinct_ids. Mixpanel asynchronously compiles an export of every event and profile property it holds for the given distinct_ids so you can fulfill a data subject's access request. This call only queues the export — use 'mixpanelcompliance_gdpr_retrieval_status' with the returned tracking_id to poll for completion and get the download details.`, + params: [ + { + name: 'distinct_ids', + type: 'array', + required: true, + description: `The Mixpanel distinct_ids to retrieve all held data for. Mixpanel accepts at most 2000 distinct_ids per retrieval request — split larger batches into multiple calls.`, + }, + { + name: 'project_token', + type: 'string', + required: true, + description: `Your Mixpanel Project Token (Project Settings > Overview), identifying which project to run this request against. Sent as the 'token' query parameter. This is distinct from the GDPR Compliance Token used to authenticate this connection.`, + }, + { + name: 'compliance_type', + type: 'string', + required: false, + description: `The privacy regulation this request is being made under. Defaults to 'GDPR' when omitted.`, + }, + { + name: 'disclosure_type', + type: 'string', + required: false, + description: `The category of data to disclose. Required by Mixpanel when compliance_type is CCPA; ignored for GDPR requests.`, + }, + ], + }, + { + name: 'mixpanelcompliance_gdpr_retrieval_status', + description: `Check the status of a GDPR/CCPA data retrieval (Subject Access Request) previously created with 'mixpanelcompliance_gdpr_retrieval_create'. The response's status field is one of: PENDING, STAGING, STARTED, SUCCESS, FAILURE, REVOKED, NOT_FOUND, or UNKNOWN. Poll this until the status reaches SUCCESS (the export is ready), FAILURE, or REVOKED.`, + params: [ + { + name: 'project_token', + type: 'string', + required: true, + description: `Your Mixpanel Project Token (Project Settings > Overview), identifying which project to check this request against. Sent as the 'token' query parameter. This is distinct from the GDPR Compliance Token used to authenticate this connection.`, + }, + { + name: 'tracking_id', + type: 'string', + required: true, + description: `The tracking ID returned by 'mixpanelcompliance_gdpr_retrieval_create' when the retrieval request was created.`, + }, + ], + }, +] diff --git a/src/data/agent-connectors/mixpanelingestion.ts b/src/data/agent-connectors/mixpanelingestion.ts new file mode 100644 index 000000000..15387079e --- /dev/null +++ b/src/data/agent-connectors/mixpanelingestion.ts @@ -0,0 +1,856 @@ +import type { Tool } from '../../types/agent-connectors' + +export const tools: Tool[] = [ + { + name: 'mixpanelingestion_feature_flags_definitions', + description: `Get the full definitions of every feature flag/experiment configured in a Mixpanel project, including each flag's variants, rollout rules, and linked experiment. Provide either 'project_token' or 'project_id' to authenticate (project_id uses your Service Account credentials).`, + params: [ + { + name: 'project_id', + type: 'string', + required: false, + description: `Your numeric Mixpanel Project ID, used if authenticating with a Service Account. Provide this or 'project_token'.`, + }, + { + name: 'project_token', + type: 'string', + required: false, + description: `Your Mixpanel Project Token, used if authenticating without a Service Account. Provide this or 'project_id'.`, + }, + ], + }, + { + name: 'mixpanelingestion_feature_flags_evaluate', + description: `Evaluate all enabled Mixpanel feature flags and experiments for a given user, returning the variant each flag assigns them. Provide either 'project_token' or 'project_id' to authenticate (project_id uses your Service Account credentials).`, + params: [ + { + name: 'context', + type: 'object', + required: true, + description: `JSON object describing the user to evaluate flags for. Must include 'distinct_id'; may include 'device_id' and 'custom_properties' (used for targeting rules). Example: {"distinct_id": "user_00123", "custom_properties": {"plan": "pro"}}.`, + }, + { + name: 'project_id', + type: 'string', + required: false, + description: `Your numeric Mixpanel Project ID, used if authenticating with a Service Account. Provide this or 'project_token'.`, + }, + { + name: 'project_token', + type: 'string', + required: false, + description: `Your Mixpanel Project Token, used if authenticating without a Service Account. Provide this or 'project_id'.`, + }, + ], + }, + { + name: 'mixpanelingestion_group_batch_update', + description: `Send a batch of mixed group-profile updates to Mixpanel in a single call, analogous to 'mixpanelingestion_profile_batch_update' for user profiles. Each item in 'updates' is a fully-formed update object with its own "$token", "$group_key", "$group_id", and one operation key ($set, $set_once, $add, $union, $remove, $unset, or $delete). Example: [{"$token": "...", "$group_key": "Company", "$group_id": "Acme", "$set": {"Plan": "Enterprise"}}].`, + params: [ + { + name: 'updates', + type: 'array', + required: true, + description: `Array of fully-formed group update objects, each with $token, $group_key, $group_id, and one operation key ($set/$set_once/$add/$union/$remove/$unset/$delete).`, + }, + ], + }, + { + name: 'mixpanelingestion_group_delete', + description: `Permanently delete a Mixpanel group profile and all of its properties, analogous to 'mixpanelingestion_profile_delete' for user profiles. This does not delete historical events associated with the group.`, + params: [ + { + name: 'group_id', + type: 'string', + required: true, + description: `The value identifying this specific group, e.g. the company name or account ID.`, + }, + { + name: 'group_key', + type: 'string', + required: true, + description: `The name of the group key as configured in Mixpanel, e.g. "Company" or "Account ID".`, + }, + { + name: 'project_token', + type: 'string', + required: true, + description: `Your Mixpanel Project Token (Project Settings > Overview). Embedded in the payload to authenticate the request.`, + }, + { + name: 'verbose', + type: 'integer', + required: false, + description: `Set to 1 to receive a JSON object describing success/failure instead of a bare "1"/"0".`, + }, + ], + }, + { + name: 'mixpanelingestion_group_remove', + description: `Remove a specific value from a list-valued property on a Mixpanel group profile, analogous to 'mixpanelingestion_profile_remove' for user profiles. If the value is not present, no change is made.`, + params: [ + { + name: 'group_id', + type: 'string', + required: true, + description: `The value identifying this specific group, e.g. the company name or account ID.`, + }, + { + name: 'group_key', + type: 'string', + required: true, + description: `The name of the group key as configured in Mixpanel, e.g. "Company" or "Account ID".`, + }, + { + name: 'project_token', + type: 'string', + required: true, + description: `Your Mixpanel Project Token (Project Settings > Overview). Embedded in the payload to authenticate the request.`, + }, + { + name: 'removals', + type: 'object', + required: true, + description: `JSON object mapping list-property names to the single value to remove from each. Example: {"Enabled Features": "beta-search"}.`, + }, + { + name: 'ip', + type: 'integer', + required: false, + description: `Set to 1 to let Mixpanel geolocate the group profile from the request IP. Recommended to leave at 0 for server-side calls.`, + }, + { + name: 'strict', + type: 'integer', + required: false, + description: `Set to 1 to have Mixpanel validate the record and return per-record error messages if validation fails.`, + }, + { + name: 'verbose', + type: 'integer', + required: false, + description: `Set to 1 to receive a JSON object describing success/failure instead of a bare "1"/"0".`, + }, + ], + }, + { + name: 'mixpanelingestion_group_set', + description: `Set (overwrite) properties on a Mixpanel group profile (e.g. a company or team account), analogous to 'mixpanelingestion_profile_set' for user profiles. Creates the group profile if it does not already exist. Requires Group Analytics to be enabled on your Mixpanel project.`, + params: [ + { + name: 'group_id', + type: 'string', + required: true, + description: `The value identifying this specific group, e.g. the company name or account ID.`, + }, + { + name: 'group_key', + type: 'string', + required: true, + description: `The name of the group key as configured in Mixpanel, e.g. "Company" or "Account ID".`, + }, + { + name: 'project_token', + type: 'string', + required: true, + description: `Your Mixpanel Project Token (Project Settings > Overview). Embedded in the payload to authenticate the request.`, + }, + { + name: 'properties', + type: 'object', + required: true, + description: `JSON object of property names and values to set on the group profile, overwriting any existing values. Example: {"Plan": "Enterprise", "Seats": 50}.`, + }, + { + name: 'ip', + type: 'integer', + required: false, + description: `Set to 1 to let Mixpanel geolocate the group profile from the request IP. Recommended to leave at 0 for server-side calls.`, + }, + { + name: 'strict', + type: 'integer', + required: false, + description: `Set to 1 to have Mixpanel validate the record and return per-record error messages if validation fails.`, + }, + { + name: 'verbose', + type: 'integer', + required: false, + description: `Set to 1 to receive a JSON object describing success/failure instead of a bare "1"/"0".`, + }, + ], + }, + { + name: 'mixpanelingestion_group_set_once', + description: `Set properties on a Mixpanel group profile only if they are not already set — existing values are never overwritten, analogous to 'mixpanelingestion_profile_set_once' for user profiles. Creates the group profile if it does not already exist.`, + params: [ + { + name: 'group_id', + type: 'string', + required: true, + description: `The value identifying this specific group, e.g. the company name or account ID.`, + }, + { + name: 'group_key', + type: 'string', + required: true, + description: `The name of the group key as configured in Mixpanel, e.g. "Company" or "Account ID".`, + }, + { + name: 'project_token', + type: 'string', + required: true, + description: `Your Mixpanel Project Token (Project Settings > Overview). Embedded in the payload to authenticate the request.`, + }, + { + name: 'properties', + type: 'object', + required: true, + description: `JSON object of property names and values to set only if not already present on the group profile. Example: {"First Seen": "2026-01-01"}.`, + }, + { + name: 'ip', + type: 'integer', + required: false, + description: `Set to 1 to let Mixpanel geolocate the group profile from the request IP. Recommended to leave at 0 for server-side calls.`, + }, + { + name: 'strict', + type: 'integer', + required: false, + description: `Set to 1 to have Mixpanel validate the record and return per-record error messages if validation fails.`, + }, + { + name: 'verbose', + type: 'integer', + required: false, + description: `Set to 1 to receive a JSON object describing success/failure instead of a bare "1"/"0".`, + }, + ], + }, + { + name: 'mixpanelingestion_group_union', + description: `Add values to a list-valued property on a Mixpanel group profile, ensuring each value only appears once, analogous to 'mixpanelingestion_profile_union' for user profiles. Creates the group profile if it does not already exist.`, + params: [ + { + name: 'group_id', + type: 'string', + required: true, + description: `The value identifying this specific group, e.g. the company name or account ID.`, + }, + { + name: 'group_key', + type: 'string', + required: true, + description: `The name of the group key as configured in Mixpanel, e.g. "Company" or "Account ID".`, + }, + { + name: 'project_token', + type: 'string', + required: true, + description: `Your Mixpanel Project Token (Project Settings > Overview). Embedded in the payload to authenticate the request.`, + }, + { + name: 'unions', + type: 'object', + required: true, + description: `JSON object mapping list-property names to arrays of values to add (duplicates are not re-added). Example: {"Enabled Features": ["beta-search", "dark-mode"]}.`, + }, + { + name: 'ip', + type: 'integer', + required: false, + description: `Set to 1 to let Mixpanel geolocate the group profile from the request IP. Recommended to leave at 0 for server-side calls.`, + }, + { + name: 'strict', + type: 'integer', + required: false, + description: `Set to 1 to have Mixpanel validate the record and return per-record error messages if validation fails.`, + }, + { + name: 'verbose', + type: 'integer', + required: false, + description: `Set to 1 to receive a JSON object describing success/failure instead of a bare "1"/"0".`, + }, + ], + }, + { + name: 'mixpanelingestion_group_unset', + description: `Permanently remove one or more named properties (and their values) from a Mixpanel group profile, analogous to 'mixpanelingestion_profile_unset' for user profiles.`, + params: [ + { + name: 'group_id', + type: 'string', + required: true, + description: `The value identifying this specific group, e.g. the company name or account ID.`, + }, + { + name: 'group_key', + type: 'string', + required: true, + description: `The name of the group key as configured in Mixpanel, e.g. "Company" or "Account ID".`, + }, + { + name: 'project_token', + type: 'string', + required: true, + description: `Your Mixpanel Project Token (Project Settings > Overview). Embedded in the payload to authenticate the request.`, + }, + { + name: 'property_names', + type: 'array', + required: true, + description: `Array of property names to permanently remove from the group profile. Example: ["Trial Ends At"].`, + }, + { + name: 'ip', + type: 'integer', + required: false, + description: `Set to 1 to let Mixpanel geolocate the group profile from the request IP. Recommended to leave at 0 for server-side calls.`, + }, + { + name: 'strict', + type: 'integer', + required: false, + description: `Set to 1 to have Mixpanel validate the record and return per-record error messages if validation fails.`, + }, + { + name: 'verbose', + type: 'integer', + required: false, + description: `Set to 1 to receive a JSON object describing success/failure instead of a bare "1"/"0".`, + }, + ], + }, + { + name: 'mixpanelingestion_identity_create', + description: `Link an anonymous distinct_id to a known, identified distinct_id by sending a Mixpanel $identify event via /track. Use this the first time you learn a user's real identifier (e.g. after login or signup) so that pre-login and post-login activity is merged onto one profile. Returns the literal text "1" on success or "0" on failure.`, + params: [ + { + name: 'anon_id', + type: 'string', + required: true, + description: `The anonymous distinct_id that was used before the user was identified (mapped to $anon_id).`, + }, + { + name: 'identified_id', + type: 'string', + required: true, + description: `The known, identified distinct_id to link the anonymous ID to (mapped to $identified_id).`, + }, + { + name: 'project_token', + type: 'string', + required: true, + description: `Your Mixpanel Project Token (Project Settings > Overview). Embedded in the event payload to authenticate the request.`, + }, + ], + }, + { + name: 'mixpanelingestion_identity_create_alias', + description: `Create a legacy alias linking a new distinct_id to an existing one by sending a Mixpanel $create_alias event via /track. This is the legacy identity-linking mechanism; for new integrations prefer 'mixpanelingestion_identity_create' ($identify) or 'mixpanelingestion_identity_merge'. Returns the literal text "1" on success or "0" on failure.`, + params: [ + { + name: 'alias', + type: 'string', + required: true, + description: `The new alias distinct_id to associate with the existing distinct_id.`, + }, + { + name: 'distinct_id', + type: 'string', + required: true, + description: `The existing distinct_id that the alias should resolve to.`, + }, + { + name: 'project_token', + type: 'string', + required: true, + description: `Your Mixpanel Project Token (Project Settings > Overview). Embedded in the event payload to authenticate the request.`, + }, + ], + }, + { + name: 'mixpanelingestion_identity_merge', + description: `Merge two distinct_ids into a single identity using Mixpanel's modern Identity Merge API (a $merge event sent through /import, authenticated with your Service Account). All historical events and profile data from both distinct_ids are combined under one identity. Use this instead of the legacy 'mixpanelingestion_identity_create_alias' for new integrations. Requires your Mixpanel project to use 'Original ID Merge' (Project Settings > Identity Merge) — projects on 'Simplified ID Merge' reject $merge events outright ("identity events are not allowed when project is using simplified identity management"); use 'mixpanelingestion_identity_create_alias' instead on those projects.`, + params: [ + { + name: 'distinct_id_1', + type: 'string', + required: true, + description: `The first distinct_id to merge (order does not matter).`, + }, + { + name: 'distinct_id_2', + type: 'string', + required: true, + description: `The second distinct_id to merge (order does not matter).`, + }, + { + name: 'project_id', + type: 'string', + required: true, + description: `Your numeric Mixpanel Project ID, required to authenticate Service Account requests. Find it in Mixpanel under Project Settings > Overview.`, + }, + ], + }, + { + name: 'mixpanelingestion_import_events', + description: `Import a batch of up to 2000 events into Mixpanel via the modern, Service Account-authenticated /import endpoint. This is Mixpanel's recommended way to send events from a trusted server-side integration (unlike the classic /track endpoint). Each event needs an 'event' name and a 'properties' object containing at minimum 'time' (epoch seconds/ms), 'distinct_id', and '$insert_id' (a unique string used for deduplication). With strict=1 (default, recommended), Mixpanel validates every event and returns per-record errors for any that fail.`, + params: [ + { + name: 'events', + type: 'array', + required: true, + description: `Array of event objects to import (max 2000 per call, 10MB uncompressed total). Each object must have 'event' (string) and 'properties' (object) with 'properties.time' (epoch seconds/ms), 'properties.distinct_id', and 'properties.$insert_id' for deduplication, plus any custom properties. Example: [{"event": "Purchased", "properties": {"time": 1719859200, "distinct_id": "user_00123", "$insert_id": "a1b2c3", "amount": 19.99}}]`, + }, + { + name: 'project_id', + type: 'string', + required: true, + description: `Your numeric Mixpanel Project ID, required to authenticate Service Account requests. Find it in Mixpanel under Project Settings > Overview.`, + }, + { + name: 'strict', + type: 'string', + required: false, + description: `When "1" (recommended), Mixpanel validates the whole batch and returns per-event errors for any records that fail. When "0", invalid records are silently dropped.`, + }, + ], + }, + { + name: 'mixpanelingestion_lookup_table_replace', + description: `Replace the entire contents of a Mixpanel Lookup Table with new CSV data. This overwrites all existing rows in the table — use 'mixpanelingestion_lookup_tables_list' first to find the table's id. The first column of the CSV must be the table's key (matching the property it enriches); subsequent columns become additional properties joined onto matching events or profiles.`, + params: [ + { + name: 'csv_data', + type: 'string', + required: true, + description: `The full replacement contents of the lookup table as CSV text, including a header row. Example: "id,field1,field2\\nkey1,v1,z1\\nkey2,z1,z2\\n".`, + }, + { + name: 'project_id', + type: 'string', + required: true, + description: `Your numeric Mixpanel Project ID, required to authenticate Service Account requests. Find it in Mixpanel under Project Settings > Overview.`, + }, + { + name: 'table_id', + type: 'string', + required: true, + description: `The UUID of the lookup table to replace. Retrieve it with 'mixpanelingestion_lookup_tables_list' or from Lexicon under the lookup table's details.`, + }, + ], + }, + { + name: 'mixpanelingestion_lookup_tables_list', + description: `List the Lookup Tables defined in a Mixpanel project. Returns each table's id and name. Use the id with 'mixpanelingestion_lookup_table_replace' to update a table's contents, or find it in Lexicon under the lookup table's details.`, + params: [ + { + name: 'project_id', + type: 'string', + required: true, + description: `Your numeric Mixpanel Project ID, required to authenticate Service Account requests. Find it in Mixpanel under Project Settings > Overview.`, + }, + ], + }, + { + name: 'mixpanelingestion_profile_append', + description: `Append a value to a list-valued property on a Mixpanel user profile via Engage $append. If the property does not yet exist, it is created as a single-element list. Unlike $union, duplicate values are allowed. Useful for ordered logs like "Recent Searches".`, + params: [ + { + name: 'appends', + type: 'object', + required: true, + description: `JSON object mapping list-property names to the single value to append to each. Example: {"Recent Searches": "running shoes"}.`, + }, + { + name: 'distinct_id', + type: 'string', + required: true, + description: `The unique identifier of the profile to update.`, + }, + { + name: 'project_token', + type: 'string', + required: true, + description: `Your Mixpanel Project Token (Project Settings > Overview). Embedded in the payload to authenticate the request.`, + }, + { + name: 'ip', + type: 'integer', + required: false, + description: `Set to 1 to let Mixpanel geolocate the profile from the request IP. Recommended to leave at 0 for server-side calls.`, + }, + { + name: 'strict', + type: 'integer', + required: false, + description: `Set to 1 to have Mixpanel validate the record and return per-record error messages if validation fails.`, + }, + { + name: 'verbose', + type: 'integer', + required: false, + description: `Set to 1 to receive a JSON object describing success/failure instead of a bare "1"/"0".`, + }, + ], + }, + { + name: 'mixpanelingestion_profile_batch_update', + description: `Send a batch of mixed user-profile updates to Mixpanel Engage in a single call. Each item in 'updates' is a fully-formed update object with its own "$token", "$distinct_id", and one operation key ($set, $set_once, $add, $union, $append, $remove, $unset, or $delete) — the same shapes used by 'mixpanelingestion_profile_set' etc. Example: [{"$token": "...", "$distinct_id": "u1", "$set": {"Plan": "Pro"}}, {"$token": "...", "$distinct_id": "u2", "$add": {"Coins": 13}}]. Use this to reduce round trips when updating many profiles at once.`, + params: [ + { + name: 'updates', + type: 'array', + required: true, + description: `Array of fully-formed profile update objects, each with $token, $distinct_id, and one operation key ($set/$set_once/$add/$union/$append/$remove/$unset/$delete).`, + }, + ], + }, + { + name: 'mixpanelingestion_profile_delete', + description: `Permanently delete a Mixpanel user profile and all of its properties via Engage $delete. This does not delete the user's historical events, only their profile. If duplicate profiles exist due to identity merging, set 'ignore_alias' to true so you don't accidentally delete the original profile when the distinct_id passed in is actually an alias.`, + params: [ + { + name: 'distinct_id', + type: 'string', + required: true, + description: `The unique identifier of the profile to permanently delete.`, + }, + { + name: 'project_token', + type: 'string', + required: true, + description: `Your Mixpanel Project Token (Project Settings > Overview). Embedded in the payload to authenticate the request.`, + }, + { + name: 'ignore_alias', + type: 'boolean', + required: false, + description: `Set to true if the distinct_id may be an alias, to avoid deleting the original profile it resolves to.`, + }, + { + name: 'strict', + type: 'integer', + required: false, + description: `Set to 1 to have Mixpanel validate the record and return per-record error messages if validation fails.`, + }, + { + name: 'verbose', + type: 'integer', + required: false, + description: `Set to 1 to receive a JSON object describing success/failure instead of a bare "1"/"0".`, + }, + ], + }, + { + name: 'mixpanelingestion_profile_increment', + description: `Increment (or decrement, using a negative value) numeric properties on a Mixpanel user profile via Engage $add. The given amounts are added to the existing values; if a property is not yet present it is treated as 0. Useful for counters such as "Number of Logins" or "Files Uploaded".`, + params: [ + { + name: 'distinct_id', + type: 'string', + required: true, + description: `The unique identifier of the profile to update.`, + }, + { + name: 'increments', + type: 'object', + required: true, + description: `JSON object mapping property names to numeric amounts to add (use a negative number to decrement). Example: {"Number of Logins": 1, "Credits": -5}.`, + }, + { + name: 'project_token', + type: 'string', + required: true, + description: `Your Mixpanel Project Token (Project Settings > Overview). Embedded in the payload to authenticate the request.`, + }, + { + name: 'ip', + type: 'integer', + required: false, + description: `Set to 1 to let Mixpanel geolocate the profile from the request IP. Recommended to leave at 0 for server-side calls.`, + }, + { + name: 'strict', + type: 'integer', + required: false, + description: `Set to 1 to have Mixpanel validate the record and return per-record error messages if validation fails.`, + }, + { + name: 'verbose', + type: 'integer', + required: false, + description: `Set to 1 to receive a JSON object describing success/failure instead of a bare "1"/"0".`, + }, + ], + }, + { + name: 'mixpanelingestion_profile_remove', + description: `Remove a specific value from a list-valued property on a Mixpanel user profile via Engage $remove. If the value is not present, no change is made. The opposite of 'mixpanelingestion_profile_append'.`, + params: [ + { + name: 'distinct_id', + type: 'string', + required: true, + description: `The unique identifier of the profile to update.`, + }, + { + name: 'project_token', + type: 'string', + required: true, + description: `Your Mixpanel Project Token (Project Settings > Overview). Embedded in the payload to authenticate the request.`, + }, + { + name: 'removals', + type: 'object', + required: true, + description: `JSON object mapping list-property names to the single value to remove from each. Example: {"Recent Searches": "running shoes"}.`, + }, + { + name: 'ip', + type: 'integer', + required: false, + description: `Set to 1 to let Mixpanel geolocate the profile from the request IP. Recommended to leave at 0 for server-side calls.`, + }, + { + name: 'strict', + type: 'integer', + required: false, + description: `Set to 1 to have Mixpanel validate the record and return per-record error messages if validation fails.`, + }, + { + name: 'verbose', + type: 'integer', + required: false, + description: `Set to 1 to receive a JSON object describing success/failure instead of a bare "1"/"0".`, + }, + ], + }, + { + name: 'mixpanelingestion_profile_set', + description: `Set (overwrite) properties on a Mixpanel user profile via Engage $set. Creates the profile if it does not already exist. Use this for properties that should always reflect the latest value, such as "Plan" or "Last Login". For properties that should only be set the first time, use 'mixpanelingestion_profile_set_once' instead.`, + params: [ + { + name: 'distinct_id', + type: 'string', + required: true, + description: `The unique identifier of the profile to update.`, + }, + { + name: 'project_token', + type: 'string', + required: true, + description: `Your Mixpanel Project Token (Project Settings > Overview). Embedded in the payload to authenticate the request.`, + }, + { + name: 'properties', + type: 'object', + required: true, + description: `JSON object of property names and values to set on the profile, overwriting any existing values. Example: {"Plan": "Pro", "$email": "user@example.com"}.`, + }, + { + name: 'ip', + type: 'integer', + required: false, + description: `Set to 1 to let Mixpanel geolocate the profile from the request IP. Recommended to leave at 0 for server-side calls to avoid overwriting the profile's real geolocation with your server's location.`, + }, + { + name: 'strict', + type: 'integer', + required: false, + description: `Set to 1 to have Mixpanel validate the record and return per-record error messages if validation fails.`, + }, + { + name: 'verbose', + type: 'integer', + required: false, + description: `Set to 1 to receive a JSON object describing success/failure instead of a bare "1"/"0".`, + }, + ], + }, + { + name: 'mixpanelingestion_profile_set_once', + description: `Set properties on a Mixpanel user profile via Engage $set_once, but only if they are not already set — existing values are never overwritten. Creates the profile if it does not already exist. Useful for properties like "First Login Date" that should be recorded once and never changed.`, + params: [ + { + name: 'distinct_id', + type: 'string', + required: true, + description: `The unique identifier of the profile to update.`, + }, + { + name: 'project_token', + type: 'string', + required: true, + description: `Your Mixpanel Project Token (Project Settings > Overview). Embedded in the payload to authenticate the request.`, + }, + { + name: 'properties', + type: 'object', + required: true, + description: `JSON object of property names and values to set only if not already present on the profile. Example: {"First Login Date": "2026-06-01"}.`, + }, + { + name: 'ip', + type: 'integer', + required: false, + description: `Set to 1 to let Mixpanel geolocate the profile from the request IP. Recommended to leave at 0 for server-side calls.`, + }, + { + name: 'strict', + type: 'integer', + required: false, + description: `Set to 1 to have Mixpanel validate the record and return per-record error messages if validation fails.`, + }, + { + name: 'verbose', + type: 'integer', + required: false, + description: `Set to 1 to receive a JSON object describing success/failure instead of a bare "1"/"0".`, + }, + ], + }, + { + name: 'mixpanelingestion_profile_union', + description: `Add values to a list-valued property on a Mixpanel user profile via Engage $union, ensuring each value only appears once in the resulting list. Creates the profile if it does not already exist. Useful for properties like "Purchased Categories" that accumulate unique values over time.`, + params: [ + { + name: 'distinct_id', + type: 'string', + required: true, + description: `The unique identifier of the profile to update.`, + }, + { + name: 'project_token', + type: 'string', + required: true, + description: `Your Mixpanel Project Token (Project Settings > Overview). Embedded in the payload to authenticate the request.`, + }, + { + name: 'unions', + type: 'object', + required: true, + description: `JSON object mapping list-property names to arrays of values to add (duplicates are not re-added). Example: {"Purchased Categories": ["Books", "Electronics"]}.`, + }, + { + name: 'ip', + type: 'integer', + required: false, + description: `Set to 1 to let Mixpanel geolocate the profile from the request IP. Recommended to leave at 0 for server-side calls.`, + }, + { + name: 'strict', + type: 'integer', + required: false, + description: `Set to 1 to have Mixpanel validate the record and return per-record error messages if validation fails.`, + }, + { + name: 'verbose', + type: 'integer', + required: false, + description: `Set to 1 to receive a JSON object describing success/failure instead of a bare "1"/"0".`, + }, + ], + }, + { + name: 'mixpanelingestion_profile_unset', + description: `Permanently remove one or more named properties (and their values) from a Mixpanel user profile via Engage $unset. This deletes the properties themselves, not the profile — use 'mixpanelingestion_profile_delete' to delete the whole profile.`, + params: [ + { + name: 'distinct_id', + type: 'string', + required: true, + description: `The unique identifier of the profile to update.`, + }, + { + name: 'project_token', + type: 'string', + required: true, + description: `Your Mixpanel Project Token (Project Settings > Overview). Embedded in the payload to authenticate the request.`, + }, + { + name: 'property_names', + type: 'array', + required: true, + description: `Array of property names to permanently remove from the profile. Example: ["$email", "Trial Ends At"].`, + }, + { + name: 'ip', + type: 'integer', + required: false, + description: `Set to 1 to let Mixpanel geolocate the profile from the request IP. Recommended to leave at 0 for server-side calls.`, + }, + { + name: 'strict', + type: 'integer', + required: false, + description: `Set to 1 to have Mixpanel validate the record and return per-record error messages if validation fails.`, + }, + { + name: 'verbose', + type: 'integer', + required: false, + description: `Set to 1 to receive a JSON object describing success/failure instead of a bare "1"/"0".`, + }, + ], + }, + { + name: 'mixpanelingestion_track_event', + description: `Send a single event to Mixpanel via the classic /track endpoint, authenticated with your Mixpanel Project Token (not your Service Account). Use this for lightweight, fire-and-forget event tracking. For reliable server-side ingestion with validation and duplicate protection, prefer 'mixpanelingestion_import_events' instead. Returns the literal text "1" on success or "0" on failure unless 'verbose' is set to 1.`, + params: [ + { + name: 'event', + type: 'string', + required: true, + description: `The name of the event to track, e.g. "Signed up" or "Purchased item".`, + }, + { + name: 'project_token', + type: 'string', + required: true, + description: `Your Mixpanel Project Token (Project Settings > Overview). This is embedded in the event payload and is how /track authenticates the request — it is not your Service Account.`, + }, + { + name: 'distinct_id', + type: 'string', + required: false, + description: `The unique identifier of the user who performed the event. If omitted and 'ip' is set to 1, Mixpanel derives one from the request IP.`, + }, + { + name: 'insert_id', + type: 'string', + required: false, + description: `A unique identifier for this event used for deduplication (mapped to $insert_id). Events with identical (event, time, distinct_id, insert_id) are deduplicated; only the latest is kept. Max 36 bytes, alphanumeric or dash.`, + }, + { + name: 'ip', + type: 'integer', + required: false, + description: `Set to 1 to have Mixpanel derive geolocation and distinct_id from the request's IP address. Recommended to leave at 0 for server-side calls to avoid attributing your server's location to the event.`, + }, + { + name: 'profile_properties', + type: 'object', + required: false, + description: `Additional custom event properties to merge into the event's properties object, as a JSON object. Example: {"Plan": "Pro", "Referrer": "google"}.`, + }, + { + name: 'time', + type: 'integer', + required: false, + description: `The time the event occurred, in seconds or milliseconds since the UTC epoch. If omitted, Mixpanel uses the ingestion time. Future timestamps are overwritten with the current time.`, + }, + { + name: 'verbose', + type: 'integer', + required: false, + description: `Set to 1 to receive a JSON object describing success/failure instead of a bare "1"/"0".`, + }, + ], + }, +] diff --git a/src/data/agent-connectors/stripe.ts b/src/data/agent-connectors/stripe.ts new file mode 100644 index 000000000..3b840a8ae --- /dev/null +++ b/src/data/agent-connectors/stripe.ts @@ -0,0 +1,3461 @@ +import type { Tool } from '../../types/agent-connectors' + +export const tools: Tool[] = [ + { + name: 'stripe_accept_quote_dahlia', + description: `Accept a finalized Quote. Converts it into a subscription or invoice.`, + params: [ + { + name: 'quote', + type: 'string', + required: true, + description: `The ID of the quote to accept.`, + }, + ], + }, + { + name: 'stripe_attach_payment_method_dahlia', + description: `Attach a PaymentMethod to a Customer.`, + params: [ + { + name: 'customer', + type: 'string', + required: true, + description: `The ID of the customer to attach the PaymentMethod to.`, + }, + { + name: 'id', + type: 'string', + required: true, + description: `The ID of the PaymentMethod to attach.`, + }, + ], + }, + { + name: 'stripe_cancel_payment_intent_dahlia', + description: `Cancels a PaymentIntent object when it's in a cancellable state. Depending on the payment method, it may be possible to cancel a PaymentIntent once it has been confirmed and is in requires_capture state.`, + params: [ + { + name: 'payment_intent_id', + type: 'string', + required: true, + description: `The ID of the PaymentIntent to cancel.`, + }, + { + name: 'cancellation_reason', + type: 'string', + required: false, + description: `Reason for canceling this PaymentIntent.`, + }, + ], + }, + { + name: 'stripe_cancel_payout_dahlia', + description: `Cancel a payout that has not yet been paid out. Only cancels payouts with status 'pending'.`, + params: [ + { + name: 'payout', + type: 'string', + required: true, + description: `The ID of the payout to cancel.`, + }, + ], + }, + { + name: 'stripe_cancel_quote_dahlia', + description: `Cancel a Quote that has been finalized but not yet accepted.`, + params: [ + { + name: 'quote', + type: 'string', + required: true, + description: `The ID of the quote to cancel.`, + }, + ], + }, + { + name: 'stripe_cancel_setup_intent_dahlia', + description: `Cancel a SetupIntent that has not been confirmed.`, + params: [ + { + name: 'setup_intent_id', + type: 'string', + required: true, + description: `The ID of the SetupIntent to cancel.`, + }, + { + name: 'cancellation_reason', + type: 'string', + required: false, + description: `The reason for canceling the SetupIntent.`, + }, + ], + }, + { + name: 'stripe_cancel_subscription_dahlia', + description: `Cancels a customer's subscription immediately. The customer will not be charged again for the subscription. By default the subscription is canceled immediately but if prorate is set, any remaining charges are refunded.`, + params: [ + { + name: 'subscription_id', + type: 'string', + required: true, + description: `The ID of the subscription to cancel.`, + }, + { + name: 'cancellation_details', + type: 'object', + required: false, + description: `Details about why this subscription was cancelled.`, + }, + { + name: 'invoice_now', + type: 'boolean', + required: false, + description: `Will generate a final invoice that charges for any un-invoiced metered usage.`, + }, + { + name: 'prorate', + type: 'boolean', + required: false, + description: `Will generate a proration invoice item that credits remaining unused time until the subscription period end.`, + }, + ], + }, + { + name: 'stripe_close_dispute_dahlia', + description: `Close a dispute and accept the chargeback. This cannot be undone.`, + params: [ + { + name: 'dispute', + type: 'string', + required: true, + description: `The ID of the dispute to close.`, + }, + ], + }, + { + name: 'stripe_confirm_payment_intent_dahlia', + description: `Confirm that your customer intends to pay with current or provided payment method. Upon confirmation, the PaymentIntent will attempt to initiate a payment. If the payment method requires action (3DS, redirect), the PaymentIntent will move to requires_action.`, + params: [ + { + name: 'payment_intent_id', + type: 'string', + required: true, + description: `The ID of the PaymentIntent to confirm.`, + }, + { + name: 'payment_method', + type: 'string', + required: false, + description: `ID of the payment method to confirm with.`, + }, + { + name: 'return_url', + type: 'string', + required: false, + description: `The URL to redirect the customer to after payment completion.`, + }, + ], + }, + { + name: 'stripe_confirm_setup_intent_dahlia', + description: `Confirm a SetupIntent and attempt to collect a payment method for future use.`, + params: [ + { + name: 'setup_intent_id', + type: 'string', + required: true, + description: `The ID of the SetupIntent to confirm.`, + }, + { + name: 'payment_method', + type: 'string', + required: false, + description: `ID of the payment method to attach to this SetupIntent.`, + }, + { + name: 'return_url', + type: 'string', + required: false, + description: `The URL to redirect to after the SetupIntent is confirmed.`, + }, + ], + }, + { + name: 'stripe_create_checkout_session_dahlia', + description: `Create a Checkout Session to accept one-time or subscription payments via Stripe-hosted page.`, + params: [ + { + name: 'mode', + type: 'string', + required: true, + description: `The mode of the Checkout Session.`, + }, + { + name: 'success_url', + type: 'string', + required: true, + description: `The URL the customer will be redirected to after a successful payment.`, + }, + { + name: 'cancel_url', + type: 'string', + required: false, + description: `The URL the customer will be redirected to if they cancel the payment.`, + }, + { + name: 'currency', + type: 'string', + required: false, + description: `Three-letter ISO currency code (e.g., usd, eur, gbp).`, + }, + { + name: 'customer', + type: 'string', + required: false, + description: `ID of an existing Customer to associate with this session.`, + }, + { + name: 'customer_email', + type: 'string', + required: false, + description: `If provided, this value will be used when the customer has not provided an email address.`, + }, + { + name: 'line_items', + type: 'array', + required: false, + description: `Array of line items for this Checkout Session. Each item is a JSON object with fields: price (Stripe Price ID) and quantity. Required for payment/subscription mode.`, + }, + { + name: 'metadata', + type: 'object', + required: false, + description: `Set of key-value pairs to attach to the Checkout Session.`, + }, + ], + }, + { + name: 'stripe_create_coupon_dahlia', + description: `Create a coupon that can be redeemed for a discount on subscriptions or one-time charges.`, + params: [ + { + name: 'duration', + type: 'string', + required: true, + description: `How long the discount will be in effect. 'once' applies to the first charge, 'repeating' applies for duration_in_months, 'forever' applies indefinitely.`, + }, + { + name: 'amount_off', + type: 'integer', + required: false, + description: `Fixed amount discount in the smallest currency unit (e.g. cents). Requires currency. Use this OR percent_off.`, + }, + { + name: 'currency', + type: 'string', + required: false, + description: `Three-letter ISO currency code. Required when amount_off is set.`, + }, + { + name: 'duration_in_months', + type: 'integer', + required: false, + description: `Number of months the discount applies when duration is repeating.`, + }, + { + name: 'id', + type: 'string', + required: false, + description: `Unique identifier for the coupon. If not provided, Stripe generates a random ID.`, + }, + { + name: 'max_redemptions', + type: 'integer', + required: false, + description: `Maximum number of times this coupon can be redeemed in total.`, + }, + { + name: 'metadata', + type: 'object', + required: false, + description: `Set of key-value pairs for storing additional information.`, + }, + { + name: 'name', + type: 'string', + required: false, + description: `Name of the coupon displayed to customers.`, + }, + { + name: 'percent_off', + type: 'number', + required: false, + description: `Percentage discount to apply. Use this OR amount_off, not both.`, + }, + { + name: 'redeem_by', + type: 'integer', + required: false, + description: `Unix timestamp after which the coupon can no longer be redeemed.`, + }, + ], + }, + { + name: 'stripe_create_customer_dahlia', + description: `Creates a new customer object. Use this to store a customer's payment and billing details. The customer object allows you to perform recurring charges and track multiple charges associated with the same customer.`, + params: [ + { + name: 'address', + type: 'object', + required: false, + description: `The customer's address as a JSON object with fields: line1, line2, city, state, postal_code, country.`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `An arbitrary string that you can attach to a customer object. It is displayed alongside the customer in the dashboard.`, + }, + { + name: 'email', + type: 'string', + required: false, + description: `Customer's email address. It is displayed alongside the customer in the dashboard and can be useful for searching and tracking.`, + }, + { + name: 'metadata', + type: 'object', + required: false, + description: `Set of key-value pairs that you can attach to an object. Useful for storing additional information about the customer.`, + }, + { + name: 'name', + type: 'string', + required: false, + description: `The customer's full name or business name.`, + }, + { + name: 'payment_method', + type: 'string', + required: false, + description: `The ID of the PaymentMethod to attach to the customer.`, + }, + { + name: 'phone', + type: 'string', + required: false, + description: `The customer's phone number.`, + }, + { + name: 'shipping', + type: 'object', + required: false, + description: `The customer's shipping information as a JSON object with name, address, and optional phone fields.`, + }, + { + name: 'tax_exempt', + type: 'string', + required: false, + description: `The customer's tax exemption status. One of: none, exempt, or reverse.`, + }, + ], + }, + { + name: 'stripe_create_customer_portal_session_dahlia', + description: `Creates a session of the customer portal. A portal session describes the instantiation of the customer portal for a particular customer. By visiting the session's URL, the customer can manage their subscriptions and billing details. Portal sessions are short-lived and will expire if the customer does not visit the URL.`, + params: [ + { + name: 'customer', + type: 'string', + required: true, + description: `The ID of an existing customer`, + }, + { + name: 'configuration', + type: 'string', + required: false, + description: `The ID of an existing configuration to use for this session`, + }, + { + name: 'locale', + type: 'string', + required: false, + description: `The IETF language tag of the locale customer portal is displayed in`, + }, + { + name: 'on_behalf_of', + type: 'string', + required: false, + description: `The \`on_behalf_of\` account to use for this session`, + }, + { + name: 'return_url', + type: 'string', + required: false, + description: `The default URL to redirect customers to when they click on the portal's link to return to your website`, + }, + ], + }, + { + name: 'stripe_create_invoice_dahlia', + description: `This endpoint creates a draft invoice for a given customer. The draft invoice created pulls in all pending invoice items on that customer, including prorations. The invoice remains a draft until you finalize the invoice, which allows you to pay, send, and delete the invoice.`, + params: [ + { + name: 'customer', + type: 'string', + required: true, + description: `The ID of the customer to bill.`, + }, + { + name: 'auto_advance', + type: 'boolean', + required: false, + description: `Controls whether Stripe performs automatic collection of the invoice.`, + }, + { + name: 'collection_method', + type: 'string', + required: false, + description: `Either charge_automatically or send_invoice.`, + }, + { + name: 'currency', + type: 'string', + required: false, + description: `Three-letter ISO currency code.`, + }, + { + name: 'days_until_due', + type: 'integer', + required: false, + description: `The number of days from when the invoice is created until it is due (send_invoice only).`, + }, + { + name: 'default_payment_method', + type: 'string', + required: false, + description: `ID of the default payment method for this invoice.`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `An arbitrary string attached to the invoice.`, + }, + { + name: 'footer', + type: 'string', + required: false, + description: `Footer text displayed on the invoice.`, + }, + { + name: 'metadata', + type: 'object', + required: false, + description: `Set of key-value pairs to attach to the invoice.`, + }, + { + name: 'pending_invoice_items_behavior', + type: 'string', + required: false, + description: `Controls whether the customer's pending invoice items are attached to this invoice.`, + }, + { + name: 'subscription', + type: 'string', + required: false, + description: `The ID of the subscription to invoice.`, + }, + ], + }, + { + name: 'stripe_create_invoice_item_dahlia', + description: `Create an invoice item to be added to a pending invoice.`, + params: [ + { + name: 'currency', + type: 'string', + required: true, + description: `Three-letter ISO currency code for the invoice item.`, + }, + { + name: 'customer', + type: 'string', + required: true, + description: `The ID of the customer to create the invoice item for.`, + }, + { + name: 'amount', + type: 'integer', + required: false, + description: `The amount in the smallest currency unit (e.g. cents for USD).`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `An arbitrary string describing the invoice item.`, + }, + { + name: 'invoice', + type: 'string', + required: false, + description: `The ID of an existing invoice to attach this item to.`, + }, + { + name: 'price', + type: 'string', + required: false, + description: `The ID of a Price to use for this invoice item.`, + }, + { + name: 'quantity', + type: 'integer', + required: false, + description: `Non-negative integer quantity of units for this invoice item.`, + }, + ], + }, + { + name: 'stripe_create_payment_intent_dahlia', + description: `Creates a PaymentIntent object. After the PaymentIntent is created, attach a payment method and confirm to continue the payment. You can also create and confirm a PaymentIntent in a single step by using the confirm parameter.`, + params: [ + { + name: 'amount', + type: 'integer', + required: true, + description: `Amount intended to be collected in the smallest currency unit (e.g., 100 cents for $1.00 USD).`, + }, + { + name: 'currency', + type: 'string', + required: true, + description: `Three-letter ISO currency code (lowercase, e.g., usd, eur, gbp).`, + }, + { + name: 'capture_method', + type: 'string', + required: false, + description: `Controls when the funds will be captured from the customer's account.`, + }, + { + name: 'confirm', + type: 'boolean', + required: false, + description: `Set to true to attempt to confirm this PaymentIntent immediately after creation.`, + }, + { + name: 'customer', + type: 'string', + required: false, + description: `ID of the Customer this PaymentIntent belongs to, if one exists.`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `An arbitrary string attached to the object. Often useful for displaying to users.`, + }, + { + name: 'metadata', + type: 'object', + required: false, + description: `Set of key-value pairs that you can attach to an object.`, + }, + { + name: 'payment_method', + type: 'string', + required: false, + description: `ID of the payment method to attach to this PaymentIntent.`, + }, + { + name: 'payment_method_types', + type: 'array', + required: false, + description: `The payment method types to allow for this PaymentIntent (e.g. ["card"], ["card", "sepa_debit"]). Stripe's API requires this as an array, even for a single type.`, + }, + { + name: 'receipt_email', + type: 'string', + required: false, + description: `Email address to send the receipt to after successful payment.`, + }, + { + name: 'return_url', + type: 'string', + required: false, + description: `The URL to redirect to after payment is confirmed (used when confirm=true).`, + }, + { + name: 'statement_descriptor', + type: 'string', + required: false, + description: `Text shown on the customer's bank or card statement (max 22 characters).`, + }, + ], + }, + { + name: 'stripe_create_payment_method_dahlia', + description: `Create a PaymentMethod object. Attach it to a Customer to enable reusable payment.`, + params: [ + { + name: 'type', + type: 'string', + required: true, + description: `The type of payment method to create. Excludes 'link': Stripe rejects direct creation of a link PaymentMethod ("You cannot create a type \`link\` PaymentMethod directly") regardless of input — it can only be obtained via other flows (e.g. an automatic_payment_methods-enabled PaymentIntent/SetupIntent).`, + }, + { + name: 'billing_details', + type: 'object', + required: false, + description: `Billing information associated with the PaymentMethod, as a JSON object with fields: name, email, phone.`, + }, + { + name: 'card', + type: 'object', + required: false, + description: `Card details (for type=card), as a JSON object with fields: number, exp_month, exp_year, cvc. Use Stripe test numbers like 4242424242424242.`, + }, + { + name: 'metadata', + type: 'object', + required: false, + description: `Set of key-value pairs to attach to the PaymentMethod.`, + }, + ], + }, + { + name: 'stripe_create_payout_dahlia', + description: `Create a payout to send funds to a bank account or debit card.`, + params: [ + { + name: 'amount', + type: 'integer', + required: true, + description: `Amount in the smallest currency unit (e.g., cents for USD). Must be a positive integer.`, + }, + { + name: 'currency', + type: 'string', + required: true, + description: `Three-letter ISO 4217 currency code for the payout.`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `An arbitrary string to describe the payout.`, + }, + { + name: 'destination', + type: 'string', + required: false, + description: `The ID of a bank account or debit card to send the payout to.`, + }, + { + name: 'method', + type: 'string', + required: false, + description: `The method used to send the payout. 'standard' (bank transfer) or 'instant' (instant payout to debit card).`, + }, + { + name: 'statement_descriptor', + type: 'string', + required: false, + description: `A string that appears on the recipient's bank statement (max 22 characters).`, + }, + ], + }, + { + name: 'stripe_create_plan_dahlia', + description: `Create a Plan (legacy billing API). Consider using Prices instead for new integrations.`, + params: [ + { + name: 'amount', + type: 'integer', + required: true, + description: `Amount to charge per billing interval, in the smallest currency unit (e.g. cents for USD).`, + }, + { + name: 'currency', + type: 'string', + required: true, + description: `Three-letter ISO currency code (lowercase) for the plan.`, + }, + { + name: 'interval', + type: 'string', + required: true, + description: `Billing frequency for the plan.`, + }, + { + name: 'product', + type: 'string', + required: true, + description: `The product ID (or inline product object) this plan belongs to.`, + }, + { + name: 'id', + type: 'string', + required: false, + description: `An optional custom identifier for the plan. Must be unique.`, + }, + { + name: 'interval_count', + type: 'integer', + required: false, + description: `Number of intervals between billings. For example, interval=month and interval_count=3 means every 3 months.`, + }, + { + name: 'nickname', + type: 'string', + required: false, + description: `A friendly name for the plan shown in the Stripe dashboard.`, + }, + { + name: 'trial_period_days', + type: 'integer', + required: false, + description: `Number of trial period days granted when subscribing to this plan.`, + }, + ], + }, + { + name: 'stripe_create_price_dahlia', + description: `Creates a new price for an existing product. Prices define how much and how often to charge for products. This includes one-time prices and recurring prices for subscriptions.`, + params: [ + { + name: 'currency', + type: 'string', + required: true, + description: `Three-letter ISO currency code.`, + }, + { + name: 'active', + type: 'boolean', + required: false, + description: `Whether the price can be used for new purchases. Defaults to true.`, + }, + { + name: 'billing_scheme', + type: 'string', + required: false, + description: `Describes how to compute the price per period. Either per_unit or tiered.`, + }, + { + name: 'lookup_key', + type: 'string', + required: false, + description: `A lookup key used to retrieve prices dynamically from a static string.`, + }, + { + name: 'metadata', + type: 'object', + required: false, + description: `Set of key-value pairs to attach to the price.`, + }, + { + name: 'nickname', + type: 'string', + required: false, + description: `A brief description of the price, hidden from customers.`, + }, + { + name: 'product', + type: 'string', + required: false, + description: `The ID of the product that this price will belong to.`, + }, + { + name: 'recurring', + type: 'object', + required: false, + description: `Recurring billing details as a JSON object with fields: interval (day, week, month, year) and optional interval_count. Omit for a one-time price.`, + }, + { + name: 'tax_behavior', + type: 'string', + required: false, + description: `Specifies whether the price is considered inclusive of taxes or exclusive of taxes.`, + }, + { + name: 'unit_amount', + type: 'integer', + required: false, + description: `A positive integer in cents (or 0 for a free price) representing how much to charge.`, + }, + ], + }, + { + name: 'stripe_create_product_dahlia', + description: `Creates a new product object. Products describe the specific goods or services you offer to your customers. Products are used in conjunction with Prices to configure how much and how often you charge customers.`, + params: [ + { + name: 'name', + type: 'string', + required: true, + description: `The product's name, meant to be displayable to the customer.`, + }, + { + name: 'active', + type: 'boolean', + required: false, + description: `Whether the product is currently available for purchase. Defaults to true.`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `The product's description, meant to be displayable to the customer. Use this field to optionally store a long form explanation of the product.`, + }, + { + name: 'images', + type: 'array', + required: false, + description: `A list of up to 8 URLs of images for this product.`, + }, + { + name: 'metadata', + type: 'object', + required: false, + description: `Set of key-value pairs to attach to the product.`, + }, + { + name: 'shippable', + type: 'boolean', + required: false, + description: `Whether this product is shipped (i.e., physical goods).`, + }, + { + name: 'statement_descriptor', + type: 'string', + required: false, + description: `An arbitrary string to be displayed on your customer's credit card or bank statement.`, + }, + { + name: 'tax_code', + type: 'string', + required: false, + description: `A tax code ID. Stripe Tax uses this to classify the product for tax calculations.`, + }, + { + name: 'unit_label', + type: 'string', + required: false, + description: `A label that represents units of this product. When set, this will be included in customers' receipts, invoices, Checkout, and the customer portal.`, + }, + { + name: 'url', + type: 'string', + required: false, + description: `A URL of a publicly-accessible webpage for this product.`, + }, + ], + }, + { + name: 'stripe_create_promotion_code_dahlia', + description: `Create a promotion code for a coupon that customers can redeem.`, + params: [ + { + name: 'coupon', + type: 'string', + required: true, + description: `The ID of the coupon to apply to this promotion code.`, + }, + { + name: 'active', + type: 'boolean', + required: false, + description: `Whether the promotion code is currently active. Defaults to true.`, + }, + { + name: 'code', + type: 'string', + required: false, + description: `Human-readable code that customers enter at checkout. If not set, Stripe generates a random code.`, + }, + { + name: 'customer', + type: 'string', + required: false, + description: `Restrict this promotion code to a specific customer ID.`, + }, + { + name: 'expires_at', + type: 'integer', + required: false, + description: `Unix timestamp after which the promotion code can no longer be redeemed.`, + }, + { + name: 'max_redemptions', + type: 'integer', + required: false, + description: `Maximum number of times this promotion code can be redeemed.`, + }, + { + name: 'metadata', + type: 'object', + required: false, + description: `Set of key-value pairs for storing additional information.`, + }, + ], + }, + { + name: 'stripe_create_quote_dahlia', + description: `Create a Quote for a subscription or one-time payment, which can be sent to customers for approval.`, + params: [ + { + name: 'customer', + type: 'string', + required: false, + description: `The ID of the customer the quote belongs to.`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `A description visible to customers on the quote.`, + }, + { + name: 'expires_at', + type: 'integer', + required: false, + description: `Unix timestamp at which the quote will expire.`, + }, + { + name: 'footer', + type: 'string', + required: false, + description: `Footer text shown at the bottom of the quote document.`, + }, + { + name: 'header', + type: 'string', + required: false, + description: `Header text shown at the top of the quote document.`, + }, + { + name: 'line_items', + type: 'array', + required: false, + description: `A list of line items to include on the quote.`, + }, + { + name: 'metadata', + type: 'object', + required: false, + description: `Set of key-value pairs to attach to the quote.`, + }, + { + name: 'subscription_data', + type: 'object', + required: false, + description: `Subscription data to apply when converting the quote to a subscription.`, + }, + ], + }, + { + name: 'stripe_create_refund_dahlia', + description: `Create a refund for a charge or payment intent. Refunds a charge that has previously been created, with optional partial amount.`, + params: [ + { + name: 'amount', + type: 'integer', + required: false, + description: `A positive integer in the smallest currency unit representing how much to refund. Defaults to full refund if omitted.`, + }, + { + name: 'charge', + type: 'string', + required: false, + description: `The identifier of the charge to refund. Either charge or payment_intent must be provided.`, + }, + { + name: 'payment_intent', + type: 'string', + required: false, + description: `The identifier of the PaymentIntent to refund. Alternative to charge.`, + }, + { + name: 'reason', + type: 'string', + required: false, + description: `The reason for the refund.`, + }, + ], + }, + { + name: 'stripe_create_setup_intent_dahlia', + description: `Create a SetupIntent to collect payment method details for future off-session payments.`, + params: [ + { + name: 'confirm', + type: 'boolean', + required: false, + description: `Set to true to attempt to confirm this SetupIntent immediately.`, + }, + { + name: 'customer', + type: 'string', + required: false, + description: `ID of the Stripe customer this SetupIntent is associated with.`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `An arbitrary string description for the SetupIntent.`, + }, + { + name: 'payment_method', + type: 'string', + required: false, + description: `ID of the payment method to attach to this SetupIntent.`, + }, + { + name: 'payment_method_types', + type: 'array', + required: false, + description: `The payment method types this SetupIntent is allowed to use (e.g. ["card"], ["card", "sepa_debit"]). Stripe's API requires this as an array, even for a single type.`, + }, + { + name: 'usage', + type: 'string', + required: false, + description: `Indicates how the payment method is intended to be used in the future.`, + }, + ], + }, + { + name: 'stripe_create_subscription_dahlia', + description: `Creates a new subscription on an existing customer. Each customer can have multiple active subscriptions if needed.`, + params: [ + { + name: 'customer', + type: 'string', + required: true, + description: `The identifier of the customer to subscribe.`, + }, + { + name: 'items', + type: 'array', + required: true, + description: `List of subscription items, each with a price ID and optional quantity.`, + }, + { + name: 'cancel_at_period_end', + type: 'boolean', + required: false, + description: `Boolean indicating whether this subscription should cancel at the end of the current period.`, + }, + { + name: 'collection_method', + type: 'string', + required: false, + description: `Either charge_automatically or send_invoice.`, + }, + { + name: 'currency', + type: 'string', + required: false, + description: `Three-letter ISO currency code for the subscription.`, + }, + { + name: 'days_until_due', + type: 'integer', + required: false, + description: `Number of days a customer has to pay invoices (used with send_invoice collection method).`, + }, + { + name: 'default_payment_method', + type: 'string', + required: false, + description: `ID of the default payment method for this subscription.`, + }, + { + name: 'metadata', + type: 'object', + required: false, + description: `Set of key-value pairs to attach to the subscription.`, + }, + { + name: 'payment_behavior', + type: 'string', + required: false, + description: `Controls how Stripe handles the first invoice when payment is required and collection_method=charge_automatically. Use default_incomplete to let the subscription go to status=incomplete (generating a PaymentIntent the client confirms) instead of hard-failing when the customer has no default payment method.`, + }, + { + name: 'trial_end', + type: 'string', + required: false, + description: `Unix timestamp for when the trial period ends. Use 'now' to end an existing trial.`, + }, + { + name: 'trial_period_days', + type: 'integer', + required: false, + description: `Integer representing the number of trial period days before the customer is charged.`, + }, + ], + }, + { + name: 'stripe_create_subscription_item_dahlia', + description: `Add a new item to an existing subscription.`, + params: [ + { + name: 'price', + type: 'string', + required: true, + description: `The ID of the price to use for this subscription item.`, + }, + { + name: 'subscription', + type: 'string', + required: true, + description: `The ID of the subscription to add this item to.`, + }, + { + name: 'proration_behavior', + type: 'string', + required: false, + description: `Determines how to handle prorations when adding this item.`, + }, + { + name: 'quantity', + type: 'integer', + required: false, + description: `The quantity of the plan to which the customer should be subscribed.`, + }, + ], + }, + { + name: 'stripe_create_tax_rate_dahlia', + description: `Create a tax rate that can be applied to invoices and subscriptions.`, + params: [ + { + name: 'display_name', + type: 'string', + required: true, + description: `Label shown to customers on invoices and receipts, e.g. VAT or GST.`, + }, + { + name: 'inclusive', + type: 'boolean', + required: true, + description: `Whether the tax is included in the price (true) or added on top (false).`, + }, + { + name: 'percentage', + type: 'number', + required: true, + description: `The tax rate percentage as a decimal, e.g. 20.0 for 20%.`, + }, + { + name: 'country', + type: 'string', + required: false, + description: `Two-letter ISO country code the tax rate applies to, e.g. DE or US.`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `Internal description of the tax rate, not shown to customers.`, + }, + { + name: 'jurisdiction', + type: 'string', + required: false, + description: `The jurisdiction for the tax rate, displayed on invoices.`, + }, + { + name: 'metadata', + type: 'object', + required: false, + description: `Set of key-value pairs for storing additional information.`, + }, + { + name: 'state', + type: 'string', + required: false, + description: `State, county, province, or region the tax rate applies to.`, + }, + ], + }, + { + name: 'stripe_create_transfer_dahlia', + description: `Create a transfer to send funds to a connected Stripe account (Connect platforms).`, + params: [ + { + name: 'amount', + type: 'integer', + required: true, + description: `Amount to transfer in the smallest currency unit (e.g. cents for USD).`, + }, + { + name: 'currency', + type: 'string', + required: true, + description: `Three-letter ISO currency code (lowercase) for the transfer.`, + }, + { + name: 'destination', + type: 'string', + required: true, + description: `The ID of the connected Stripe account to transfer funds to.`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `An optional description of the transfer.`, + }, + { + name: 'source_transaction', + type: 'string', + required: false, + description: `The ID of a charge to use as the source for the transfer.`, + }, + ], + }, + { + name: 'stripe_create_webhook_endpoint_dahlia', + description: `Create a webhook endpoint to receive Stripe event notifications at your HTTPS URL. Supports subscribing to any number of event types (or use * to receive all events).`, + params: [ + { + name: 'enabled_events', + type: 'array', + required: true, + description: `Array of event types to subscribe to. Use ["*"] to receive all events.`, + }, + { + name: 'url', + type: 'string', + required: true, + description: `The HTTPS URL of your webhook endpoint.`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `An optional description of the webhook endpoint.`, + }, + ], + }, + { + name: 'stripe_delete_coupon_dahlia', + description: `Delete a coupon. Customers that have already applied this coupon are not affected.`, + params: [ + { + name: 'coupon', + type: 'string', + required: true, + description: `The ID of the coupon to delete.`, + }, + ], + }, + { + name: 'stripe_delete_customer_dahlia', + description: `Permanently deletes a customer. It cannot be undone. Also immediately cancels any active subscriptions on the customer.`, + params: [ + { + name: 'customer_id', + type: 'string', + required: true, + description: `The ID of the customer to delete.`, + }, + ], + }, + { + name: 'stripe_delete_invoice_item_dahlia', + description: `Delete an invoice item. Can only delete items that have not been finalized in an invoice.`, + params: [ + { + name: 'invoiceitem', + type: 'string', + required: true, + description: `The ID of the invoice item to delete.`, + }, + ], + }, + { + name: 'stripe_delete_plan_dahlia', + description: `Delete a Plan. Customers subscribed to this plan are not affected.`, + params: [ + { + name: 'plan', + type: 'string', + required: true, + description: `The ID of the plan to delete.`, + }, + ], + }, + { + name: 'stripe_delete_subscription_item_dahlia', + description: `Delete a subscription item, removing it from the subscription.`, + params: [ + { + name: 'item', + type: 'string', + required: true, + description: `The ID of the subscription item to delete.`, + }, + { + name: 'proration_behavior', + type: 'string', + required: false, + description: `Determines how to handle prorations when deleting this item.`, + }, + ], + }, + { + name: 'stripe_delete_webhook_endpoint_dahlia', + description: `Delete a webhook endpoint. Once deleted, the endpoint will no longer receive events from Stripe.`, + params: [ + { + name: 'webhook_endpoint', + type: 'string', + required: true, + description: `The ID of the webhook endpoint to delete.`, + }, + ], + }, + { + name: 'stripe_detach_payment_method_dahlia', + description: `Detach a PaymentMethod from a Customer, making it reusable for other customers.`, + params: [ + { + name: 'id', + type: 'string', + required: true, + description: `The ID of the PaymentMethod to detach.`, + }, + ], + }, + { + name: 'stripe_expire_checkout_session_dahlia', + description: `Expire a Checkout Session before it has been completed. Can only expire sessions in 'open' status.`, + params: [ + { + name: 'session', + type: 'string', + required: true, + description: `The ID of the Checkout Session to expire.`, + }, + ], + }, + { + name: 'stripe_finalize_invoice_dahlia', + description: `Stripe automatically finalizes drafts before sending them. However, if you'd like to finalize a draft invoice manually, you can do so using this method. After an invoice is finalized, it can be paid or sent to customers.`, + params: [ + { + name: 'invoice_id', + type: 'string', + required: true, + description: `The ID of the invoice to finalize.`, + }, + { + name: 'auto_advance', + type: 'boolean', + required: false, + description: `Controls whether Stripe performs automatic collection of the invoice after finalization.`, + }, + ], + }, + { + name: 'stripe_finalize_quote_dahlia', + description: `Finalize a Quote to make it ready to be accepted by the customer.`, + params: [ + { + name: 'quote', + type: 'string', + required: true, + description: `The ID of the quote to finalize.`, + }, + { + name: 'expires_at', + type: 'integer', + required: false, + description: `Unix timestamp at which the finalized quote will expire.`, + }, + ], + }, + { + name: 'stripe_get_account_dahlia', + description: `Retrieve the details of the current Stripe account.`, + params: [], + }, + { + name: 'stripe_get_balance_dahlia', + description: `Retrieve the current balance of the Stripe account, showing available and pending amounts by currency.`, + params: [], + }, + { + name: 'stripe_get_balance_transaction_dahlia', + description: `Retrieve a balance transaction by ID. Balance transactions represent funds moving through the Stripe account.`, + params: [ + { + name: 'id', + type: 'string', + required: true, + description: `The ID of the balance transaction to retrieve.`, + }, + ], + }, + { + name: 'stripe_get_charge_dahlia', + description: `Retrieves the details of a charge that has previously been created. Supply the unique charge ID that was returned from your previous request, and Stripe will return the corresponding charge information.`, + params: [ + { + name: 'charge_id', + type: 'string', + required: true, + description: `The ID of the charge to retrieve.`, + }, + { + name: 'expand', + type: 'array', + required: false, + description: `List of fields to expand in the response.`, + }, + ], + }, + { + name: 'stripe_get_checkout_session_dahlia', + description: `Retrieve a Checkout Session by ID.`, + params: [ + { + name: 'session', + type: 'string', + required: true, + description: `The ID of the Checkout Session to retrieve.`, + }, + ], + }, + { + name: 'stripe_get_coupon_dahlia', + description: `Retrieve a coupon by its ID.`, + params: [ + { + name: 'coupon', + type: 'string', + required: true, + description: `The ID of the coupon to retrieve.`, + }, + ], + }, + { + name: 'stripe_get_customer_dahlia', + description: `Retrieves the details of an existing customer. You need only supply the unique customer identifier that was returned upon customer creation.`, + params: [ + { + name: 'customer_id', + type: 'string', + required: true, + description: `The ID of the customer to retrieve`, + }, + { + name: 'expand', + type: 'array', + required: false, + description: `List of fields to expand in the response.`, + }, + ], + }, + { + name: 'stripe_get_dispute_dahlia', + description: `Retrieve a dispute by ID. A dispute occurs when a customer questions a charge with their card issuer.`, + params: [ + { + name: 'dispute', + type: 'string', + required: true, + description: `The ID of the dispute to retrieve.`, + }, + ], + }, + { + name: 'stripe_get_event_dahlia', + description: `Retrieve an event by ID. Events are Stripe's way of notifying your application about changes.`, + params: [ + { + name: 'id', + type: 'string', + required: true, + description: `The ID of the event to retrieve.`, + }, + ], + }, + { + name: 'stripe_get_invoice_dahlia', + description: `Retrieves the invoice with the given ID. Supply the unique invoice identifier that was returned from your previous request, and Stripe will return the corresponding invoice information.`, + params: [ + { + name: 'invoice_id', + type: 'string', + required: true, + description: `The ID of the invoice to retrieve`, + }, + { + name: 'expand', + type: 'array', + required: false, + description: `List of fields to expand in the response.`, + }, + ], + }, + { + name: 'stripe_get_invoice_item_dahlia', + description: `Retrieves the invoice item with the given ID. Supply the unique invoice item identifier and Stripe will return the corresponding invoice item information.`, + params: [ + { + name: 'invoice_item_id', + type: 'string', + required: true, + description: `The ID of the invoice item to retrieve`, + }, + { + name: 'expand', + type: 'array', + required: false, + description: `List of fields to expand in the response.`, + }, + ], + }, + { + name: 'stripe_get_payment_intent_dahlia', + description: `Retrieves the details of a PaymentIntent that was previously created. Supply the unique PaymentIntent ID and Stripe will return the corresponding PaymentIntent information.`, + params: [ + { + name: 'payment_intent_id', + type: 'string', + required: true, + description: `The ID of the PaymentIntent to retrieve.`, + }, + { + name: 'expand', + type: 'array', + required: false, + description: `List of fields to expand in the response.`, + }, + ], + }, + { + name: 'stripe_get_payment_method_dahlia', + description: `Retrieve a PaymentMethod object.`, + params: [ + { + name: 'id', + type: 'string', + required: true, + description: `The ID of the PaymentMethod to retrieve.`, + }, + ], + }, + { + name: 'stripe_get_payout_dahlia', + description: `Retrieve a payout by ID.`, + params: [ + { + name: 'payout', + type: 'string', + required: true, + description: `The ID of the payout to retrieve.`, + }, + ], + }, + { + name: 'stripe_get_plan_dahlia', + description: `Retrieve a Plan by ID.`, + params: [ + { + name: 'plan', + type: 'string', + required: true, + description: `The ID of the plan to retrieve.`, + }, + ], + }, + { + name: 'stripe_get_price_dahlia', + description: `Retrieves the price with the given ID.`, + params: [ + { + name: 'price_id', + type: 'string', + required: true, + description: `The ID of the price to retrieve.`, + }, + { + name: 'expand', + type: 'array', + required: false, + description: `List of fields to expand in the response.`, + }, + ], + }, + { + name: 'stripe_get_product_dahlia', + description: `Retrieves the details of an existing product. Supply the unique product ID from either a product creation request or the product list, and Stripe will return the corresponding product information.`, + params: [ + { + name: 'product_id', + type: 'string', + required: true, + description: `The ID of the product to retrieve`, + }, + { + name: 'expand', + type: 'array', + required: false, + description: `List of fields to expand in the response.`, + }, + ], + }, + { + name: 'stripe_get_promotion_code_dahlia', + description: `Retrieve a promotion code by ID.`, + params: [ + { + name: 'promotion_code', + type: 'string', + required: true, + description: `The ID of the promotion code to retrieve.`, + }, + ], + }, + { + name: 'stripe_get_quote_dahlia', + description: `Retrieve a Quote by ID.`, + params: [ + { + name: 'quote', + type: 'string', + required: true, + description: `The ID of the quote to retrieve.`, + }, + ], + }, + { + name: 'stripe_get_refund_dahlia', + description: `Retrieve the details of an existing refund.`, + params: [ + { + name: 'id', + type: 'string', + required: true, + description: `The ID of the refund to retrieve.`, + }, + ], + }, + { + name: 'stripe_get_setup_intent_dahlia', + description: `Retrieve a SetupIntent by ID.`, + params: [ + { + name: 'setup_intent_id', + type: 'string', + required: true, + description: `The ID of the SetupIntent to retrieve.`, + }, + ], + }, + { + name: 'stripe_get_subscription_dahlia', + description: `Retrieves the subscription with the given ID. Supply the unique subscription identifier that was returned from your previous request, and Stripe will return the corresponding subscription information.`, + params: [ + { + name: 'subscription_id', + type: 'string', + required: true, + description: `The ID of the subscription to retrieve`, + }, + { + name: 'expand', + type: 'array', + required: false, + description: `List of fields to expand in the response.`, + }, + ], + }, + { + name: 'stripe_get_subscription_item_dahlia', + description: `Retrieves the subscription item with the given ID. Supply the unique subscription item identifier and Stripe will return the corresponding subscription item information.`, + params: [ + { + name: 'subscription_item_id', + type: 'string', + required: true, + description: `The ID of the subscription item to retrieve`, + }, + { + name: 'expand', + type: 'array', + required: false, + description: `List of fields to expand in the response.`, + }, + ], + }, + { + name: 'stripe_get_tax_rate_dahlia', + description: `Retrieve a tax rate by ID.`, + params: [ + { + name: 'tax_rate', + type: 'string', + required: true, + description: `The ID of the tax rate to retrieve.`, + }, + ], + }, + { + name: 'stripe_get_transfer_dahlia', + description: `Retrieve a transfer by ID.`, + params: [ + { + name: 'transfer', + type: 'string', + required: true, + description: `The ID of the transfer to retrieve.`, + }, + ], + }, + { + name: 'stripe_get_webhook_endpoint_dahlia', + description: `Retrieve a webhook endpoint by ID.`, + params: [ + { + name: 'webhook_endpoint', + type: 'string', + required: true, + description: `The ID of the webhook endpoint to retrieve.`, + }, + ], + }, + { + name: 'stripe_list_accounts_dahlia', + description: `List all connected accounts on your platform (Connect platforms only).`, + params: [ + { + name: 'ending_before', + type: 'string', + required: false, + description: `Cursor for pagination: return results before this account ID.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of accounts to return (1–100).`, + }, + { + name: 'starting_after', + type: 'string', + required: false, + description: `Cursor for pagination: return results after this account ID.`, + }, + ], + }, + { + name: 'stripe_list_balance_transactions_dahlia', + description: `List all balance transactions, optionally filtered by currency, source, or type.`, + params: [ + { + name: 'currency', + type: 'string', + required: false, + description: `Filter by three-letter ISO currency code.`, + }, + { + name: 'ending_before', + type: 'string', + required: false, + description: `Balance transaction ID to end pagination before.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Number of transactions to return (1-100, default 10).`, + }, + { + name: 'source', + type: 'string', + required: false, + description: `Filter by source object ID (charge or payout ID).`, + }, + { + name: 'starting_after', + type: 'string', + required: false, + description: `Balance transaction ID to start pagination after.`, + }, + { name: 'type', type: 'string', required: false, description: `Filter by transaction type.` }, + ], + }, + { + name: 'stripe_list_charges_dahlia', + description: `Returns a list of charges you've previously created. The charges are returned in sorted order, with the most recent charges appearing first.`, + params: [ + { + name: 'created', + type: 'integer', + required: false, + description: `Filter by exact creation timestamp (Unix seconds). For a range filter, use created_gt/created_gte/created_lt/created_lte instead.`, + }, + { + name: 'created_gt', + type: 'integer', + required: false, + description: `Filter by creation date, strictly after this Unix timestamp.`, + }, + { + name: 'created_gte', + type: 'integer', + required: false, + description: `Filter by creation date, at or after this Unix timestamp.`, + }, + { + name: 'created_lt', + type: 'integer', + required: false, + description: `Filter by creation date, strictly before this Unix timestamp.`, + }, + { + name: 'created_lte', + type: 'integer', + required: false, + description: `Filter by creation date, at or before this Unix timestamp.`, + }, + { + name: 'customer', + type: 'string', + required: false, + description: `Filter charges by customer ID`, + }, + { + name: 'ending_before', + type: 'string', + required: false, + description: `Charge ID to end pagination before`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Number of charges to return (1-100, default 10)`, + }, + { + name: 'payment_intent', + type: 'string', + required: false, + description: `Filter charges by PaymentIntent ID`, + }, + { + name: 'starting_after', + type: 'string', + required: false, + description: `Charge ID to start pagination after`, + }, + ], + }, + { + name: 'stripe_list_checkout_sessions_dahlia', + description: `List all Checkout Sessions.`, + params: [ + { + name: 'customer', + type: 'string', + required: false, + description: `Filter sessions by customer ID.`, + }, + { + name: 'ending_before', + type: 'string', + required: false, + description: `Cursor for pagination. Returns sessions before this ID.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of sessions to return (1-100).`, + }, + { + name: 'payment_intent', + type: 'string', + required: false, + description: `Filter sessions by payment intent ID.`, + }, + { + name: 'starting_after', + type: 'string', + required: false, + description: `Cursor for pagination. Returns sessions after this ID.`, + }, + { + name: 'subscription', + type: 'string', + required: false, + description: `Filter sessions by subscription ID.`, + }, + ], + }, + { + name: 'stripe_list_coupons_dahlia', + description: `List all coupons.`, + params: [ + { + name: 'ending_before', + type: 'string', + required: false, + description: `Cursor for pagination. Returns results before this coupon ID.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of coupons to return (1–100).`, + }, + { + name: 'starting_after', + type: 'string', + required: false, + description: `Cursor for pagination. Returns results after this coupon ID.`, + }, + ], + }, + { + name: 'stripe_list_customer_payment_methods_dahlia', + description: `List all PaymentMethods attached to a specific customer.`, + params: [ + { + name: 'customer', + type: 'string', + required: true, + description: `The ID of the customer whose payment methods to list.`, + }, + { + name: 'ending_before', + type: 'string', + required: false, + description: `Cursor for pagination — return results before this payment method ID.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of payment methods to return.`, + }, + { + name: 'starting_after', + type: 'string', + required: false, + description: `Cursor for pagination — return results after this payment method ID.`, + }, + { + name: 'type', + type: 'string', + required: false, + description: `Filter payment methods by type.`, + }, + ], + }, + { + name: 'stripe_list_customers_dahlia', + description: `Returns a list of your customers. The customers are returned sorted by creation date, with the most recent customers appearing first. Supports filtering by email and pagination for large customer lists.`, + params: [ + { + name: 'created', + type: 'integer', + required: false, + description: `Filter by exact creation timestamp (Unix seconds). For a range filter, use created_gt/created_gte/created_lt/created_lte instead.`, + }, + { + name: 'created_gt', + type: 'integer', + required: false, + description: `Filter by creation date, strictly after this Unix timestamp.`, + }, + { + name: 'created_gte', + type: 'integer', + required: false, + description: `Filter by creation date, at or after this Unix timestamp.`, + }, + { + name: 'created_lt', + type: 'integer', + required: false, + description: `Filter by creation date, strictly before this Unix timestamp.`, + }, + { + name: 'created_lte', + type: 'integer', + required: false, + description: `Filter by creation date, at or before this Unix timestamp.`, + }, + { + name: 'email', + type: 'string', + required: false, + description: `Filter customers by exact email address`, + }, + { + name: 'ending_before', + type: 'string', + required: false, + description: `Customer ID to end pagination before`, + }, + { + name: 'expand', + type: 'array', + required: false, + description: `List of fields to expand in the response.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Number of customers to return (1-100, default 10)`, + }, + { + name: 'starting_after', + type: 'string', + required: false, + description: `Customer ID to start pagination after`, + }, + ], + }, + { + name: 'stripe_list_disputes_dahlia', + description: `List all disputes, optionally filtered by charge or payment intent.`, + params: [ + { + name: 'charge', + type: 'string', + required: false, + description: `Filter disputes by charge ID.`, + }, + { + name: 'ending_before', + type: 'string', + required: false, + description: `Cursor for pagination: return disputes before this dispute ID.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of disputes to return (1-100).`, + }, + { + name: 'payment_intent', + type: 'string', + required: false, + description: `Filter disputes by payment intent ID.`, + }, + { + name: 'starting_after', + type: 'string', + required: false, + description: `Cursor for pagination: return disputes after this dispute ID.`, + }, + ], + }, + { + name: 'stripe_list_events_dahlia', + description: `List all events. Events represent noteworthy activity on your Stripe account.`, + params: [ + { + name: 'ending_before', + type: 'string', + required: false, + description: `Cursor for pagination: return events before this event ID.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of events to return (1-100).`, + }, + { + name: 'starting_after', + type: 'string', + required: false, + description: `Cursor for pagination: return events after this event ID.`, + }, + { + name: 'type', + type: 'string', + required: false, + description: `Filter events by type, e.g. payment_intent.created.`, + }, + ], + }, + { + name: 'stripe_list_invoice_items_dahlia', + description: `Returns a list of your invoice items. Invoice items are returned sorted by creation date, with the most recent invoice items appearing first.`, + params: [ + { + name: 'created', + type: 'integer', + required: false, + description: `Filter by exact creation timestamp (Unix seconds). For a range filter, use created_gt/created_gte/created_lt/created_lte instead.`, + }, + { + name: 'created_gt', + type: 'integer', + required: false, + description: `Filter by creation date, strictly after this Unix timestamp.`, + }, + { + name: 'created_gte', + type: 'integer', + required: false, + description: `Filter by creation date, at or after this Unix timestamp.`, + }, + { + name: 'created_lt', + type: 'integer', + required: false, + description: `Filter by creation date, strictly before this Unix timestamp.`, + }, + { + name: 'created_lte', + type: 'integer', + required: false, + description: `Filter by creation date, at or before this Unix timestamp.`, + }, + { + name: 'customer', + type: 'string', + required: false, + description: `Filter invoice items by customer ID`, + }, + { + name: 'ending_before', + type: 'string', + required: false, + description: `Invoice item ID to end pagination before`, + }, + { + name: 'expand', + type: 'array', + required: false, + description: `List of fields to expand in the response.`, + }, + { + name: 'invoice', + type: 'string', + required: false, + description: `Filter invoice items by invoice ID`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Number of invoice items to return (1-100, default 10)`, + }, + { + name: 'pending', + type: 'boolean', + required: false, + description: `Filter by pending status`, + }, + { + name: 'starting_after', + type: 'string', + required: false, + description: `Invoice item ID to start pagination after`, + }, + ], + }, + { + name: 'stripe_list_invoice_line_items_dahlia', + description: `When retrieving an invoice, you'll get a lines property containing the total count of line items and the first handful of those items. There is also a URL where you can retrieve the full (paginated) list of line items.`, + params: [ + { + name: 'invoice_id', + type: 'string', + required: true, + description: `The ID of the invoice to list line items for`, + }, + { + name: 'ending_before', + type: 'string', + required: false, + description: `Line item ID to end pagination before`, + }, + { + name: 'expand', + type: 'array', + required: false, + description: `List of fields to expand in the response.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Number of line items to return (1-100, default 10)`, + }, + { + name: 'starting_after', + type: 'string', + required: false, + description: `Line item ID to start pagination after`, + }, + ], + }, + { + name: 'stripe_list_invoices_dahlia', + description: `Returns a list of your invoices. The invoices are returned sorted by creation date, with the most recent invoices appearing first.`, + params: [ + { + name: 'collection_method', + type: 'string', + required: false, + description: `Filter invoices by collection method`, + }, + { + name: 'created', + type: 'integer', + required: false, + description: `Filter by exact creation timestamp (Unix seconds). For a range filter, use created_gt/created_gte/created_lt/created_lte instead.`, + }, + { + name: 'created_gt', + type: 'integer', + required: false, + description: `Filter by creation date, strictly after this Unix timestamp.`, + }, + { + name: 'created_gte', + type: 'integer', + required: false, + description: `Filter by creation date, at or after this Unix timestamp.`, + }, + { + name: 'created_lt', + type: 'integer', + required: false, + description: `Filter by creation date, strictly before this Unix timestamp.`, + }, + { + name: 'created_lte', + type: 'integer', + required: false, + description: `Filter by creation date, at or before this Unix timestamp.`, + }, + { + name: 'customer', + type: 'string', + required: false, + description: `Filter invoices by customer ID`, + }, + { + name: 'ending_before', + type: 'string', + required: false, + description: `Invoice ID to end pagination before`, + }, + { + name: 'expand', + type: 'array', + required: false, + description: `List of fields to expand in the response.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Number of invoices to return (1-100, default 10)`, + }, + { + name: 'starting_after', + type: 'string', + required: false, + description: `Invoice ID to start pagination after`, + }, + { name: 'status', type: 'string', required: false, description: `Filter invoices by status` }, + { + name: 'subscription', + type: 'string', + required: false, + description: `Filter invoices by subscription ID`, + }, + ], + }, + { + name: 'stripe_list_payment_intents_dahlia', + description: `Returns a list of PaymentIntents. The PaymentIntents are returned sorted by creation date, with the most recent PaymentIntents appearing first.`, + params: [ + { + name: 'created', + type: 'integer', + required: false, + description: `Filter by exact creation timestamp (Unix seconds). For a range filter, use created_gt/created_gte/created_lt/created_lte instead.`, + }, + { + name: 'created_gt', + type: 'integer', + required: false, + description: `Filter by creation date, strictly after this Unix timestamp.`, + }, + { + name: 'created_gte', + type: 'integer', + required: false, + description: `Filter by creation date, at or after this Unix timestamp.`, + }, + { + name: 'created_lt', + type: 'integer', + required: false, + description: `Filter by creation date, strictly before this Unix timestamp.`, + }, + { + name: 'created_lte', + type: 'integer', + required: false, + description: `Filter by creation date, at or before this Unix timestamp.`, + }, + { + name: 'customer', + type: 'string', + required: false, + description: `Filter PaymentIntents by customer ID`, + }, + { + name: 'ending_before', + type: 'string', + required: false, + description: `PaymentIntent ID to end pagination before`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Number of results to return (1-100, default 10)`, + }, + { + name: 'starting_after', + type: 'string', + required: false, + description: `PaymentIntent ID to start pagination after`, + }, + ], + }, + { + name: 'stripe_list_payment_methods_dahlia', + description: `List PaymentMethods for a customer.`, + params: [ + { + name: 'customer', + type: 'string', + required: false, + description: `The ID of the customer whose payment methods to list.`, + }, + { + name: 'ending_before', + type: 'string', + required: false, + description: `Cursor for pagination; returns results before this PaymentMethod ID.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Number of results to return (1–100).`, + }, + { + name: 'starting_after', + type: 'string', + required: false, + description: `Cursor for pagination; returns results after this PaymentMethod ID.`, + }, + { + name: 'type', + type: 'string', + required: false, + description: `Filter by payment method type.`, + }, + ], + }, + { + name: 'stripe_list_payouts_dahlia', + description: `List all payouts, with optional filters by status and arrival date.`, + params: [ + { + name: 'arrival_date', + type: 'integer', + required: false, + description: `Filter by arrival date (Unix timestamp).`, + }, + { + name: 'destination', + type: 'string', + required: false, + description: `Filter by destination bank account or card ID.`, + }, + { + name: 'ending_before', + type: 'string', + required: false, + description: `Payout ID to end pagination before.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Number of payouts to return (1-100, default 10).`, + }, + { + name: 'starting_after', + type: 'string', + required: false, + description: `Payout ID to start pagination after.`, + }, + { name: 'status', type: 'string', required: false, description: `Filter by payout status.` }, + ], + }, + { + name: 'stripe_list_plans_dahlia', + description: `List all Plans.`, + params: [ + { + name: 'active', + type: 'boolean', + required: false, + description: `Filter plans by active status. Pass true to list only active plans.`, + }, + { + name: 'ending_before', + type: 'string', + required: false, + description: `Cursor for pagination: return results before this plan ID.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of plans to return (1–100).`, + }, + { + name: 'product', + type: 'string', + required: false, + description: `Filter plans by product ID.`, + }, + { + name: 'starting_after', + type: 'string', + required: false, + description: `Cursor for pagination: return results after this plan ID.`, + }, + ], + }, + { + name: 'stripe_list_prices_dahlia', + description: `Returns a list of your active prices, excluding inline prices. For the list of inactive prices, set active to false.`, + params: [ + { + name: 'active', + type: 'boolean', + required: false, + description: `Only return prices that are active or inactive.`, + }, + { + name: 'currency', + type: 'string', + required: false, + description: `Only return prices for the given currency.`, + }, + { + name: 'ending_before', + type: 'string', + required: false, + description: `Price ID to end pagination before`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Number of prices to return (1-100, default 10)`, + }, + { + name: 'product', + type: 'string', + required: false, + description: `Only return prices for the given product.`, + }, + { + name: 'starting_after', + type: 'string', + required: false, + description: `Price ID to start pagination after`, + }, + { + name: 'type', + type: 'string', + required: false, + description: `Only return prices of this type.`, + }, + ], + }, + { + name: 'stripe_list_products_dahlia', + description: `Returns a list of your products. The products are returned sorted by creation date, with the most recent products appearing first.`, + params: [ + { + name: 'active', + type: 'boolean', + required: false, + description: `Filter products by active status`, + }, + { + name: 'created', + type: 'integer', + required: false, + description: `Filter by exact creation timestamp (Unix seconds). For a range filter, use created_gt/created_gte/created_lt/created_lte instead.`, + }, + { + name: 'created_gt', + type: 'integer', + required: false, + description: `Filter by creation date, strictly after this Unix timestamp.`, + }, + { + name: 'created_gte', + type: 'integer', + required: false, + description: `Filter by creation date, at or after this Unix timestamp.`, + }, + { + name: 'created_lt', + type: 'integer', + required: false, + description: `Filter by creation date, strictly before this Unix timestamp.`, + }, + { + name: 'created_lte', + type: 'integer', + required: false, + description: `Filter by creation date, at or before this Unix timestamp.`, + }, + { + name: 'ending_before', + type: 'string', + required: false, + description: `Product ID to end pagination before`, + }, + { + name: 'expand', + type: 'array', + required: false, + description: `List of fields to expand in the response.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Number of products to return (1-100, default 10)`, + }, + { + name: 'shippable', + type: 'boolean', + required: false, + description: `Filter products by shippable status`, + }, + { + name: 'starting_after', + type: 'string', + required: false, + description: `Product ID to start pagination after`, + }, + { name: 'type', type: 'string', required: false, description: `Filter products by type` }, + { name: 'url', type: 'string', required: false, description: `Filter products by URL` }, + ], + }, + { + name: 'stripe_list_promotion_codes_dahlia', + description: `List all promotion codes.`, + params: [ + { + name: 'active', + type: 'boolean', + required: false, + description: `Filter by active status. True returns only active codes, false returns only inactive.`, + }, + { + name: 'code', + type: 'string', + required: false, + description: `Filter by the exact customer-facing code string.`, + }, + { + name: 'coupon', + type: 'string', + required: false, + description: `Filter by the coupon ID the promotion codes belong to.`, + }, + { + name: 'customer', + type: 'string', + required: false, + description: `Filter by the customer ID the promotion codes are restricted to.`, + }, + { + name: 'ending_before', + type: 'string', + required: false, + description: `Cursor for reverse pagination. Returns results before this promotion code ID.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of promotion codes to return (1–100).`, + }, + { + name: 'starting_after', + type: 'string', + required: false, + description: `Cursor for forward pagination. Returns results after this promotion code ID.`, + }, + ], + }, + { + name: 'stripe_list_quotes_dahlia', + description: `List all Quotes.`, + params: [ + { + name: 'customer', + type: 'string', + required: false, + description: `Filter quotes by customer ID.`, + }, + { + name: 'ending_before', + type: 'string', + required: false, + description: `Cursor for pagination — return results before this quote ID.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of quotes to return.`, + }, + { + name: 'starting_after', + type: 'string', + required: false, + description: `Cursor for pagination — return results after this quote ID.`, + }, + { name: 'status', type: 'string', required: false, description: `Filter quotes by status.` }, + ], + }, + { + name: 'stripe_list_refunds_dahlia', + description: `List all refunds, optionally filtered by charge or payment intent.`, + params: [ + { + name: 'charge', + type: 'string', + required: false, + description: `Filter refunds by the charge ID.`, + }, + { + name: 'ending_before', + type: 'string', + required: false, + description: `A cursor for pagination. Returns objects before this refund ID.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `A limit on the number of objects to be returned, between 1 and 100.`, + }, + { + name: 'payment_intent', + type: 'string', + required: false, + description: `Filter refunds by the PaymentIntent ID.`, + }, + { + name: 'starting_after', + type: 'string', + required: false, + description: `A cursor for pagination. Returns objects after this refund ID.`, + }, + ], + }, + { + name: 'stripe_list_setup_intents_dahlia', + description: `List all SetupIntents.`, + params: [ + { name: 'customer', type: 'string', required: false, description: `Filter by customer ID.` }, + { + name: 'ending_before', + type: 'string', + required: false, + description: `A cursor for pagination. Returns objects before this ID.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of objects to return (1–100).`, + }, + { + name: 'payment_method', + type: 'string', + required: false, + description: `Filter by payment method ID.`, + }, + { + name: 'starting_after', + type: 'string', + required: false, + description: `A cursor for pagination. Returns objects after this ID.`, + }, + ], + }, + { + name: 'stripe_list_subscription_items_dahlia', + description: `Returns a list of subscription items for a given subscription. Subscription items represent the component lines of a subscription.`, + params: [ + { + name: 'subscription', + type: 'string', + required: true, + description: `The ID of the subscription to list items for`, + }, + { + name: 'ending_before', + type: 'string', + required: false, + description: `Subscription item ID to end pagination before`, + }, + { + name: 'expand', + type: 'array', + required: false, + description: `List of fields to expand in the response.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Number of subscription items to return (1-100, default 10)`, + }, + { + name: 'starting_after', + type: 'string', + required: false, + description: `Subscription item ID to start pagination after`, + }, + ], + }, + { + name: 'stripe_list_subscriptions_dahlia', + description: `Returns a list of your subscriptions. The subscriptions are returned sorted by creation date, with the most recent subscriptions appearing first.`, + params: [ + { + name: 'created', + type: 'integer', + required: false, + description: `Filter by exact creation timestamp (Unix seconds). For a range filter, use created_gt/created_gte/created_lt/created_lte instead.`, + }, + { + name: 'created_gt', + type: 'integer', + required: false, + description: `Filter by creation date, strictly after this Unix timestamp.`, + }, + { + name: 'created_gte', + type: 'integer', + required: false, + description: `Filter by creation date, at or after this Unix timestamp.`, + }, + { + name: 'created_lt', + type: 'integer', + required: false, + description: `Filter by creation date, strictly before this Unix timestamp.`, + }, + { + name: 'created_lte', + type: 'integer', + required: false, + description: `Filter by creation date, at or before this Unix timestamp.`, + }, + { + name: 'customer', + type: 'string', + required: false, + description: `Filter subscriptions by customer ID`, + }, + { + name: 'ending_before', + type: 'string', + required: false, + description: `Subscription ID to end pagination before`, + }, + { + name: 'expand', + type: 'array', + required: false, + description: `List of fields to expand in the response.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Number of subscriptions to return (1-100, default 10)`, + }, + { + name: 'price', + type: 'string', + required: false, + description: `Filter subscriptions by price ID`, + }, + { + name: 'starting_after', + type: 'string', + required: false, + description: `Subscription ID to start pagination after`, + }, + { + name: 'status', + type: 'string', + required: false, + description: `Filter subscriptions by status`, + }, + ], + }, + { + name: 'stripe_list_tax_rates_dahlia', + description: `List all tax rates.`, + params: [ + { + name: 'active', + type: 'boolean', + required: false, + description: `Filter to only return active or inactive tax rates.`, + }, + { + name: 'ending_before', + type: 'string', + required: false, + description: `A cursor for pagination. Returns objects before this ID.`, + }, + { + name: 'inclusive', + type: 'boolean', + required: false, + description: `Filter to return only inclusive or exclusive tax rates.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of objects to return (1–100).`, + }, + { + name: 'starting_after', + type: 'string', + required: false, + description: `A cursor for pagination. Returns objects after this ID.`, + }, + ], + }, + { + name: 'stripe_list_transfers_dahlia', + description: `List all transfers to connected accounts.`, + params: [ + { + name: 'destination', + type: 'string', + required: false, + description: `Filter transfers by the connected account ID they were sent to.`, + }, + { + name: 'ending_before', + type: 'string', + required: false, + description: `Cursor for pagination: return results before this transfer ID.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of transfers to return (1–100).`, + }, + { + name: 'starting_after', + type: 'string', + required: false, + description: `Cursor for pagination: return results after this transfer ID.`, + }, + ], + }, + { + name: 'stripe_list_webhook_endpoints_dahlia', + description: `List all webhook endpoints.`, + params: [ + { + name: 'ending_before', + type: 'string', + required: false, + description: `Cursor for pagination: return endpoints before this webhook endpoint ID.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of webhook endpoints to return (1-100).`, + }, + { + name: 'starting_after', + type: 'string', + required: false, + description: `Cursor for pagination: return endpoints after this webhook endpoint ID.`, + }, + ], + }, + { + name: 'stripe_pay_invoice_dahlia', + description: `Stripe automatically creates and then attempts to collect payment on invoices for customers on subscriptions according to your subscriptions settings. However, if you'd like to attempt payment on an invoice out of the normal collection schedule or for some other reason, you use this endpoint.`, + params: [ + { + name: 'invoice_id', + type: 'string', + required: true, + description: `The ID of the invoice to pay.`, + }, + { + name: 'forgive', + type: 'boolean', + required: false, + description: `In cases where the source used to pay the invoice has insufficient funds, the invoice becomes past_due. Setting forgive to true forgives the invoice and marks it as paid.`, + }, + { + name: 'payment_method', + type: 'string', + required: false, + description: `ID of the payment method to use for this invoice payment.`, + }, + ], + }, + { + name: 'stripe_update_coupon_dahlia', + description: `Update a coupon's name or metadata.`, + params: [ + { + name: 'coupon', + type: 'string', + required: true, + description: `The ID of the coupon to update.`, + }, + { + name: 'metadata', + type: 'object', + required: false, + description: `Set of key-value pairs for storing additional information. Replaces existing metadata.`, + }, + { + name: 'name', + type: 'string', + required: false, + description: `Updated name for the coupon, shown to customers.`, + }, + ], + }, + { + name: 'stripe_update_customer_dahlia', + description: `Updates the specified customer by setting the values of the parameters passed. Any parameters not provided will be left unchanged.`, + params: [ + { + name: 'customer_id', + type: 'string', + required: true, + description: `The ID of the customer to update.`, + }, + { + name: 'address', + type: 'object', + required: false, + description: `The customer's address as a JSON object with fields: line1, line2, city, state, postal_code, country.`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `An arbitrary string that you can attach to a customer object.`, + }, + { name: 'email', type: 'string', required: false, description: `Customer's email address.` }, + { + name: 'metadata', + type: 'object', + required: false, + description: `Set of key-value pairs to attach to the customer. Pass an empty value to remove a key.`, + }, + { + name: 'name', + type: 'string', + required: false, + description: `The customer's full name or business name.`, + }, + { + name: 'phone', + type: 'string', + required: false, + description: `The customer's phone number.`, + }, + { + name: 'tax_exempt', + type: 'string', + required: false, + description: `The customer's tax exemption status. One of: none, exempt, or reverse.`, + }, + ], + }, + { + name: 'stripe_update_dispute_dahlia', + description: `Update a dispute to submit evidence to the card issuer and potentially win the chargeback.`, + params: [ + { + name: 'dispute', + type: 'string', + required: true, + description: `The ID of the dispute to update.`, + }, + { + name: 'customer_email_address', + type: 'string', + required: false, + description: `Customer's email address as evidence.`, + }, + { + name: 'customer_name', + type: 'string', + required: false, + description: `Customer's name as evidence.`, + }, + { + name: 'product_description', + type: 'string', + required: false, + description: `Description of the product or service as evidence.`, + }, + { + name: 'shipping_documentation', + type: 'string', + required: false, + description: `File ID for shipping documentation evidence.`, + }, + { + name: 'submit', + type: 'boolean', + required: false, + description: `If true, immediately submit evidence to the card issuer.`, + }, + ], + }, + { + name: 'stripe_update_invoice_item_dahlia', + description: `Update an invoice item's amount, description, or metadata.`, + params: [ + { + name: 'invoiceitem', + type: 'string', + required: true, + description: `The ID of the invoice item to update.`, + }, + { + name: 'amount', + type: 'integer', + required: false, + description: `The new amount in the smallest currency unit (e.g. cents for USD).`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `An updated description for the invoice item.`, + }, + { + name: 'quantity', + type: 'integer', + required: false, + description: `Non-negative integer quantity of units for this invoice item.`, + }, + ], + }, + { + name: 'stripe_update_plan_dahlia', + description: `Update a Plan's nickname, active status, or metadata.`, + params: [ + { + name: 'plan', + type: 'string', + required: true, + description: `The ID of the plan to update.`, + }, + { + name: 'active', + type: 'boolean', + required: false, + description: `Whether the plan is currently available for new subscriptions.`, + }, + { + name: 'metadata', + type: 'object', + required: false, + description: `Set of key-value pairs to attach to the plan object.`, + }, + { + name: 'nickname', + type: 'string', + required: false, + description: `A brief description of the plan, hidden from customers.`, + }, + { + name: 'trial_period_days', + type: 'integer', + required: false, + description: `Default number of trial days for subscriptions created using this plan.`, + }, + ], + }, + { + name: 'stripe_update_product_dahlia', + description: `Updates the specific product by setting the values of the parameters passed. Any parameters not provided will be left unchanged.`, + params: [ + { + name: 'product_id', + type: 'string', + required: true, + description: `The ID of the product to update.`, + }, + { + name: 'active', + type: 'boolean', + required: false, + description: `Whether the product is currently available for purchase.`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `The product's description.`, + }, + { + name: 'images', + type: 'array', + required: false, + description: `A list of up to 8 URLs of images for this product.`, + }, + { + name: 'metadata', + type: 'object', + required: false, + description: `Set of key-value pairs to attach to the product.`, + }, + { name: 'name', type: 'string', required: false, description: `The product's name.` }, + { + name: 'unit_label', + type: 'string', + required: false, + description: `A label that represents units of this product.`, + }, + { + name: 'url', + type: 'string', + required: false, + description: `A URL of a publicly-accessible webpage for this product.`, + }, + ], + }, + { + name: 'stripe_update_promotion_code_dahlia', + description: `Update a promotion code's active status or metadata.`, + params: [ + { + name: 'promotion_code', + type: 'string', + required: true, + description: `The ID of the promotion code to update.`, + }, + { + name: 'active', + type: 'boolean', + required: false, + description: `Set to false to deactivate the promotion code so it can no longer be redeemed.`, + }, + { + name: 'metadata', + type: 'object', + required: false, + description: `Set of key-value pairs for storing additional information. Replaces existing metadata.`, + }, + ], + }, + { + name: 'stripe_update_quote_dahlia', + description: `Update a draft Quote.`, + params: [ + { + name: 'quote', + type: 'string', + required: true, + description: `The ID of the quote to update.`, + }, + { + name: 'customer', + type: 'string', + required: false, + description: `The ID of the customer to associate with the quote.`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `A description visible to customers on the quote.`, + }, + { + name: 'expires_at', + type: 'integer', + required: false, + description: `Unix timestamp at which the quote will expire.`, + }, + { + name: 'footer', + type: 'string', + required: false, + description: `Footer text shown at the bottom of the quote document.`, + }, + { + name: 'header', + type: 'string', + required: false, + description: `Header text shown at the top of the quote document.`, + }, + { + name: 'metadata', + type: 'object', + required: false, + description: `Set of key-value pairs to attach to the quote.`, + }, + ], + }, + { + name: 'stripe_update_refund_dahlia', + description: `Update the metadata on a refund.`, + params: [ + { + name: 'id', + type: 'string', + required: true, + description: `The ID of the refund to update.`, + }, + { + name: 'metadata', + type: 'object', + required: false, + description: `Set of key-value pairs to attach to the refund as metadata.`, + }, + ], + }, + { + name: 'stripe_update_subscription_dahlia', + description: `Updates an existing subscription to match the specified parameters. When updating a subscription, any parameters not provided will be left unchanged.`, + params: [ + { + name: 'subscription_id', + type: 'string', + required: true, + description: `The ID of the subscription to update.`, + }, + { + name: 'cancel_at_period_end', + type: 'boolean', + required: false, + description: `Boolean indicating whether this subscription should cancel at the end of the current period.`, + }, + { + name: 'collection_method', + type: 'string', + required: false, + description: `Either charge_automatically or send_invoice.`, + }, + { + name: 'days_until_due', + type: 'integer', + required: false, + description: `Number of days a customer has to pay invoices (send_invoice collection method only).`, + }, + { + name: 'default_payment_method', + type: 'string', + required: false, + description: `ID of the default payment method for this subscription.`, + }, + { + name: 'items', + type: 'array', + required: false, + description: `List of subscription items to update. Each item includes id, price, and/or quantity.`, + }, + { + name: 'metadata', + type: 'object', + required: false, + description: `Set of key-value pairs to attach to the subscription.`, + }, + { + name: 'proration_behavior', + type: 'string', + required: false, + description: `Determines how to handle prorations when the billing cycle changes.`, + }, + ], + }, + { + name: 'stripe_update_subscription_item_dahlia', + description: `Update a subscription item, for example to change the price or quantity.`, + params: [ + { + name: 'item', + type: 'string', + required: true, + description: `The ID of the subscription item to update.`, + }, + { + name: 'price', + type: 'string', + required: false, + description: `The ID of the new price to switch this subscription item to.`, + }, + { + name: 'proration_behavior', + type: 'string', + required: false, + description: `Determines how to handle prorations when modifying this item.`, + }, + { + name: 'quantity', + type: 'integer', + required: false, + description: `The updated quantity of the subscription item.`, + }, + ], + }, + { + name: 'stripe_update_tax_rate_dahlia', + description: `Update a tax rate's display name, description, or active status.`, + params: [ + { + name: 'tax_rate', + type: 'string', + required: true, + description: `The ID of the tax rate to update.`, + }, + { + name: 'active', + type: 'boolean', + required: false, + description: `Set to false to deactivate the tax rate.`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `An arbitrary string attached to the tax rate for your internal use.`, + }, + { + name: 'display_name', + type: 'string', + required: false, + description: `The display name of the tax rate, shown to customers on invoices.`, + }, + { + name: 'jurisdiction', + type: 'string', + required: false, + description: `The jurisdiction for the tax rate.`, + }, + ], + }, + { + name: 'stripe_update_transfer_dahlia', + description: `Update a transfer's metadata.`, + params: [ + { + name: 'transfer', + type: 'string', + required: true, + description: `The ID of the transfer to update.`, + }, + { + name: 'metadata', + type: 'object', + required: false, + description: `Set of key-value pairs to attach to the transfer. Stripe's update endpoint only accepts metadata — description cannot be changed after creation.`, + }, + ], + }, + { + name: 'stripe_update_webhook_endpoint_dahlia', + description: `Update a webhook endpoint's URL, enabled events, or disabled status.`, + params: [ + { + name: 'webhook_endpoint', + type: 'string', + required: true, + description: `The ID of the webhook endpoint to update.`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `An updated description for the webhook endpoint.`, + }, + { + name: 'disabled', + type: 'boolean', + required: false, + description: `Whether the webhook endpoint is disabled.`, + }, + { + name: 'enabled_events', + type: 'array', + required: false, + description: `Updated list of event types this endpoint should receive.`, + }, + { + name: 'url', + type: 'string', + required: false, + description: `The new HTTPS URL for the webhook endpoint.`, + }, + ], + }, + { + name: 'stripe_void_invoice_dahlia', + description: `Mark a finalized invoice as void. This cannot be undone. Voiding an invoice is similar to deletion, however it only applies to finalized invoices and maintains a papertrail where the invoice can still be found.`, + params: [ + { + name: 'invoice_id', + type: 'string', + required: true, + description: `The ID of the invoice to void.`, + }, + ], + }, +] diff --git a/src/data/agent-connectors/tools-index.json b/src/data/agent-connectors/tools-index.json index 97ce0328a..910cbe15f 100644 --- a/src/data/agent-connectors/tools-index.json +++ b/src/data/agent-connectors/tools-index.json @@ -2964,6 +2964,581 @@ "name": "alphaxivmcp_read_files_from_github_repository", "description": "Reads the contents of a file or directory from the paper's codebase repository. Returns repository structure for '/', directory listing for directories, or file contents for files." }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_bulk_assign_annotation_category", + "description": "Assign an existing annotation category to multiple annotations at once." + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_create_annotation", + "description": "Create a chart annotation marking a single date or a date range, either globally visible on all charts or scoped to one chart. CONFIRMED (live-tested): category and chart_id are both validated against real resources already known to Amplitude — an unrecognized category name or c…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_create_annotation_category", + "description": "Create a new category for organizing chart annotations in Amplitude." + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_create_dsar_request", + "description": "Create a Data Subject Access Request (DSAR) job that collects all of a specific user's data from Amplitude for a given date range. Requires a connected account whose API Key/Secret Key fields hold Amplitude's ORGANIZATION-level credentials, not the project-level credentials most…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_create_event_category", + "description": "Create a new event category in Amplitude's taxonomy, used to group related event types." + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_create_event_property", + "description": "Create a new event property in Amplitude's taxonomy. If event_type is set, this creates an event-specific property override for that event type; if omitted, this creates a shared property used across all events." + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_create_event_type", + "description": "Create a new event type in Amplitude's taxonomy, optionally assigning it a category, description, tags, owner, and visibility flags." + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_create_group_property", + "description": "Create a new group property in Amplitude's Taxonomy — a custom property scoped to a specific group type (e.g. 'org', 'company') rather than to users or events. Only group_property and group_type are explicitly confirmed by Amplitude's group-property docs; the remaining descripti…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_create_release", + "description": "Create a release annotation in Amplitude, marking a version rollout with a start (and optionally end) time. When chart_visibility is true (the default), the release appears as an annotation on charts. Amplitude's docs only document a 200 success response and a 400 bad-request re…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_create_user_property", + "description": "Create a new user property in Amplitude's taxonomy. Unlike event properties, user properties have no event_type or is_required field — they always apply globally to the user profile, not to a specific event." + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_delete_annotation", + "description": "Permanently delete a chart annotation from Amplitude." + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_delete_annotation_category", + "description": "Permanently delete a chart annotation category from Amplitude. This does not delete the annotations that used this category, only the category grouping itself." + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_delete_event_category", + "description": "Permanently delete an event category from Amplitude's taxonomy." + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_delete_event_property", + "description": "Delete an event property from Amplitude's taxonomy. amplitudeanalytics_restore_event_property can undo this, but CONFIRMED (live-tested) only for properties that were previously 'live' (actually seen on ingested events) — deleting a purely taxonomy-declared property that was nev…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_delete_event_type", + "description": "Delete an event type from Amplitude's taxonomy. Deletion is state-machine driven: a 'live' event type is marked deleted; an 'unexpected' event type is first added to the tracking plan then deleted; a 'planned' event type is simply removed from the plan; a 'transformed' event typ…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_delete_user_property", + "description": "Delete a custom user property from Amplitude's taxonomy. Amplitude-owned (built-in) user properties cannot be deleted through this API and will return an error. amplitudeanalytics_restore_user_property can undo this, but CONFIRMED (live-tested) only for properties that were prev…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_export_events", + "description": "Export raw event data uploaded to Amplitude within a date range as a zip archive of NDJSON files. The response is a binary zip file, not JSON — save it to disk rather than parsing it as JSON. start and end use the YYYYMMDDTHH format (e.g. 20220201T05), and the start-end range ca…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_get_annotation", + "description": "Retrieve a single chart annotation by its ID." + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_get_annotation_category", + "description": "Retrieve a single chart annotation category by its ID." + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_get_cohort_membership_file", + "description": "Download the completed cohort membership export started with amplitudeanalytics_request_cohort_membership, once amplitudeanalytics_get_cohort_membership_status reports it complete. Small cohorts return the gzip-compressed member data directly; large cohorts return an HTTP 302 re…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_get_cohort_membership_status", + "description": "Check the status of an asynchronous cohort membership export previously started with amplitudeanalytics_request_cohort_membership. Once the status reports completion, call amplitudeanalytics_get_cohort_membership_file to download the data. Note: Amplitude's documented async_stat…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_get_cohort_usage", + "description": "Check how much of the Behavioral Cohorts Download API's monthly quota has been used. Growth and Enterprise plans are limited to 500 download requests per month; this shows the current usage count and when it resets." + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_get_dsar_output_file", + "description": "Download a single completed output file from a Data Subject Access Request (DSAR) job. Requires a connected account whose API Key/Secret Key fields hold Amplitude's ORGANIZATION-level credentials, not the project-level credentials most other tools in this connector use — use the…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_get_dsar_request_status", + "description": "Check the status of a Data Subject Access Request (DSAR) job previously created with amplitudeanalytics_create_dsar_request. Requires a connected account whose API Key/Secret Key fields hold Amplitude's ORGANIZATION-level credentials, not the project-level credentials most other…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_get_event_category", + "description": "Retrieve a single event category from Amplitude's taxonomy, looked up by its category_name. Unlike amplitudeanalytics_update_event_category and amplitudeanalytics_delete_event_category (which are keyed by category_id), this endpoint is keyed by category_name — this matches Ampli…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_get_event_segmentation", + "description": "Pull Event Segmentation chart data from the Amplitude Dashboard REST API: measure an event (uniques, totals, or another metric) over a date range, with optional segment filters and up to two group-by properties. Rate limits: 5 concurrent requests shared with other Amplitude Dash…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_get_event_streaming_metrics", + "description": "Get the delivery-metrics summary for an Amplitude Event Streaming sync over a time window. The response includes timePeriod, eventsDelivered, eventsNotDelivered, deliveryRate, latencyInSeconds (p95), successOnFirstAttempt, successAfterRetry, eventsExpired, and eventsDiscarded. A…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_get_event_type", + "description": "Retrieve a single event type from Amplitude's taxonomy by its event_type name. CONFIRMED (live-tested): if the event type has is_hidden_from_dropdowns set to true, this single-item lookup returns 'Not found' even though the event type still fully exists and appears in amplitudea…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_get_funnel_results", + "description": "Pull Funnel Analysis chart data from the Amplitude Dashboard REST API: step-by-step conversion and drop-off for an ordered (or unordered/sequential) sequence of two or more events over a date range. Rate limits: 5 concurrent requests shared with other Amplitude Dashboard/Cohort …" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_get_group_property", + "description": "Retrieve a single group property from Amplitude's Taxonomy by name." + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_get_session_replay_files", + "description": "Get download links for a single Amplitude session replay's recorded event files. Returns a files array of presigned S3 URLs — these URLs expire after 15 minutes, so download the files promptly after calling this." + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_get_user_mapping", + "description": "Look up user identity mappings (aliases) for one or more Amplitude user IDs. The response is an object keyed by each requested user_id, where each value has mapped_from[] and mapped_to[] arrays of {amplitude_id, user_id} pairs describing merged/aliased identities. This is the on…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_get_user_property", + "description": "Retrieve a single user property by name from Amplitude's taxonomy. CONFIRMED (live-tested): Amplitude auto-prepends 'gp:' to custom user property names on creation regardless of what name amplitudeanalytics_create_user_property was called with — use amplitudeanalytics_list_user_…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_list_annotation_categories", + "description": "List all chart annotation categories in the Amplitude project, or filter to a single category by name." + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_list_annotations", + "description": "List chart annotations, optionally filtered by category, by chart, or by a date range. CONFIRMED (live-tested): category and chart_id do NOT combine as a logical AND, and Amplitude does NOT error if both are set — category silently wins and chart_id is dropped entirely, even whe…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_list_cohorts", + "description": "List all behavioral cohorts defined in the Amplitude project. Returns each cohort's id, name, description, size, published/archived state, owners, viewers, definition, and last-computed time. Use this to find a cohort's id before calling amplitudeanalytics_request_cohort_members…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_list_event_categories", + "description": "List all event categories defined in Amplitude's taxonomy." + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_list_event_properties", + "description": "Get the event properties defined in Amplitude's taxonomy — either the shared properties used across all events, or (if event_type is set) the properties specific to one event type. Note: per Amplitude's documentation, this parameter is sent as a JSON request body on a GET reques…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_list_event_types", + "description": "List event types defined in Amplitude's taxonomy, optionally including deleted ones." + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_list_group_properties", + "description": "List group properties defined in Amplitude's Taxonomy. Pass group_type to scope the list to that group type (e.g. 'org'); omit it to list properties shared across group types rather than any single type's properties." + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_list_session_replays", + "description": "List Amplitude Session Replay recordings, optionally filtered by time range, Amplitude user ID, or an explicit set of replay IDs, with pagination and sort order control. amplitude_id and replay_id are mutually exclusive filters, and replay_id is also mutually exclusive with page…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_list_user_deletion_jobs", + "description": "List Amplitude user-deletion jobs submitted within a date range. The start_day-end_day range cannot exceed 6 months. Returns an array of job objects, each with day, status (Staging, Submitted, or Done), amplitude_ids (the Amplitude user IDs in that day's job), app, and active_sc…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_list_user_properties", + "description": "List user properties in Amplitude's taxonomy, optionally including previously deleted ones." + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_remove_user_from_deletion", + "description": "Remove a single user from a pending Amplitude user-deletion job before it locks, preventing their data from being deleted. This is a protective/cancel action, not a destructive one. It only works while the job is still in Staging status (within the roughly 3-day window after amp…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_request_cohort_membership", + "description": "Start an asynchronous export of an Amplitude cohort's membership (the users/devices in the cohort). Returns a request_id — poll amplitudeanalytics_get_cohort_membership_status with that id until it reports completion, then call amplitudeanalytics_get_cohort_membership_file to do…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_restore_event_property", + "description": "Restore a previously deleted event property back to active status. CONFIRMED (live-tested): this only works for properties that were 'live' (actually seen on ingested events) before being soft-deleted. For a purely taxonomy-declared property that was never ingested, amplitudeana…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_restore_event_type", + "description": "Restore a previously deleted event type back to active/tracked status. CONFIRMED (live-tested): this only works for event types that were 'live' (actually ingested) before being soft-deleted. For a purely taxonomy-declared 'planned' event type that was deleted with amplitudeanal…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_restore_user_property", + "description": "Restore a previously deleted user property back to active status. CONFIRMED (live-tested): this only works for properties that were 'live' (actually seen on ingested events) before being soft-deleted. For a purely taxonomy-declared property that was never ingested, amplitudeanal…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_submit_user_deletion", + "description": "Submit a batch job to permanently delete users' data from Amplitude. Provide amplitude_ids, user_ids, or both — at least one is required; the API rejects a request with neither, which this input schema cannot enforce on its own. A single request accepts a maximum of 100 IDs comb…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_update_annotation", + "description": "Partially update an existing chart annotation. Only the fields you provide are changed; omitted fields keep their current value. Set chart_id to null to make a chart-scoped annotation global again. KNOWN AMPLITUDE API BUG (live-tested): setting end to null does NOT clear the end…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_update_annotation_category", + "description": "Rename an existing chart annotation category." + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_update_cohort_membership", + "description": "Add or remove individual members from an existing Amplitude cohort, without replacing the whole membership list. To create a cohort or replace its full membership list, use amplitudeanalytics_upload_cohort instead. CONFIRMED (live-tested): routing, auth, and the memberships arra…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_update_event_category", + "description": "Rename an existing event category in Amplitude's taxonomy." + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_update_event_property", + "description": "Partially update an existing event property in Amplitude's taxonomy. Only the fields you provide are changed; omitted fields keep their current value. Use overrideScope to control whether the update applies to an event-specific override or the shared property definition, and new…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_update_event_type", + "description": "Partially update an existing event type in Amplitude's taxonomy. Only the fields you provide are changed; omitted fields keep their current value. Set new_event_type to rename the event type." + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_update_group_property", + "description": "Partially update an existing Amplitude Taxonomy group property. Amplitude's update-group-property docs list no body fields at all beyond the path variable, so every field below — including group_type — is inferred by analogy with the create endpoint and the sibling event/user pr…" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_update_user_property", + "description": "Partially update an existing user property in Amplitude's taxonomy. Only the fields you provide are changed; omitted fields keep their current value. CONFIRMED BUG (live-tested, reproduced independently twice): new_event_property_value does NOT actually rename a user property — …" + }, + { + "slug": "amplitudeanalytics", + "name": "amplitudeanalytics_upload_cohort", + "description": "Create a new Amplitude behavioral cohort from an explicit list of user or Amplitude IDs, or update an existing cohort's membership list wholesale by passing existing_cohort_id. To add/remove individual members from an already-created cohort instead, use amplitudeanalytics_update…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_add_experiment_variant_cohorts", + "description": "Add specific cohorts to this experiment variant's targeting inclusions. This adds to the variant's existing cohort inclusions; it does not replace them. CONFIRMED from Amplitude's docs: POST /api/1/experiments/{id}/variants/{variantKey}/cohorts with body {\"inclusions\": [...]}, a…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_add_experiment_variant_users", + "description": "Force-bucket specific users or devices into this experiment variant — identified by user ID, device ID, or an email-style identifier — bypassing the experiment's normal allocation. This adds to the variant's existing inclusions; it does not replace them. CONFIRMED from Amplitude…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_add_flag_variant_cohorts", + "description": "Add specific cohorts as inclusions on a variant of an Amplitude Experiment feature flag — explicitly assigning these cohorts to this variant regardless of the variant's rollout weight. UNCONFIRMED: unlike the users endpoint, Amplitude's docs don't mention any documented maximum …" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_add_flag_variant_users", + "description": "Add specific users, devices, or emails as individual inclusions on a variant of an Amplitude Experiment feature flag — explicitly assigning these identities to this variant regardless of the variant's rollout weight. Amplitude allows up to 2,000 total inclusions per variant; exc…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_bulk_delete_experiment_variant_cohorts", + "description": "Remove a specific set of cohorts (by ID) from an experiment variant's targeting, leaving other included cohorts untouched. Limited to 100 IDs per request — split larger lists across multiple calls.\n\nCONFIRMED from Amplitude's docs: despite being a DELETE request, cohort IDs are …" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_bulk_delete_experiment_variant_users", + "description": "Remove a specific set of users or devices (by ID) from an experiment variant's inclusion list, leaving all other included users untouched. This is distinct from the remove-all-users tool, which wipes the entire inclusion list regardless of which IDs exist. Limited to 100 user/de…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_bulk_delete_flag_variant_cohorts", + "description": "Remove a specific set of cohorts (by ID) from a flag variant's individual-inclusion list — the cohort analog of Bulk Delete Flag Variant Users.\n\nCONFIRMED from Amplitude's docs: despite being a DELETE request, cohort IDs are sent as a JSON body (not query params). The body field…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_bulk_delete_flag_variant_users", + "description": "Remove a specific SET of users (by user/device ID) from a flag variant's individual-inclusion list — distinct from Remove All Flag Variant Users, which unconditionally clears every user regardless of ID. Per Amplitude's official docs (verified via two independent doc fetches), t…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_create_deployment", + "description": "Create a new deployment in a project. Required fields per Amplitude's docs: projectId, label, and type. A deployment represents one SDK key / environment (for example \"Production\" or \"Development\") that flags and experiments get deployed to. A successful call returns a 200 OK wi…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_create_experiment", + "description": "Create a new Amplitude experiment. Required: project_id, key. name is technically optional per this tool (Amplitude's docs disagree), but supply it anyway — every documented example includes it.\n\ndeliveryMethod and rolloutPercentage are not create-time fields — only projectId, k…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_create_experiment_deployment", + "description": "Deploy an experiment to one or more deployments. CONFIRMED directly from Amplitude's official docs (exact JSON example: {\"deployments\": [\"\"]}): the request body field is the plural array 'deployments', not a singular 'deploymentId' — pass a one-element array to dep…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_create_experiment_variant", + "description": "Add a new variant to an experiment. CONFIRMED from Amplitude's official docs (verified against the page's raw rendered source, not just its visible text): POST /api/1/experiments/{id}/variants with body {key, name, description, payload, rolloutWeight} — key is the only required …" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_create_flag", + "description": "Create a new Amplitude Experiment feature flag. Required: projectId, key. All other fields are optional at creation.\n\nCONFIRMED from Amplitude's docs: tags, rolloutPercentage, enabled, and archive are NOT settable here — set them afterward via update_flag. parentDependencies isn…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_create_flag_deployment", + "description": "Deploy a flag to one or more deployments. Per Amplitude's official docs, the request body takes a deployments array of deployment ID strings — {\"deployments\": [\"\"]} — not a single deploymentId field, so this tool accepts deployment_ids as an array (pass one ID to d…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_create_flag_variant", + "description": "Create a new variant for an Amplitude Experiment feature flag. Only the variant key is required — name, description, payload, and rollout weight are all optional. CONFIRMED (live-tested): this org has Feature Experimentation entitlement. Per Amplitude's docs, a successful call r…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_create_holdout_group", + "description": "Create a new holdout group. Required: projectId, name, holdoutPercentage. \\`individualInclusion\\`/\\`individualExclusion\\` are named from the holdout's own point of view — inclusion in the holdout means exclusion from experiments, and vice versa.\n\nFIXED (confirmed live both regio…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_create_mutex_group", + "description": "Create a new mutex group. Required: projectId, name, slots (JSON-encoded string — see that field's description for shape).\n\nFIXED (confirmed live both regions): this field was previously sent as a raw string instead of a parsed array via body_json_mapping — now uses jsonnet_temp…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_delete_experiment_deployment", + "description": "Undeploy an experiment from a specific deployment — the experiment is removed from that deployment only; any other deployments it's on are unaffected. A successful call returns 200 OK with the literal text 'OK' (not a JSON body); this tool reports success from the status code, n…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_delete_experiment_variant", + "description": "Permanently remove a variant from an experiment. CONFIRMED from Amplitude's docs: DELETE /api/1/experiments/{id}/variants/{variantKey}, no request body. A successful call returns 200 OK with the literal text \"OK\" — Amplitude does not use 204 No Content here, unlike many REST API…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_delete_flag_deployment", + "description": "Undeploy a flag from a specific deployment, identified by deploymentId. This does not delete the deployment itself — a deployment is a shared target that other flags and experiments may also use — it only removes this one flag's association with that deployment. Use List Flag De…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_delete_flag_variant", + "description": "Permanently remove a variant from an Amplitude Experiment feature flag. This deletes the variant definition itself — its key, name, description, payload, and rollout weight — not just its user or cohort inclusions. This is irreversible; any experiment allocations or targeting ru…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_get_experiment", + "description": "Get complete details for a single Amplitude experiment by its ID. Returns the full experiment object — its shape is CONFIRMED via a live-tested list_experiments call against this org (list_experiments returns objects of this same type): id, projectId, deployments[], key, name, d…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_get_experiment_variant", + "description": "Get a single variant's details from an Amplitude experiment, by experiment ID and variant key (the variants[].key value, e.g. \"control\" or \"treatment\"). Use list_experiment_variants or the parent experiment's variants[] array to find valid keys. Amplitude's docs give no example …" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_get_experiment_variant_cohorts", + "description": "List the cohorts explicitly included in this experiment variant's targeting. CONFIRMED from Amplitude's docs: GET /api/1/experiments/{id}/variants/{variantKey}/cohorts, no query parameters documented (no pagination). Response is 200 OK with an array of cohort ID strings (not obj…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_get_experiment_variant_users", + "description": "List the users and devices explicitly force-bucketed into this experiment variant via inclusions — separate from, and in addition to, the experiment's normal allocation/targeting rules. CONFIRMED from Amplitude's docs: GET /api/1/experiments/{id}/variants/{variantKey}/users, no …" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_get_experiment_version", + "description": "Get a single historical version snapshot of an Amplitude experiment, by experiment ID and version ID. Use a version ID returned from list_experiment_versions. Amplitude's docs describe this endpoint only as returning \"details of a specific version of an experiment\" — no example …" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_get_flag", + "description": "Get the full configuration of a single Amplitude Experiment feature flag by its ID. Returns the flag's complete details as documented by Amplitude: id, projectId, deployments, key, name, description, enabled, evaluationMode, bucketingKey, bucketingSalt, bucketingUnit, variants, …" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_get_flag_variant", + "description": "Get a single variant's details from an Amplitude Experiment feature flag. Returns a JSON object with key (required), and optional payload, name, and description fields. Variant keys may contain letters, numbers, underscores, and hyphens (per Amplitude's docs). This org has confi…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_get_flag_variant_cohorts", + "description": "List the cohorts individually assigned (included) to a specific variant of an Amplitude Experiment feature flag. No query parameters, filters, or pagination are documented for this endpoint. Per Amplitude's docs, a successful call returns a 200 OK response with \"the variant's co…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_get_flag_variant_users", + "description": "List the users and devices individually assigned (included) to a specific variant of an Amplitude Experiment feature flag — the explicit targeting list, separate from the variant's percentage-based rollout weight. No query parameters, filters, or pagination are documented for th…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_get_flag_version", + "description": "Get a single version snapshot of an Amplitude Experiment feature flag. Returns a JSON object with createdAt, createdBy, version (a number), and flagConfig (the full flag configuration as it existed at that version — id, projectId, deployments, key, name, description, enabled, ev…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_get_holdout_group", + "description": "Retrieve a single holdout group's full configuration by ID — expected to mirror the shape accepted by Create Holdout Group (name, description, holdoutPercentage, evaluationMode, bucketingKey, experiments, individualInclusion, individualExclusion). UNCONFIRMED (doc gap): Amplitud…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_get_mutex_group", + "description": "Retrieve a single mutex group's full configuration by ID — expected to include its slots and which experiments, holdouts, or individuals occupy each one, mirroring the shape accepted by Create Mutex Group (name, description, evaluationMode, bucketingKey, bucketingSalt, and a slo…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_list_all_versions", + "description": "List version history across ALL flags and experiments the API key can access, in one global, paginated feed — distinct from amplitudeexperimentmanagement_list_flag_versions and amplitudeexperimentmanagement_list_experiment_versions, which return the version history for one speci…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_list_deployments", + "description": "List all deployments in the project. A deployment represents one SDK key / environment (for example \"Production\" or \"Development\") that flags and experiments get deployed to. CONFIRMED from Amplitude's docs: the response follows {\"deployments\": [{\"id\": ..., \"projectId\": ..., \"la…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_list_experiment_deployments", + "description": "List the deployments that an experiment is currently deployed to. Amplitude's docs for this endpoint describe the response only as a '200 OK response and an array of JSON objects with the experiment's deployment details', without a concrete field-level example on this specific p…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_list_experiment_variants", + "description": "List all variants defined on a single Amplitude experiment. Amplitude's docs document no query parameters and give no example response JSON for this endpoint — expect an array of variant objects matching the variants[] entries embedded in the experiment resource. A live-tested l…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_list_experiment_versions", + "description": "List the version history for a single Amplitude experiment — one entry per saved change. Amplitude's docs state versions are \"ordered by creation time, descending\" but document no query parameters for this endpoint (no limit/cursor/date-range filtering) and give no example respo…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_list_experiments", + "description": "List Amplitude experiments for the project. Supports cursor-based pagination — pass the response's nextCursor value back as cursor to get the next page — and optional filters. CONFIRMED (live-tested): the real response shape is {\"experiments\": [...], \"nextCursor\": ...} — Amplitu…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_list_flag_deployments", + "description": "List the deployments a flag is currently deployed to. Per Amplitude's official docs, a successful call returns 200 OK with an array of JSON objects describing each deployment. UNCONFIRMED: Amplitude's docs don't show a raw JSON response example for this specific flag-scoped endp…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_list_flag_variants", + "description": "List all variants defined on a single Amplitude Experiment feature flag. Returns a JSON array of variant objects, each with key (required), and optional payload, name, and description fields. CONFIRMED from Amplitude's docs: no cursor/limit pagination parameters are documented f…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_list_flag_versions", + "description": "List the version history for a single Amplitude Experiment feature flag. Returns a JSON array of version objects, each containing createdAt, createdBy, version (a number), and flagConfig (a full snapshot of the flag's configuration at that version, including id, projectId, deplo…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_list_flags", + "description": "List Amplitude Experiment feature flags for the project. Supports cursor-based pagination — pass the response's nextCursor value back as cursor to get the next page — and optional filters. CONFIRMED (live-tested): this org has Feature Experimentation entitlement — a real call re…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_list_holdout_groups", + "description": "List all holdout groups in the project. A holdout group excludes a fixed percentage of users from every experiment associated with it, so you can measure the overall product impact of those experiments against a clean control population. UNCONFIRMED (doc gap): Amplitude's own AP…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_list_mutex_groups", + "description": "List all mutex groups in the project. A mutex group defines a set of \"slots\" so that the experiments, flags, holdouts, and/or individuals assigned to the same slot never run simultaneously for the same user — useful for guaranteeing exclusivity between conflicting tests. UNCONFI…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_remove_all_experiment_variant_users", + "description": "Remove ALL users and devices from an experiment variant's inclusion list in a single call — this clears the entire list, not one entry. To remove only one specific user, use the single-user removal tool (DELETE .../users/{userIndex}) instead. To remove a specific named set of us…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_remove_all_flag_variant_users", + "description": "Remove ALL users from a flag variant's individual-inclusion list in a single call. This clears the ENTIRE user list for that variant unconditionally — every individually-included user is removed, not just one. There is no way to keep a subset with this endpoint. To remove only o…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_remove_experiment_variant_user", + "description": "Remove one specific user or device (by its zero-indexed position) from an experiment variant's inclusion list. Per Amplitude's docs, the userIndex value should come from the 'Get variant inclusions' endpoint's response (GET /api/1/experiments/{id}/variants/{variantKey}/users) — …" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_remove_flag_variant_user", + "description": "Remove one specific user from a flag variant's individual-inclusion list, identified by the user's zero-indexed position in that list — not by user ID. Per Amplitude's official docs (confirmed via direct doc fetch), userIndex is documented as type string (e.g. \"0\", \"1\", \"2\"); ge…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_update_deployment", + "description": "Edit an existing deployment's label, or archive/restore it. Only the provided fields are changed; omitted fields remain unchanged. CONFIRMED from Amplitude's docs: a successful call returns 200 OK with the literal text \"OK\" as the body, not a JSON object — this tool treats the r…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_update_experiment", + "description": "Update an existing Amplitude experiment — partial update; only provided fields change (except end_date, see below). Editable fields: name, description, bucketing_key, bucketing_salt, bucketing_unit, evaluation_mode (remote|local), rollout_percentage (0-100), target_segments (JSO…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_update_experiment_variant", + "description": "Edit an existing experiment variant — rename its key, or update name, description, payload, or rolloutWeight. All body fields are optional; omit a field to leave its current value unchanged. CONFIRMED FROM RAW PAGE SOURCE (not just visible rendered text): this endpoint is PATCH,…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_update_flag", + "description": "Edit an existing Amplitude Experiment feature flag — partial update, only provided fields change.\n\nCONFIRMED editable: name, description, bucketingKey, bucketingSalt, bucketingUnit, evaluationMode, rolloutPercentage, targetSegments, enabled, archive, tags. CONFIRMED NOT editable…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_update_flag_variant", + "description": "Edit an existing flag variant — partial update; a provided \\`payload\\` fully replaces the existing one rather than merging.\n\nAmplitude's docs are self-contradictory on the HTTP method: the endpoint heading says POST, but the runnable curl example uses PATCH against the same URL.…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_update_holdout_group", + "description": "Edit an existing holdout group — partial update, only provided fields change. \\`individualInclusion\\`/\\`individualExclusion\\` are named from the holdout's own point of view — inclusion in the holdout means exclusion from experiments, and vice versa. UNCONFIRMED whether array fie…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_update_mutex_group", + "description": "Edit an existing mutex group's name, description, or archived state. Only the provided fields are changed; omitted fields remain unchanged. This endpoint does NOT edit slots — to change which experiments, holdouts, or individuals occupy a slot, use amplitudeexperimentmanagement_…" + }, + { + "slug": "amplitudeexperimentmanagement", + "name": "amplitudeexperimentmanagement_update_mutex_group_slot", + "description": "Edit which experiments, holdouts, and/or individuals occupy one slot in a mutex group, without touching the slot's percentage or any other slot. Complex fields are JSON-encoded strings, not native arrays. UNCONFIRMED whether omitting one of experiments/holdouts/individuals leave…" + }, { "slug": "anakinmcp", "name": "anakinmcp_agentic_search", @@ -18208,16 +18783,66 @@ "name": "digitsmcp_select_business", "description": "Select a business to work with. After calling this tool, use the returned business ID as business_id in subsequent tool calls." }, + { + "slug": "discord", + "name": "discord_consume_entitlement", + "description": "For one-time purchase consumable SKUs, mark a given entitlement for the user as consumed. The entitlement will have consumed: true when listed afterward. This action cannot be undone. Returns 204 No Content on success. Per Discord's official OpenAPI spec, this endpoint also acce…" + }, + { + "slug": "discord", + "name": "discord_create_lobby_channel_invite_for_self", + "description": "Create a single-use guild invite to a lobby's linked channel, targeted at the calling user. The lobby must have a linked channel and the caller must be a member of the lobby. The invite expires after one hour. Uses a Bearer token with the sdk.social_layer scope. Per Discord's of…" + }, + { + "slug": "discord", + "name": "discord_create_or_join_lobby", + "description": "Create a new lobby identified by a secret, or join the calling user to the existing lobby with that secret if one already exists. Updates lobby metadata and the calling member's metadata on join. Uses a Bearer token with the sdk.social_layer scope. Per Discord's official OpenAPI…" + }, + { + "slug": "discord", + "name": "discord_delete_current_user_application_role_connection", + "description": "Deletes the application role connection for the current user and the given application. Requires an OAuth2 access token with the role_connections.write scope for the application specified in the path." + }, + { + "slug": "discord", + "name": "discord_delete_test_entitlement", + "description": "Delete a currently-active test entitlement. Discord will act as though that user or guild no longer has entitlement to your premium offering. Returns 204 No Content on success. Per Discord's official OpenAPI spec, this endpoint also accepts an OAuth2 Bearer token with the \\`appl…" + }, + { + "slug": "discord", + "name": "discord_edit_application_command_permissions", + "description": "Edit the permissions for a specific application command in a guild. Requires OAuth2 bearer token with applications.commands.permissions.update scope. Returns a guild application command permissions object." + }, + { + "slug": "discord", + "name": "discord_get_application_command_permissions", + "description": "Fetch permissions for a specific application command in a guild. Returns a guild application command permissions object." + }, { "slug": "discord", "name": "discord_get_current_user_application_entitlements", "description": "Retrieves entitlements for the current user for a given application. Use when you need to check what premium offerings or subscriptions the authenticated user has access to. Requires the applications.entitlements OAuth2 scope." }, + { + "slug": "discord", + "name": "discord_get_current_user_application_role_connection", + "description": "Returns the application role connection for the current user and the given application. Requires an OAuth2 access token with the role_connections.write scope for the application specified in the path." + }, + { + "slug": "discord", + "name": "discord_get_entitlement", + "description": "Retrieve a single entitlement for an application by ID. Use to check whether a specific entitlement is active, its type, and its expiration window. Per Discord's official OpenAPI spec, this endpoint also accepts an OAuth2 Bearer token with the \\`applications.entitlements\\` scope…" + }, { "slug": "discord", "name": "discord_get_gateway", "description": "Retrieves a valid WebSocket (wss) URL for establishing a Gateway connection to Discord. Use when you need to connect to the Discord Gateway for real-time events. No authentication required." }, + { + "slug": "discord", + "name": "discord_get_guild_application_command_permissions", + "description": "Fetch permissions for all commands in a guild. Returns an array of guild application command permissions objects. Per Discord's official OpenAPI spec, this endpoint also accepts an OAuth2 Bearer token with the \\`applications.commands.permissions.update\\` scope (in addition to Bo…" + }, { "slug": "discord", "name": "discord_get_guild_template", @@ -18236,7 +18861,12 @@ { "slug": "discord", "name": "discord_get_invite_deprecated", - "description": "DEPRECATED: Use discord_resolve_invite instead. Retrieves information about a specific invite code including guild and channel details. This endpoint is deprecated — prefer the Resolve Invite tool for new integrations." + "description": "Retrieves information about a specific invite code, including guild and channel details. Use discord_resolve_invite instead, which supports additional query parameters such as guild_scheduled_event_id." + }, + { + "slug": "discord", + "name": "discord_get_lobby_messages", + "description": "Retrieve the most recent messages in a Discord lobby. The calling user must be a member of the lobby. Uses a Bearer token with the sdk.social_layer scope. Per Discord's official OpenAPI spec, this endpoint also accepts a Bot Token (in addition to OAuth2) — use this tool for user…" }, { "slug": "discord", @@ -18263,16 +18893,41 @@ "name": "discord_get_public_keys", "description": "Retrieves Discord OAuth2 public keys (JWKS). Use when you need to verify OAuth2 tokens or access public keys for cryptographic operations such as signature verification." }, + { + "slug": "discord", + "name": "discord_get_sku_subscription", + "description": "Retrieve a single subscription for a SKU by its ID. Returns a subscription object with its status, current billing period, and the entitlements it grants. Per Discord's official OpenAPI spec, this endpoint also accepts an OAuth2 Bearer token (in addition to Bot Token) — use this…" + }, { "slug": "discord", "name": "discord_get_user", "description": "Retrieve information about a Discord user. With OAuth Bearer token, use '@me' as user_id to return the authenticated user's information. With a Bot token, you can query any user by their ID. Returns username, avatar, discriminator, locale, premium status, and email (if email sco…" }, + { + "slug": "discord", + "name": "discord_leave_lobby", + "description": "Remove the calling user from the specified Discord lobby. Safe to call even if the user is no longer a member, but fails if the lobby does not exist. Uses a Bearer token for authorization. Per Discord's official OpenAPI spec, this endpoint also accepts a Bot Token (in addition t…" + }, + { + "slug": "discord", + "name": "discord_link_channel_to_lobby", + "description": "Link an existing guild text channel to a Discord lobby, or unlink any currently linked channel by omitting channel_id. Uses a Bearer token for authorization; the caller must be a lobby member with the CanLinkLobby lobby member flag. Per Discord's official OpenAPI spec, this endp…" + }, + { + "slug": "discord", + "name": "discord_list_guild_channels", + "description": "Retrieve all channels in a Discord guild (server). Returns a list of channel objects including text channels, voice channels, categories, and threads. Per Discord's official OpenAPI spec, this endpoint also accepts a plain OAuth2 Bearer token (no specific scope required beyond a…" + }, { "slug": "discord", "name": "discord_list_my_guilds", "description": "Lists the current user's guilds, returning partial data (id, name, icon, owner, permissions, features) for each. Primarily used for displaying server lists or verifying guild memberships. Requires the 'guilds' OAuth2 scope." }, + { + "slug": "discord", + "name": "discord_list_sku_subscriptions", + "description": "Retrieve all subscriptions containing a given SKU, filtered by user. Returns a list of subscription objects representing recurring payments for that SKU. Per Discord's official OpenAPI spec, this endpoint also accepts an OAuth2 Bearer token (in addition to Bot Token) — use this …" + }, { "slug": "discord", "name": "discord_list_sticker_packs", @@ -18288,6 +18943,1041 @@ "name": "discord_retrieve_user_connections", "description": "Retrieves a list of the authenticated user's connected third-party accounts on Discord, such as Twitch, YouTube, GitHub, Steam, and others. Requires the 'connections' OAuth2 scope." }, + { + "slug": "discord", + "name": "discord_send_lobby_message", + "description": "Send a message to a Discord lobby. The calling user must be a member of the lobby. Uses a Bearer token with the sdk.social_layer scope. Per Discord's official OpenAPI spec, this endpoint also accepts a Bot Token (in addition to OAuth2) — use this tool for user-authorized OAuth c…" + }, + { + "slug": "discord", + "name": "discord_update_current_user_application_role_connection", + "description": "Updates and returns the application role connection for the current user and the given application. Requires an OAuth2 access token with the role_connections.write scope for the application specified in the path." + }, + { + "slug": "discordbot", + "name": "discordbot_add_guild_member", + "description": "Add a user to a guild using their OAuth2 access token with the guilds.join scope. Returns 201 if the user was added, or 204 if already a member." + }, + { + "slug": "discordbot", + "name": "discordbot_add_guild_member_role", + "description": "Add a role to a guild member. Requires MANAGE_ROLES permission. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_add_lobby_member", + "description": "Add the specified user to a Discord lobby. If the user is already a member, updates their metadata and flags instead. Returns the lobby member object." + }, + { + "slug": "discordbot", + "name": "discordbot_add_thread_member", + "description": "Add another user to a thread. Requires the thread to not be archived. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_begin_guild_prune", + "description": "Begin a prune operation to kick inactive members. Requires KICK_MEMBERS permission. Returns a pruned object with the count of kicked members (or null if compute_prune_count is false)." + }, + { + "slug": "discordbot", + "name": "discordbot_bulk_delete_messages", + "description": "Delete multiple messages in a Discord channel in a single request (2-100 messages). Messages older than 2 weeks cannot be deleted this way. Requires MANAGE_MESSAGES permission." + }, + { + "slug": "discordbot", + "name": "discordbot_bulk_guild_ban", + "description": "Ban up to 200 users from a guild and optionally delete their recent messages. Requires both BAN_MEMBERS and MANAGE_GUILD permissions. Returns object with banned_users and failed_users arrays." + }, + { + "slug": "discordbot", + "name": "discordbot_bulk_overwrite_global_application_commands", + "description": "Bulk overwrite all global application commands. Takes a full list of commands to replace existing ones. Any commands not included will be deleted. Returns an array of application command objects." + }, + { + "slug": "discordbot", + "name": "discordbot_bulk_overwrite_guild_application_commands", + "description": "Bulk overwrite all application commands registered in a guild. Commands not included will be deleted. Returns an array of application command objects." + }, + { + "slug": "discordbot", + "name": "discordbot_bulk_update_lobby_members", + "description": "Add, update, or remove up to 25 members from a Discord lobby in a single request. Members with remove_member false (the default) are upserted; members with remove_member true are removed. Users unknown to Discord return a 404 error. Users that fail permission checks, or that alr…" + }, + { + "slug": "discordbot", + "name": "discordbot_consume_entitlement", + "description": "For one-time purchase consumable SKUs, mark a given entitlement for the user as consumed. The entitlement will have consumed: true when listed afterward. This action cannot be undone. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_create_application_emoji", + "description": "Create a new emoji owned by a Discord application (app emoji). Returns the new emoji object." + }, + { + "slug": "discordbot", + "name": "discordbot_create_auto_moderation_rule", + "description": "Create a new Auto Moderation rule for a guild. Requires the MANAGE_GUILD permission. Fires an Auto Moderation Rule Create Gateway event. Returns the new auto moderation rule object on success." + }, + { + "slug": "discordbot", + "name": "discordbot_create_channel_invite", + "description": "Create a new invite for a Discord channel. Requires CREATE_INSTANT_INVITE permission. Returns an invite object." + }, + { + "slug": "discordbot", + "name": "discordbot_create_dm", + "description": "Create a new DM channel with a user. Returns a DM channel object. If a DM channel already exists with the user, it is returned." + }, + { + "slug": "discordbot", + "name": "discordbot_create_global_application_command", + "description": "Create a new global application command. If a command with the same name already exists, it will be overwritten. Returns the created command object." + }, + { + "slug": "discordbot", + "name": "discordbot_create_group_dm", + "description": "Create a new group DM channel with multiple users using their OAuth2 access tokens (granted the gdm.join scope). Returns a DM channel object. This endpoint was intended to be used with the now-deprecated GameBridge SDK and is limited to 10 active group DMs. Fires a Channel Creat…" + }, + { + "slug": "discordbot", + "name": "discordbot_create_guild_application_command", + "description": "Create a new application command for a specific guild. Guild commands are only available in the guild they are created in. Returns the created command object." + }, + { + "slug": "discordbot", + "name": "discordbot_create_guild_ban", + "description": "Ban a user from a Discord guild. Requires BAN_MEMBERS permission. Optionally delete recent messages from the banned user." + }, + { + "slug": "discordbot", + "name": "discordbot_create_guild_channel", + "description": "Create a new channel in a guild. Requires MANAGE_CHANNELS permission. Returns the new channel object. Each permission_overwrites entry may specify 'allow_names'/'deny_names' (arrays of named permission flags) instead of raw 'allow'/'deny' integers — the correct bitfield is compu…" + }, + { + "slug": "discordbot", + "name": "discordbot_create_guild_emoji", + "description": "Create a new emoji for a guild. Requires CREATE_GUILD_EXPRESSIONS permission. Returns the new emoji object." + }, + { + "slug": "discordbot", + "name": "discordbot_create_guild_role", + "description": "Create a new role for a guild. Requires MANAGE_ROLES permission. Returns the new role object. Full permission flag reference (name=decimal value, OR multiple together): CREATE_INSTANT_INVITE=1, KICK_MEMBERS=2, BAN_MEMBERS=4, ADMINISTRATOR=8, MANAGE_CHANNELS=16, MANAGE_GUILD=32, …" + }, + { + "slug": "discordbot", + "name": "discordbot_create_guild_scheduled_event", + "description": "Create a new scheduled event in a Discord guild. Entity type determines the event location: 1=STAGE_INSTANCE, 2=VOICE (requires channel_id), 3=EXTERNAL (requires entity_metadata with location and scheduled_end_time)." + }, + { + "slug": "discordbot", + "name": "discordbot_create_guild_soundboard_sound", + "description": "Create a new soundboard sound for the guild. Requires the CREATE_GUILD_EXPRESSIONS permission. Sounds have a max file size of 512kb and a max duration of 5.2 seconds. Fires a Guild Soundboard Sound Create Gateway event. Returns the new soundboard sound object on success." + }, + { + "slug": "discordbot", + "name": "discordbot_create_guild_template", + "description": "Create a template from a guild's current state. Requires the MANAGE_GUILD permission. Returns the created guild template object on success." + }, + { + "slug": "discordbot", + "name": "discordbot_create_interaction_response", + "description": "Respond to an interaction from Discord. Must be called within 3 seconds of receiving the interaction. Type determines the response kind: 1=PONG, 4=CHANNEL_MESSAGE_WITH_SOURCE, 5=DEFERRED_CHANNEL_MESSAGE_WITH_SOURCE, 6=DEFERRED_UPDATE_MESSAGE, 7=UPDATE_MESSAGE, 8=APPLICATION_COMM…" + }, + { + "slug": "discordbot", + "name": "discordbot_create_lobby", + "description": "Create a new Discord lobby for matchmaking, optionally adding members to it. Discord Social SDK clients cannot join or leave a lobby created via this API. Returns a lobby object." + }, + { + "slug": "discordbot", + "name": "discordbot_create_lobby_channel_invite_for_self", + "description": "Create a single-use guild invite to a lobby's linked channel, targeted at the calling user. The lobby must have a linked channel and the caller must be a member of the lobby. The invite expires after one hour. Returns a lobby invite object." + }, + { + "slug": "discordbot", + "name": "discordbot_create_lobby_channel_invite_for_user", + "description": "Create a single-use guild invite to a lobby's linked channel on behalf of an application, targeted at the specified user. The lobby must have a linked channel. The invite expires after one hour. Uses a Bot token for authorization. Returns a lobby invite object." + }, + { + "slug": "discordbot", + "name": "discordbot_create_message", + "description": "Send a message to a Discord channel. At least one of content, embeds, sticker_ids, or components must be provided. Supports rich embeds, message references for replies, and components." + }, + { + "slug": "discordbot", + "name": "discordbot_create_or_join_lobby", + "description": "Create a new lobby identified by a secret, or join the calling user to the existing lobby with that secret if one already exists. Updates lobby metadata and the calling member's metadata on join. Returns a lobby object." + }, + { + "slug": "discordbot", + "name": "discordbot_create_reaction", + "description": "Add a reaction to a message in a Discord channel. The emoji parameter should be URL-encoded (e.g., a Unicode emoji like %F0%9F%94%A5 for 🔥, or name:id for custom emojis)." + }, + { + "slug": "discordbot", + "name": "discordbot_create_stage_instance", + "description": "Create a new Stage instance associated with a Stage channel, making the channel go live. Requires the user to be a moderator of the Stage channel (MANAGE_CHANNELS, MUTE_MEMBERS, and MOVE_MEMBERS permissions). Fires a Stage Instance Create Gateway event. Returns the new Stage ins…" + }, + { + "slug": "discordbot", + "name": "discordbot_create_test_entitlement", + "description": "Create a test entitlement to a given SKU for a given guild or user. Discord will act as though that user or guild has entitlement to your premium offering. After creating a test entitlement, reload your Discord client to see the server or user gain premium access. Returns a part…" + }, + { + "slug": "discordbot", + "name": "discordbot_create_webhook", + "description": "Create a new webhook for a Discord channel. Requires MANAGE_WEBHOOKS permission. Returns the newly created webhook object with its token." + }, + { + "slug": "discordbot", + "name": "discordbot_crosspost_message", + "description": "Crosspost a message in an announcement channel to all following channels. Requires SEND_MESSAGES permission if the current user wrote the message, or MANAGE_MESSAGES if they did not." + }, + { + "slug": "discordbot", + "name": "discordbot_delete_all_reactions", + "description": "Delete all reactions on a message. Requires MANAGE_MESSAGES permission. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_delete_all_reactions_for_emoji", + "description": "Delete all reactions for a specific emoji on a message. Requires MANAGE_MESSAGES permission. Use URL-encoded emoji format. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_delete_application_emoji", + "description": "Delete an emoji owned by a Discord application. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_delete_auto_moderation_rule", + "description": "Delete an Auto Moderation rule for a guild. Requires the MANAGE_GUILD permission. Fires an Auto Moderation Rule Delete Gateway event. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_delete_channel", + "description": "Delete a channel or close a private message. For guild channels, requires MANAGE_CHANNELS permission. Deleting a category does not delete its child channels. Returns the deleted channel object." + }, + { + "slug": "discordbot", + "name": "discordbot_delete_channel_invite", + "description": "Delete an invite by its code. Requires MANAGE_CHANNELS permission for guild channel invites or MANAGE_GUILD. Returns the deleted invite object." + }, + { + "slug": "discordbot", + "name": "discordbot_delete_channel_permission", + "description": "Delete a channel permission overwrite for a user or role in a channel. Requires MANAGE_ROLES permission. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_delete_global_application_command", + "description": "Delete a global application command. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_delete_guild_application_command", + "description": "Delete a guild application command. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_delete_guild_emoji", + "description": "Delete a guild emoji. Requires MANAGE_GUILD_EXPRESSIONS permission. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_delete_guild_integration", + "description": "Delete an attached integration for a guild. Deletes any associated webhooks and kicks the associated bot if there is one. Requires MANAGE_GUILD permission. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_delete_guild_invite", + "description": "Delete an invite by its code. Requires the MANAGE_CHANNELS permission on the channel this invite belongs to, or MANAGE_GUILD to remove any invite across the guild. Discord's invite-deletion endpoint is not guild-scoped in the URL — the invite code alone identifies it. Returns th…" + }, + { + "slug": "discordbot", + "name": "discordbot_delete_guild_role", + "description": "Delete a guild role. Requires MANAGE_ROLES permission. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_delete_guild_scheduled_event", + "description": "Delete a guild scheduled event. Requires MANAGE_EVENTS permission. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_delete_guild_soundboard_sound", + "description": "Delete the given guild soundboard sound. For sounds created by the current user, requires either the CREATE_GUILD_EXPRESSIONS or MANAGE_GUILD_EXPRESSIONS permission. For other sounds, requires the MANAGE_GUILD_EXPRESSIONS permission. Fires a Guild Soundboard Sound Delete Gateway…" + }, + { + "slug": "discordbot", + "name": "discordbot_delete_guild_sticker", + "description": "Delete a guild sticker. Requires MANAGE_GUILD_EXPRESSIONS permission. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_delete_guild_template", + "description": "Delete a guild template. Requires the MANAGE_GUILD permission. Returns the deleted guild template object on success." + }, + { + "slug": "discordbot", + "name": "discordbot_delete_lobby", + "description": "Delete a Discord lobby if it exists. Safe to call even if the lobby is already deleted. Returns nothing." + }, + { + "slug": "discordbot", + "name": "discordbot_delete_message", + "description": "Permanently delete a message from a Discord channel. This action is irreversible. Requires MANAGE_MESSAGES permission for messages sent by others." + }, + { + "slug": "discordbot", + "name": "discordbot_delete_original_interaction_response", + "description": "Delete the initial response to an interaction. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_delete_own_reaction", + "description": "Remove the current user's own reaction from a Discord message. The emoji parameter should be URL-encoded." + }, + { + "slug": "discordbot", + "name": "discordbot_delete_stage_instance", + "description": "Delete the Stage instance for a Stage channel, ending the live Stage. Requires the user to be a moderator of the Stage channel (MANAGE_CHANNELS, MUTE_MEMBERS, and MOVE_MEMBERS permissions). Fires a Stage Instance Delete Gateway event. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_delete_test_entitlement", + "description": "Delete a currently-active test entitlement. Discord will act as though that user or guild no longer has entitlement to your premium offering. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_delete_user_reaction", + "description": "Delete a reaction made by a specific user on a message. Requires MANAGE_MESSAGES permission. Use URL-encoded emoji format (e.g., %F0%9F%94%A5 for fire emoji, or name:id for custom emoji)." + }, + { + "slug": "discordbot", + "name": "discordbot_delete_webhook", + "description": "Permanently delete a Discord webhook. Requires MANAGE_WEBHOOKS permission. This action is irreversible." + }, + { + "slug": "discordbot", + "name": "discordbot_delete_webhook_message", + "description": "Delete a previously sent webhook message. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_delete_webhook_with_token", + "description": "Delete a webhook using its token instead of OAuth authentication. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_edit_channel_permissions", + "description": "Edit the channel permission overwrites for a user or role in a channel. Only usable for guild channels. Requires MANAGE_ROLES permission. Returns 204 No Content on success. Full permission flag reference (name=decimal value, OR multiple together): CREATE_INSTANT_INVITE=1, KICK_M…" + }, + { + "slug": "discordbot", + "name": "discordbot_edit_current_application", + "description": "Edit properties of the app associated with the requesting bot user. Only properties that are passed are updated. Returns the updated application object on success." + }, + { + "slug": "discordbot", + "name": "discordbot_edit_global_application_command", + "description": "Edit a global application command. Returns the updated command object." + }, + { + "slug": "discordbot", + "name": "discordbot_edit_guild_application_command", + "description": "Edit a guild application command. Returns the updated command object." + }, + { + "slug": "discordbot", + "name": "discordbot_edit_message", + "description": "Edit a previously sent message in a Discord channel. Only the author of the message can edit it. Supports updating content, embeds, flags, allowed mentions, components, and attachments." + }, + { + "slug": "discordbot", + "name": "discordbot_edit_original_interaction_response", + "description": "Edit the initial response to an interaction. Returns the updated message object." + }, + { + "slug": "discordbot", + "name": "discordbot_edit_webhook_message", + "description": "Edit a previously sent webhook message. Returns the updated message object." + }, + { + "slug": "discordbot", + "name": "discordbot_end_poll", + "description": "Immediately end an active poll in a Discord message. You cannot end polls created by other users." + }, + { + "slug": "discordbot", + "name": "discordbot_execute_github_compatible_webhook", + "description": "Send a GitHub webhook event payload to a Discord webhook, for use as the Payload URL when configuring a GitHub repository webhook. Supports the commit_comment, create, delete, fork, issue_comment, issues, member, public, pull_request, pull_request_review, pull_request_review_com…" + }, + { + "slug": "discordbot", + "name": "discordbot_execute_slack_compatible_webhook", + "description": "Send a message to a Discord webhook using a Slack-compatible payload format, so tools that only speak Slack's incoming webhook format can post into Discord. Discord does not support Slack's channel, icon_emoji, mrkdwn, or mrkdwn_in properties." + }, + { + "slug": "discordbot", + "name": "discordbot_execute_webhook", + "description": "Send a message via a Discord webhook. Supports custom username, avatar, embeds, and components. File attachments (multipart/form-data) are not supported by this tool. Use the wait query parameter to receive the created message object in the response." + }, + { + "slug": "discordbot", + "name": "discordbot_follow_announcement_channel", + "description": "Follow an announcement channel to send messages to a target channel. Requires MANAGE_WEBHOOKS permission in the target channel. Returns a followed channel object." + }, + { + "slug": "discordbot", + "name": "discordbot_get_answer_voters", + "description": "Retrieve a list of users who voted for a specific answer in a Discord poll." + }, + { + "slug": "discordbot", + "name": "discordbot_get_application_activity_instance", + "description": "Retrieve a serialized activity instance for an application, if it exists. Useful for preventing unwanted activity sessions." + }, + { + "slug": "discordbot", + "name": "discordbot_get_application_emoji", + "description": "Retrieve a specific emoji owned by a Discord application by its emoji ID." + }, + { + "slug": "discordbot", + "name": "discordbot_get_application_role_connection_metadata", + "description": "Fetch the list of application role connection metadata records configured for an application. Returns an array of application role connection metadata objects, each describing a comparison type, dictionary key, name, and description used to verify a user's role connection." + }, + { + "slug": "discordbot", + "name": "discordbot_get_auto_moderation_rule", + "description": "Get a single Auto Moderation rule for a guild by its ID. Requires the MANAGE_GUILD permission. Returns an auto moderation rule object." + }, + { + "slug": "discordbot", + "name": "discordbot_get_channel", + "description": "Retrieve a Discord channel by its ID. Returns channel information including type, name, topic, permissions, and other metadata." + }, + { + "slug": "discordbot", + "name": "discordbot_get_channel_invites", + "description": "Retrieve a list of invites for a Discord channel. Requires MANAGE_CHANNELS permission. Returns invite objects with metadata." + }, + { + "slug": "discordbot", + "name": "discordbot_get_channel_message", + "description": "Retrieve a specific message from a Discord channel by its message ID." + }, + { + "slug": "discordbot", + "name": "discordbot_get_channel_webhooks", + "description": "Retrieve all webhooks for a Discord channel. Requires MANAGE_WEBHOOKS permission." + }, + { + "slug": "discordbot", + "name": "discordbot_get_current_application", + "description": "Retrieve the full application object associated with the requesting bot user, including installation settings, integration type configuration, and webhook event configuration." + }, + { + "slug": "discordbot", + "name": "discordbot_get_current_bot_application", + "description": "Retrieve the bot's own application object, including its public Client ID, name, icon, and description. Per Discord's official OpenAPI spec, this endpoint is Bot Token only." + }, + { + "slug": "discordbot", + "name": "discordbot_get_current_user_voice_state", + "description": "Retrieve the current user's (the bot's) voice state in a guild, including the connected voice channel, mute and deafen status, and stage speaking request timestamp." + }, + { + "slug": "discordbot", + "name": "discordbot_get_entitlement", + "description": "Retrieve a single entitlement for an application by ID. Use to check whether a specific entitlement is active, its type, and its expiration window." + }, + { + "slug": "discordbot", + "name": "discordbot_get_global_application_command", + "description": "Fetch a specific global application command. Returns the application command object." + }, + { + "slug": "discordbot", + "name": "discordbot_get_global_application_commands", + "description": "Fetch all global commands for an application. Returns an array of application command objects." + }, + { + "slug": "discordbot", + "name": "discordbot_get_guild", + "description": "Retrieve a Discord guild (server) by its ID. Optionally include approximate member and presence counts." + }, + { + "slug": "discordbot", + "name": "discordbot_get_guild_application_command", + "description": "Fetch a specific application command registered in a guild. Returns the application command object." + }, + { + "slug": "discordbot", + "name": "discordbot_get_guild_application_command_permissions", + "description": "Fetch permissions for all commands in a guild. Returns an array of guild application command permissions objects." + }, + { + "slug": "discordbot", + "name": "discordbot_get_guild_application_commands", + "description": "Fetch all application commands registered in a specific guild. Returns an array of application command objects." + }, + { + "slug": "discordbot", + "name": "discordbot_get_guild_audit_log", + "description": "Retrieve the audit log for a Discord guild. Returns a list of audit log entries with details about administrative actions. Requires VIEW_AUDIT_LOG permission." + }, + { + "slug": "discordbot", + "name": "discordbot_get_guild_ban", + "description": "Retrieve the ban record for a specific user in a Discord guild. Requires BAN_MEMBERS permission." + }, + { + "slug": "discordbot", + "name": "discordbot_get_guild_bans", + "description": "Retrieve a list of ban objects for users banned from a Discord guild. Requires BAN_MEMBERS permission. Supports pagination via before and after." + }, + { + "slug": "discordbot", + "name": "discordbot_get_guild_emoji", + "description": "Retrieve a specific custom emoji from a Discord guild by its emoji ID." + }, + { + "slug": "discordbot", + "name": "discordbot_get_guild_integrations", + "description": "Retrieve a list of integration objects for a Discord guild. Requires MANAGE_GUILD permission. Returns a maximum of 50 integrations." + }, + { + "slug": "discordbot", + "name": "discordbot_get_guild_invites", + "description": "Retrieve a list of all active invites for a Discord guild. Requires MANAGE_GUILD permission. Returns invite objects with metadata." + }, + { + "slug": "discordbot", + "name": "discordbot_get_guild_member", + "description": "Retrieve a specific member of a Discord guild by their user ID. Returns the guild member object including roles, nickname, and join date." + }, + { + "slug": "discordbot", + "name": "discordbot_get_guild_onboarding", + "description": "Get the onboarding configuration for a guild. Returns the guild onboarding object." + }, + { + "slug": "discordbot", + "name": "discordbot_get_guild_preview", + "description": "Retrieve a preview of a Discord guild. For public guilds this is accessible without being a member. Returns guild name, description, icon, emojis, stickers, and approximate counts." + }, + { + "slug": "discordbot", + "name": "discordbot_get_guild_prune_count", + "description": "Get the number of members that would be removed by a prune operation. Requires KICK_MEMBERS permission." + }, + { + "slug": "discordbot", + "name": "discordbot_get_guild_role", + "description": "Retrieve a specific role object from a Discord guild by its role ID." + }, + { + "slug": "discordbot", + "name": "discordbot_get_guild_role_member_counts", + "description": "Retrieve a map of role IDs to the number of guild members with that role. Does not include the @everyone role." + }, + { + "slug": "discordbot", + "name": "discordbot_get_guild_scheduled_event", + "description": "Retrieve a specific scheduled event in a Discord guild by its event ID." + }, + { + "slug": "discordbot", + "name": "discordbot_get_guild_scheduled_event_users", + "description": "Get a list of users subscribed to a guild scheduled event. Returns a list of guild scheduled event user objects." + }, + { + "slug": "discordbot", + "name": "discordbot_get_guild_soundboard_sound", + "description": "Retrieve a soundboard sound object for the given sound id in a guild. Includes the user field if the bot has the CREATE_GUILD_EXPRESSIONS or MANAGE_GUILD_EXPRESSIONS permission." + }, + { + "slug": "discordbot", + "name": "discordbot_get_guild_sticker", + "description": "Retrieve a specific custom sticker from a Discord guild by its sticker ID." + }, + { + "slug": "discordbot", + "name": "discordbot_get_guild_vanity_url", + "description": "Get the vanity URL for a guild. Requires MANAGE_GUILD permission. The guild must have the VANITY_URL feature enabled. Returns a partial invite object with code and uses." + }, + { + "slug": "discordbot", + "name": "discordbot_get_guild_voice_regions", + "description": "Get a list of voice regions available for a guild. Returns optimal regions that can be used when updating a guild or voice channel's region." + }, + { + "slug": "discordbot", + "name": "discordbot_get_guild_webhooks", + "description": "Retrieve all webhooks for a Discord guild. Requires MANAGE_WEBHOOKS permission." + }, + { + "slug": "discordbot", + "name": "discordbot_get_guild_welcome_screen", + "description": "Retrieve the welcome screen for a Discord guild. The welcome screen is shown to new members when they join." + }, + { + "slug": "discordbot", + "name": "discordbot_get_guild_widget_settings", + "description": "Get the widget settings for a guild. Requires MANAGE_GUILD permission. Returns the guild widget settings object." + }, + { + "slug": "discordbot", + "name": "discordbot_get_invite_target_users", + "description": "Get the users allowed to see and accept an invite. Response is a CSV file with the header user_id and each user ID from the file originally passed to invite create, one per line. Requires the caller to be the inviter, or have MANAGE_GUILD permission, or have VIEW_AUDIT_LOG permi…" + }, + { + "slug": "discordbot", + "name": "discordbot_get_invite_target_users_job_status", + "description": "Check the status of the asynchronous job that processes target users from a CSV when creating or updating an invite. Requires the caller to be the inviter, or have MANAGE_GUILD permission, or have VIEW_AUDIT_LOG permission. Status values: 0=UNSPECIFIED, 1=PROCESSING, 2=COMPLETED…" + }, + { + "slug": "discordbot", + "name": "discordbot_get_lobby", + "description": "Retrieve a Discord lobby object for the specified lobby id, if it exists." + }, + { + "slug": "discordbot", + "name": "discordbot_get_lobby_messages", + "description": "Retrieve the most recent messages in a Discord lobby. The calling user must be a member of the lobby. Returns an array of lobby message objects." + }, + { + "slug": "discordbot", + "name": "discordbot_get_original_interaction_response", + "description": "Get the initial response to an interaction. Returns the message object." + }, + { + "slug": "discordbot", + "name": "discordbot_get_pinned_messages", + "description": "Retrieve pinned messages in a Discord channel using Discord's current paginated pins endpoint (introduced June 2025, replacing the deprecated /channels/{channel.id}/pins). Returns pinned messages ordered most-recently-pinned first." + }, + { + "slug": "discordbot", + "name": "discordbot_get_reactions", + "description": "Retrieve a list of users who reacted to a Discord message with a specific emoji." + }, + { + "slug": "discordbot", + "name": "discordbot_get_sku_subscription", + "description": "Retrieve a single subscription for a SKU by its ID. Returns a subscription object with its status, current billing period, and the entitlements it grants." + }, + { + "slug": "discordbot", + "name": "discordbot_get_stage_instance", + "description": "Retrieve the Stage instance associated with a Stage channel, if one exists (the channel is currently live)." + }, + { + "slug": "discordbot", + "name": "discordbot_get_sticker", + "description": "Retrieve a Discord sticker by its ID. Returns sticker information including name, description, format type, and pack details." + }, + { + "slug": "discordbot", + "name": "discordbot_get_sticker_pack", + "description": "Retrieve a Discord standard sticker pack by its ID. Returns the sticker pack including its name, description, contained stickers, cover sticker, and banner asset." + }, + { + "slug": "discordbot", + "name": "discordbot_get_thread_member", + "description": "Get a member of a thread. Returns a thread member object." + }, + { + "slug": "discordbot", + "name": "discordbot_get_user", + "description": "Retrieve information about any Discord user by ID. Pass '@me' as user_id to fetch the bot's own user profile. Returns username, avatar, discriminator, locale, and premium status." + }, + { + "slug": "discordbot", + "name": "discordbot_get_user_voice_state", + "description": "Retrieve the specified user's voice state in a guild, including the connected voice channel, mute and deafen status, and stage speaking request timestamp. If the user is connected to a voice channel, the bot must have permission to connect to that channel." + }, + { + "slug": "discordbot", + "name": "discordbot_get_webhook", + "description": "Retrieve a Discord webhook by its ID. Returns the webhook object including name, channel, guild, and token." + }, + { + "slug": "discordbot", + "name": "discordbot_get_webhook_message", + "description": "Get a previously sent webhook message. Returns the message object." + }, + { + "slug": "discordbot", + "name": "discordbot_get_webhook_with_token", + "description": "Retrieve a Discord webhook using both its ID and token. Does not require bot authentication. Returns the webhook object without the user field." + }, + { + "slug": "discordbot", + "name": "discordbot_group_dm_add_recipient", + "description": "Add a recipient to a Group DM using their OAuth2 access token, which must have been granted the gdm.join scope. Returns 201 if the user was added, or 204 if already a recipient." + }, + { + "slug": "discordbot", + "name": "discordbot_group_dm_remove_recipient", + "description": "Remove a recipient from a Group DM. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_join_thread", + "description": "Add the current user to a thread. Requires the thread to not be archived. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_kick_guild_member", + "description": "Remove (kick) a member from a Discord guild. The user can rejoin via a new invite. Requires KICK_MEMBERS permission." + }, + { + "slug": "discordbot", + "name": "discordbot_leave_guild", + "description": "Remove the bot from a guild it belongs to. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_leave_lobby", + "description": "Remove the calling user from the specified Discord lobby. Safe to call even if the user is no longer a member, but fails if the lobby does not exist. Returns nothing." + }, + { + "slug": "discordbot", + "name": "discordbot_leave_thread", + "description": "Remove the current user from a thread. Requires the thread to not be archived. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_link_channel_to_lobby", + "description": "Link an existing guild text channel to a Discord lobby, or unlink any currently linked channel by omitting channel_id. The caller must be a lobby member with the CanLinkLobby lobby member flag. Returns the updated lobby object." + }, + { + "slug": "discordbot", + "name": "discordbot_list_active_guild_threads", + "description": "List all active threads in a guild, including public and private threads. Returns a list of channel objects and thread member objects for the current user." + }, + { + "slug": "discordbot", + "name": "discordbot_list_application_emojis", + "description": "Retrieve all emojis owned by a Discord application (app emojis). Returns an object containing a list of emoji objects under the items key." + }, + { + "slug": "discordbot", + "name": "discordbot_list_auto_moderation_rules", + "description": "Get a list of all Auto Moderation rules currently configured for a guild. Requires the MANAGE_GUILD permission. Returns a list of auto moderation rule objects." + }, + { + "slug": "discordbot", + "name": "discordbot_list_channel_messages", + "description": "Retrieve a list of messages from a Discord channel. Supports pagination using around, before, and after message IDs with a configurable limit." + }, + { + "slug": "discordbot", + "name": "discordbot_list_default_soundboard_sounds", + "description": "Retrieve an array of default soundboard sound objects that can be used by all users." + }, + { + "slug": "discordbot", + "name": "discordbot_list_guild_channels", + "description": "Retrieve all channels in a Discord guild (server). Returns a list of channel objects including text channels, voice channels, categories, and threads." + }, + { + "slug": "discordbot", + "name": "discordbot_list_guild_emojis", + "description": "Retrieve all custom emojis for a Discord guild. Returns a list of emoji objects." + }, + { + "slug": "discordbot", + "name": "discordbot_list_guild_members", + "description": "Retrieve a list of members in a Discord guild. Requires the GUILD_MEMBERS privileged intent or appropriate bot permissions. Supports pagination via the after parameter." + }, + { + "slug": "discordbot", + "name": "discordbot_list_guild_roles", + "description": "Retrieve all roles in a Discord guild. Returns a list of role objects including permissions, color, and position." + }, + { + "slug": "discordbot", + "name": "discordbot_list_guild_scheduled_events", + "description": "Retrieve a list of scheduled events for a Discord guild. Optionally include user subscription counts." + }, + { + "slug": "discordbot", + "name": "discordbot_list_guild_soundboard_sounds", + "description": "Retrieve the guild's soundboard sounds. Includes user fields if the bot has the CREATE_GUILD_EXPRESSIONS or MANAGE_GUILD_EXPRESSIONS permission. Returns an object with an items array of soundboard sound objects." + }, + { + "slug": "discordbot", + "name": "discordbot_list_guild_stickers", + "description": "Retrieve all custom stickers for a Discord guild. Returns a list of sticker objects." + }, + { + "slug": "discordbot", + "name": "discordbot_list_guild_templates", + "description": "Retrieve all guild templates for a guild. Requires the MANAGE_GUILD permission. Returns a list of guild template objects." + }, + { + "slug": "discordbot", + "name": "discordbot_list_joined_private_archived_threads", + "description": "List private archived threads in a channel that the current user has joined. Returns threads in descending order of archive timestamp." + }, + { + "slug": "discordbot", + "name": "discordbot_list_private_archived_threads", + "description": "List all private archived threads in a channel. Requires MANAGE_THREADS permission and READ_MESSAGE_HISTORY permission. Returns threads in descending order of archive timestamp." + }, + { + "slug": "discordbot", + "name": "discordbot_list_public_archived_threads", + "description": "List all public archived threads in a channel. Returns threads in descending order of archive timestamp. Requires READ_MESSAGE_HISTORY permission." + }, + { + "slug": "discordbot", + "name": "discordbot_list_sku_subscriptions", + "description": "Retrieve all subscriptions containing a given SKU, filtered by user. Returns a list of subscription objects representing recurring payments for that SKU. With Bot Token auth, user_id is required since the bot has no implicit 'current user' context. Supports cursor-based paginati…" + }, + { + "slug": "discordbot", + "name": "discordbot_list_skus", + "description": "Retrieve all SKUs (stock-keeping units) for a given Discord application. SKUs represent premium offerings, such as subscriptions, that can be made available to the application's users or guilds. Returns an array of SKU objects." + }, + { + "slug": "discordbot", + "name": "discordbot_list_thread_members", + "description": "List all members of a thread. Returns an array of thread member objects. When with_member is true, results are paginated using after and limit." + }, + { + "slug": "discordbot", + "name": "discordbot_list_threads", + "description": "Retrieve archived public threads in a Discord channel. Returns threads in descending order by archive timestamp. Requires READ_MESSAGE_HISTORY permission. Note: Discord has no single endpoint that lists every thread type at once — this tool calls the same public-archived-threads…" + }, + { + "slug": "discordbot", + "name": "discordbot_list_voice_regions", + "description": "Retrieve a list of all available voice regions on Discord. Returns region IDs, names, and whether they are optimal or deprecated." + }, + { + "slug": "discordbot", + "name": "discordbot_modify_application_emoji", + "description": "Modify the name of an emoji owned by a Discord application. Returns the updated emoji object." + }, + { + "slug": "discordbot", + "name": "discordbot_modify_auto_moderation_rule", + "description": "Modify an existing Auto Moderation rule for a guild. Requires the MANAGE_GUILD permission. All parameters are optional. Fires an Auto Moderation Rule Update Gateway event. Returns the updated auto moderation rule object on success." + }, + { + "slug": "discordbot", + "name": "discordbot_modify_channel", + "description": "Modify a channel's settings. Supports text, voice, announcement, stage, and forum channels. Returns the updated channel object. Each permission_overwrites entry may specify 'allow_names'/'deny_names' (arrays of named permission flags) instead of raw 'allow'/'deny' integers — the…" + }, + { + "slug": "discordbot", + "name": "discordbot_modify_current_member", + "description": "Modify the current user's guild member attributes. Returns the updated guild member object." + }, + { + "slug": "discordbot", + "name": "discordbot_modify_current_user", + "description": "Modify the bot's own username, avatar, or banner. Returns the updated user object." + }, + { + "slug": "discordbot", + "name": "discordbot_modify_current_user_nick", + "description": "Deprecated in favor of Modify Current Member. Modifies the nickname of the current user in a guild. Requires CHANGE_NICKNAME permission. Returns a 200 with the nickname on success." + }, + { + "slug": "discordbot", + "name": "discordbot_modify_current_user_voice_state", + "description": "Update the current user's (the bot's) voice state in a stage channel. Returns 204 No Content on success. channel_id must currently point to a stage channel the bot has already joined. MUTE_MEMBERS permission is required to unsuppress; REQUEST_TO_SPEAK permission is required to r…" + }, + { + "slug": "discordbot", + "name": "discordbot_modify_guild", + "description": "Modify a guild's settings. Requires MANAGE_GUILD permission. Returns the updated guild object." + }, + { + "slug": "discordbot", + "name": "discordbot_modify_guild_channel_positions", + "description": "Modify the positions of channels in a guild. Requires MANAGE_CHANNELS permission. Only channels to be modified need to be included. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_modify_guild_emoji", + "description": "Modify a guild emoji. Requires MANAGE_GUILD_EXPRESSIONS permission. Returns the updated emoji object." + }, + { + "slug": "discordbot", + "name": "discordbot_modify_guild_incident_actions", + "description": "Modify the incident actions of a guild, used to temporarily disable invites or direct messages during a raid or spam incident. Requires MANAGE_GUILD permission. Both fields can be enabled for a maximum of 24 hours in the future; supplying null disables the action. Returns the up…" + }, + { + "slug": "discordbot", + "name": "discordbot_modify_guild_member", + "description": "Modify attributes of a guild member. Returns the updated guild member object." + }, + { + "slug": "discordbot", + "name": "discordbot_modify_guild_onboarding", + "description": "Modify the onboarding configuration of a guild. Requires MANAGE_GUILD and MANAGE_ROLES permissions. Onboarding enforces constraints when enabled: at least 7 default channels, at least 5 of which allow sending messages to @everyone. Returns the updated guild onboarding object." + }, + { + "slug": "discordbot", + "name": "discordbot_modify_guild_role", + "description": "Modify a guild role's settings. Requires MANAGE_ROLES permission. Returns the updated role object. Full permission flag reference (name=decimal value, OR multiple together): CREATE_INSTANT_INVITE=1, KICK_MEMBERS=2, BAN_MEMBERS=4, ADMINISTRATOR=8, MANAGE_CHANNELS=16, MANAGE_GUILD…" + }, + { + "slug": "discordbot", + "name": "discordbot_modify_guild_role_positions", + "description": "Modify the positions of roles in a guild. Requires MANAGE_ROLES permission. Returns a list of all guild role objects." + }, + { + "slug": "discordbot", + "name": "discordbot_modify_guild_scheduled_event", + "description": "Modify a guild scheduled event. Requires MANAGE_EVENTS permission. To start or end an event, modify the status field. Returns the modified scheduled event object." + }, + { + "slug": "discordbot", + "name": "discordbot_modify_guild_soundboard_sound", + "description": "Modify the given guild soundboard sound. For sounds created by the current user, requires either the CREATE_GUILD_EXPRESSIONS or MANAGE_GUILD_EXPRESSIONS permission. For other sounds, requires the MANAGE_GUILD_EXPRESSIONS permission. All parameters are optional. Fires a Guild So…" + }, + { + "slug": "discordbot", + "name": "discordbot_modify_guild_sticker", + "description": "Modify a guild sticker's details. Requires MANAGE_GUILD_EXPRESSIONS permission. Returns the updated sticker object." + }, + { + "slug": "discordbot", + "name": "discordbot_modify_guild_template", + "description": "Modify a guild template's metadata. Requires the MANAGE_GUILD permission. Returns the guild template object on success." + }, + { + "slug": "discordbot", + "name": "discordbot_modify_guild_welcome_screen", + "description": "Modify the welcome screen of a Community guild. Requires MANAGE_GUILD permission. Returns the updated welcome screen object." + }, + { + "slug": "discordbot", + "name": "discordbot_modify_guild_widget", + "description": "Modify the widget settings for a guild. Requires MANAGE_GUILD permission. Returns the updated guild widget settings object." + }, + { + "slug": "discordbot", + "name": "discordbot_modify_lobby", + "description": "Modify a Discord lobby with new values, if provided. When members is provided, it replaces the full member list — any current member not included is removed from the lobby. Returns the updated lobby object." + }, + { + "slug": "discordbot", + "name": "discordbot_modify_stage_instance", + "description": "Update fields of an existing Stage instance. Requires the user to be a moderator of the Stage channel (MANAGE_CHANNELS, MUTE_MEMBERS, and MOVE_MEMBERS permissions). Fires a Stage Instance Update Gateway event. Returns the updated Stage instance object." + }, + { + "slug": "discordbot", + "name": "discordbot_modify_user_voice_state", + "description": "Update another user's voice state in a stage channel. Returns 204 No Content on success. channel_id must currently point to a stage channel the user has already joined. Requires the MUTE_MEMBERS permission. When unsuppressed, non-bot users have their request_to_speak_timestamp s…" + }, + { + "slug": "discordbot", + "name": "discordbot_modify_webhook", + "description": "Modify a webhook. Requires MANAGE_WEBHOOKS permission. Returns the updated webhook object." + }, + { + "slug": "discordbot", + "name": "discordbot_modify_webhook_with_token", + "description": "Modify a webhook using its token instead of OAuth authentication. Does not support channel_id field. Returns the updated webhook object (without token)." + }, + { + "slug": "discordbot", + "name": "discordbot_pin_message", + "description": "Pin a message in a Discord channel using Discord's current pins endpoint (introduced June 2025, replacing the deprecated /channels/{channel.id}/pins/{message.id}). Requires PIN_MESSAGES permission. A channel can have up to 50 pinned messages." + }, + { + "slug": "discordbot", + "name": "discordbot_remove_guild_ban", + "description": "Remove a ban for a user in a Discord guild, allowing them to rejoin. Requires BAN_MEMBERS permission." + }, + { + "slug": "discordbot", + "name": "discordbot_remove_guild_member_role", + "description": "Remove a role from a guild member. Requires MANAGE_ROLES permission. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_remove_lobby_member", + "description": "Remove the specified user from a Discord lobby. Safe to call even if the user is no longer a member of the lobby, but fails if the lobby does not exist. Returns nothing." + }, + { + "slug": "discordbot", + "name": "discordbot_remove_thread_member", + "description": "Remove a user from a thread. Requires MANAGE_THREADS permission or that the current user is the creator of the thread. Returns 204 No Content on success." + }, + { + "slug": "discordbot", + "name": "discordbot_search_guild_members", + "description": "Search for guild members in a Discord guild whose username or nickname starts with the given query string." + }, + { + "slug": "discordbot", + "name": "discordbot_search_guild_messages", + "description": "Search for messages matching a query across a Discord guild. Returns matching messages without the reactions key. Requires the READ_MESSAGE_HISTORY permission and access is restricted according to whether the MESSAGE_CONTENT privileged intent is enabled for the application. If t…" + }, + { + "slug": "discordbot", + "name": "discordbot_send_lobby_message", + "description": "Send a message to a Discord lobby. The calling user must be a member of the lobby. If the lobby has a linked channel, the message is also forwarded there; if forwarding fails (for example due to AutoMod), the lobby message is still delivered to other lobby members. Returns the c…" + }, + { + "slug": "discordbot", + "name": "discordbot_send_soundboard_sound", + "description": "Send a soundboard sound to a voice channel the user is connected to. Requires the SPEAK and USE_SOUNDBOARD permissions, and also USE_EXTERNAL_SOUNDS if the sound is from a different guild. The user must be connected to the voice channel with a voice state that has deaf, self_dea…" + }, + { + "slug": "discordbot", + "name": "discordbot_set_voice_channel_status", + "description": "Set a voice channel's status. Requires the SET_VOICE_CHANNEL_STATUS permission, and additionally the MANAGE_CHANNELS permission if the current user is not connected to the voice channel. Returns 204 No Content on success. Fires a Voice Channel Status Update Gateway event." + }, + { + "slug": "discordbot", + "name": "discordbot_start_thread_from_message", + "description": "Create a new thread from an existing message in a channel. The thread is a public thread by default. Requires CREATE_PUBLIC_THREADS permission. Returns the new thread channel object." + }, + { + "slug": "discordbot", + "name": "discordbot_start_thread_in_forum_channel", + "description": "Create a new post (thread) in a forum or media channel, along with its first message. At least one of content, embeds, or sticker_ids must be provided for the message. The current user must have the SEND_MESSAGES permission. Returns the new thread channel object with a nested me…" + }, + { + "slug": "discordbot", + "name": "discordbot_start_thread_without_message", + "description": "Create a new thread that is not attached to an existing message. Type 10=ANNOUNCEMENT_THREAD (in announcement channel), 11=PUBLIC_THREAD, 12=PRIVATE_THREAD. Returns the new thread channel object." + }, + { + "slug": "discordbot", + "name": "discordbot_sync_guild_template", + "description": "Sync a template to the guild's current state. Requires the MANAGE_GUILD permission. Returns the guild template object on success." + }, + { + "slug": "discordbot", + "name": "discordbot_trigger_typing", + "description": "Post a typing indicator to a Discord channel. The typing indicator lasts for 10 seconds or until a message is sent. Useful for indicating that a bot is processing a request." + }, + { + "slug": "discordbot", + "name": "discordbot_unpin_message", + "description": "Unpin a previously pinned message from a Discord channel using Discord's current pins endpoint (introduced June 2025, replacing the deprecated /channels/{channel.id}/pins/{message.id}). Requires PIN_MESSAGES permission." + }, + { + "slug": "discordbot", + "name": "discordbot_update_application_role_connection_metadata", + "description": "Update and return the list of application role connection metadata records for an application. Takes a full list of metadata objects to replace the existing ones; any records not included are removed. An application can have a maximum of 5 metadata records." + }, + { + "slug": "discordbot", + "name": "discordbot_update_lobby_message_moderation_metadata", + "description": "Set the moderation metadata for a lobby message. The metadata is app-scoped and delivered to active game clients via the Social SDK as a realtime message update. Uses a Bot token for authorization. Returns HTTP 204 No Content on success." + }, { "slug": "docsautomatormcp", "name": "docsautomatormcp_cancel_esign_session", @@ -38941,6 +40631,341 @@ "name": "mixmaxmcp_sequences", "description": "Query and inspect Mixmax email sequences. Supports actions: list_sequences, get_sequence, get_sequence_insights, find_contact_in_sequences, get_daily_send_count, validate_sequence." }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_activity_stream", + "description": "Get the raw event stream (activity feed) for one or more specific users over a date range — every event each user did, in order. Useful for inspecting an individual user's journey rather than aggregate analytics. Rate limited to 60 queries/hour and 5 concurrent queries." + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_cohorts_list", + "description": "List every saved cohort in a Mixpanel project, including each cohort's numeric id, name, member count, description, and creation date. Use the id with 'mixpanelanalytics_profiles_query' (filter_by_cohort) to fetch the profiles in a cohort." + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_event_properties", + "description": "Get a time series broken down by the values of a single event property, e.g. purchase count per day segmented by product_category. Similar to segmentation, but focused on exploring one property's values rather than an arbitrary 'on' expression." + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_event_top_properties", + "description": "List the property names most commonly sent with a given event, along with how many times each appears. Useful for discovering what properties are available before writing a segmentation query or property-values lookup." + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_event_top_property_values", + "description": "List the most common values seen for a given event property, e.g. the top product_category values sent with the 'purchase' event. Useful for discovering what filter/segment values are available before writing a query." + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_events_query", + "description": "Get aggregate counts for one or more events over time, without any property segmentation. Faster and simpler than 'mixpanelanalytics_segmentation_query' when you just need raw counts for a set of events, e.g. daily counts of 'login' and 'signup' side by side." + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_events_top_names", + "description": "List the most common event names tracked in the project over its lifetime, ranked by the given analysis type. Useful for discovering what events exist before writing a segmentation or funnel query." + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_events_top_today", + "description": "Get the top events for today, ranked by count, along with their percent change compared to the same time yesterday. Useful for a quick 'what's happening right now' snapshot." + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_funnels_list_saved", + "description": "List all saved funnels in a Mixpanel project, returning each funnel's numeric funnel_id and name. Use the funnel_id with 'mixpanelanalytics_funnels_query' to fetch its conversion data." + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_funnels_query", + "description": "Get conversion data for an existing saved funnel by its funnel_id, showing per-step counts and conversion ratios over time. Use 'mixpanelanalytics_funnels_list_saved' to find a funnel_id. Note: Mixpanel considers this endpoint in maintenance mode and recommends building the funn…" + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_insights_query", + "description": "Get the computed data for an existing saved Insights report by its bookmark_id. This is Mixpanel's recommended, actively maintained way to pull report data (in place of the older segmentation/funnels/retention query endpoints), but it can only run a report that already exists in…" + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_jql_query", + "description": "Run a custom JQL (JavaScript Query Language) script against raw Mixpanel event/profile data for analysis that the standard segmentation/funnel/retention/insights endpoints can't express, e.g. custom aggregations, joins across events and profiles, or arbitrary groupBy/reduce pipe…" + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_profiles_query", + "description": "Query Mixpanel user (or group) profiles and return a paginated list of profiles matching the given filters. Supports filtering by a specific list of distinct_ids, a free-form 'where' expression, or a saved cohort. Rate limited to 60 queries/hour and 5 concurrent queries." + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_retention_frequency_query", + "description": "Measure how frequently users return to do an event within a period, broken into fine-grained buckets (e.g. how many of the hours in each day a user was active). Useful for engagement/'stickiness' analysis." + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_retention_query", + "description": "Measure how many users who did a 'born' event came back to do a later event, bucketed into cohorts. Supports 'birth' retention (users grouped by when they first did the born event) or 'compounded' retention (users grouped by every time they did the born event)." + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_schema_delete", + "description": "Permanently delete the Lexicon schema for a single event or profile property, identified by entity type and name. This removes only the Lexicon schema definition; the underlying event or profile property is not deleted and will show as un-schematized until a new schema is upload…" + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_schema_get", + "description": "Retrieve the Lexicon schema for a single event or profile property, identified by entity type and name. Returns the schema's description, JSON-schema-style property definitions, and Lexicon metadata such as display name, tags, and owners. Returns an error if no schema exists for…" + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_schema_upload", + "description": "Create or replace the Lexicon schema for a single event or profile property, identified by entity type and name. Any existing schema for this entity type and name is fully overwritten with the fields you provide. Use 'description' for a human-readable summary of the entity, 'pro…" + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_schemas_delete_all", + "description": "Permanently delete every schema in the project's Lexicon data dictionary, for both event and profile-property entity types. This removes only the Lexicon schema definitions (descriptions, JSON-schema property definitions, and metadata); the underlying events and profile properti…" + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_schemas_delete_by_entity", + "description": "Permanently delete every Lexicon schema for one entity type ('event' or 'profile') in a Mixpanel project, leaving schemas for the other entity type untouched. Pass 'entity_name' to narrow this to a single schema by name instead of deleting all schemas for the entity type. This r…" + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_schemas_list", + "description": "List all schemas (data dictionary entries) defined in a Mixpanel project's Lexicon, across both event and profile-property entity types. Each schema includes the entity's description, JSON-schema-style property definitions, and Lexicon metadata such as display name, tags, and ow…" + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_schemas_list_by_entity", + "description": "List the Lexicon schemas for one entity type ('event' or 'profile') in a Mixpanel project. Optionally pass 'entity_name' to filter the results down to a single schema by name. Only entities that already have an associated schema are returned. Use 'mixpanelanalytics_schemas_list'…" + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_schemas_upload_batch", + "description": "Create or replace multiple Lexicon schemas in a single call. Each object in 'entries' defines one event or profile property's schema (entity type, name, and JSON-schema definition) and is merged into the project's existing data dictionary. Set 'truncate' to true to first remove …" + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_segmentation_average_query", + "description": "Get the average value of a numeric property expression per unit time for a single event, e.g. average order value per day. Note: in maintenance mode per Mixpanel — prefer 'mixpanelanalytics_insights_query' for new use cases where possible." + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_segmentation_numeric_query", + "description": "Get event counts for a single event, bucketed by the numeric value of a property expression (e.g. distribution of purchase amounts). Note: in maintenance mode per Mixpanel — prefer 'mixpanelanalytics_insights_query' for new use cases where possible." + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_segmentation_query", + "description": "Get event counts for a single event over time, optionally segmented and filtered by properties. Note: Mixpanel's Query API team considers this endpoint in maintenance mode and recommends 'mixpanelanalytics_insights_query' (against a saved Insights report) for new use cases, but …" + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_segmentation_sum_query", + "description": "Get the sum of a numeric property expression per unit time for a single event, e.g. total revenue per day. Note: in maintenance mode per Mixpanel — prefer 'mixpanelanalytics_insights_query' for new use cases where possible." + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_warehouse_import_create_event_stream", + "description": "Create a new warehouse import that streams warehouse rows into Mixpanel as events. Maps a warehouse table to Mixpanel's Events dataset using 'table_params' to select the source table/columns and 'time_column_name' (plus 'event_name' or 'event_column_name') to derive each event's…" + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_warehouse_import_create_groups", + "description": "Create a new warehouse import that syncs warehouse rows into Mixpanel as group profile updates, analogous to 'mixpanelanalytics_warehouse_import_create_people' but for group analytics (e.g. company/account-level profiles) instead of individual users. Maps a warehouse table using…" + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_warehouse_import_create_lookup_table", + "description": "Create a new warehouse import that syncs a warehouse table into Mixpanel as a Lookup Table, joining additional properties onto events or user profiles by a shared key (similar in effect to 'mixpanelingestion_lookup_table_replace', but kept continuously in sync from the warehouse…" + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_warehouse_import_create_people", + "description": "Create a new warehouse import that syncs warehouse rows into Mixpanel as user profile updates (equivalent to Engage '$set'). Maps a warehouse table to Mixpanel user profiles using 'table_params' to select the source table/columns and 'user_column_name' to identify which column h…" + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_warehouse_import_delete", + "description": "Delete a warehouse import's sync configuration, stopping future syncs. By default this only removes the connector configuration — data already imported into Mixpanel is kept. Set 'delete_data' to true to also permanently delete the data previously imported by this connector. Use…" + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_warehouse_import_get", + "description": "Get the full configuration and current status of a single warehouse import by id, including its sync schedule ('run_every'), pause state, and warehouse-specific parameters. Use 'mixpanelanalytics_warehouse_imports_list' first to find the import_id." + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_warehouse_import_history", + "description": "Get the history of past sync runs for a warehouse import, e.g. to check when it last ran, whether recent runs succeeded, and how long each run took. Use 'mixpanelanalytics_warehouse_imports_list' to find the import_id first." + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_warehouse_import_run_sync", + "description": "Manually trigger an immediate sync run for a warehouse import, outside its configured schedule ('run_every'). Use this to pull the latest warehouse data on demand instead of waiting for the next scheduled run, e.g. after fixing an upstream data issue. Use 'mixpanelanalytics_ware…" + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_warehouse_import_update", + "description": "Pause, resume, or reschedule an existing warehouse import. Use this to stop a sync temporarily ('paused': true), resume it ('paused': false), change how often it runs ('run_every'), or update Databricks-specific cluster settings. Use 'mixpanelanalytics_warehouse_imports_list' or…" + }, + { + "slug": "mixpanelanalytics", + "name": "mixpanelanalytics_warehouse_imports_list", + "description": "List all warehouse import connectors configured for a Mixpanel project, across every warehouse source (Snowflake, BigQuery, Databricks, Redshift). Each entry includes its import id, import type (event stream, people, groups, or lookup table), warehouse source, and current sync s…" + }, + { + "slug": "mixpanelcompliance", + "name": "mixpanelcompliance_gdpr_deletion_cancel", + "description": "Cancel a pending GDPR/CCPA data deletion request before Mixpanel begins permanently erasing the data. Returns no content on success. Cancellation can fail once the deletion has already progressed too far to stop — check 'mixpanelcompliance_gdpr_deletion_status' first if you're u…" + }, + { + "slug": "mixpanelcompliance", + "name": "mixpanelcompliance_gdpr_deletion_create", + "description": "Permanently delete ALL data Mixpanel holds for the given distinct_ids — every event and profile property, across all time. This is irreversible once processing completes, and per Mixpanel's GDPR/CCPA documentation it can take up to 30 days to fully propagate through Mixpanel's s…" + }, + { + "slug": "mixpanelcompliance", + "name": "mixpanelcompliance_gdpr_deletion_status", + "description": "Check the status of a GDPR/CCPA data deletion request previously created with 'mixpanelcompliance_gdpr_deletion_create'. The response's status field is one of: PENDING, STAGING, STARTED, SUCCESS, FAILURE, REVOKED, NOT_FOUND, or UNKNOWN. Deletions can take up to 30 days to reach …" + }, + { + "slug": "mixpanelcompliance", + "name": "mixpanelcompliance_gdpr_retrieval_create", + "description": "Create a GDPR or CCPA Subject Access Request (SAR) for one or more Mixpanel distinct_ids. Mixpanel asynchronously compiles an export of every event and profile property it holds for the given distinct_ids so you can fulfill a data subject's access request. This call only queues …" + }, + { + "slug": "mixpanelcompliance", + "name": "mixpanelcompliance_gdpr_retrieval_status", + "description": "Check the status of a GDPR/CCPA data retrieval (Subject Access Request) previously created with 'mixpanelcompliance_gdpr_retrieval_create'. The response's status field is one of: PENDING, STAGING, STARTED, SUCCESS, FAILURE, REVOKED, NOT_FOUND, or UNKNOWN. Poll this until the sta…" + }, + { + "slug": "mixpanelingestion", + "name": "mixpanelingestion_feature_flags_definitions", + "description": "Get the full definitions of every feature flag/experiment configured in a Mixpanel project, including each flag's variants, rollout rules, and linked experiment. Provide either 'project_token' or 'project_id' to authenticate (project_id uses your Service Account credentials)." + }, + { + "slug": "mixpanelingestion", + "name": "mixpanelingestion_feature_flags_evaluate", + "description": "Evaluate all enabled Mixpanel feature flags and experiments for a given user, returning the variant each flag assigns them. Provide either 'project_token' or 'project_id' to authenticate (project_id uses your Service Account credentials)." + }, + { + "slug": "mixpanelingestion", + "name": "mixpanelingestion_group_batch_update", + "description": "Send a batch of mixed group-profile updates to Mixpanel in a single call, analogous to 'mixpanelingestion_profile_batch_update' for user profiles. Each item in 'updates' is a fully-formed update object with its own \"$token\", \"$group_key\", \"$group_id\", and one operation key ($set…" + }, + { + "slug": "mixpanelingestion", + "name": "mixpanelingestion_group_delete", + "description": "Permanently delete a Mixpanel group profile and all of its properties, analogous to 'mixpanelingestion_profile_delete' for user profiles. This does not delete historical events associated with the group." + }, + { + "slug": "mixpanelingestion", + "name": "mixpanelingestion_group_remove", + "description": "Remove a specific value from a list-valued property on a Mixpanel group profile, analogous to 'mixpanelingestion_profile_remove' for user profiles. If the value is not present, no change is made." + }, + { + "slug": "mixpanelingestion", + "name": "mixpanelingestion_group_set", + "description": "Set (overwrite) properties on a Mixpanel group profile (e.g. a company or team account), analogous to 'mixpanelingestion_profile_set' for user profiles. Creates the group profile if it does not already exist. Requires Group Analytics to be enabled on your Mixpanel project." + }, + { + "slug": "mixpanelingestion", + "name": "mixpanelingestion_group_set_once", + "description": "Set properties on a Mixpanel group profile only if they are not already set — existing values are never overwritten, analogous to 'mixpanelingestion_profile_set_once' for user profiles. Creates the group profile if it does not already exist." + }, + { + "slug": "mixpanelingestion", + "name": "mixpanelingestion_group_union", + "description": "Add values to a list-valued property on a Mixpanel group profile, ensuring each value only appears once, analogous to 'mixpanelingestion_profile_union' for user profiles. Creates the group profile if it does not already exist." + }, + { + "slug": "mixpanelingestion", + "name": "mixpanelingestion_group_unset", + "description": "Permanently remove one or more named properties (and their values) from a Mixpanel group profile, analogous to 'mixpanelingestion_profile_unset' for user profiles." + }, + { + "slug": "mixpanelingestion", + "name": "mixpanelingestion_identity_create", + "description": "Link an anonymous distinct_id to a known, identified distinct_id by sending a Mixpanel $identify event via /track. Use this the first time you learn a user's real identifier (e.g. after login or signup) so that pre-login and post-login activity is merged onto one profile. Return…" + }, + { + "slug": "mixpanelingestion", + "name": "mixpanelingestion_identity_create_alias", + "description": "Create a legacy alias linking a new distinct_id to an existing one by sending a Mixpanel $create_alias event via /track. This is the legacy identity-linking mechanism; for new integrations prefer 'mixpanelingestion_identity_create' ($identify) or 'mixpanelingestion_identity_merg…" + }, + { + "slug": "mixpanelingestion", + "name": "mixpanelingestion_identity_merge", + "description": "Merge two distinct_ids into a single identity using Mixpanel's modern Identity Merge API (a $merge event sent through /import, authenticated with your Service Account). All historical events and profile data from both distinct_ids are combined under one identity. Use this instea…" + }, + { + "slug": "mixpanelingestion", + "name": "mixpanelingestion_import_events", + "description": "Import a batch of up to 2000 events into Mixpanel via the modern, Service Account-authenticated /import endpoint. This is Mixpanel's recommended way to send events from a trusted server-side integration (unlike the classic /track endpoint). Each event needs an 'event' name and a…" + }, + { + "slug": "mixpanelingestion", + "name": "mixpanelingestion_lookup_table_replace", + "description": "Replace the entire contents of a Mixpanel Lookup Table with new CSV data. This overwrites all existing rows in the table — use 'mixpanelingestion_lookup_tables_list' first to find the table's id. The first column of the CSV must be the table's key (matching the property it enric…" + }, + { + "slug": "mixpanelingestion", + "name": "mixpanelingestion_lookup_tables_list", + "description": "List the Lookup Tables defined in a Mixpanel project. Returns each table's id and name. Use the id with 'mixpanelingestion_lookup_table_replace' to update a table's contents, or find it in Lexicon under the lookup table's details." + }, + { + "slug": "mixpanelingestion", + "name": "mixpanelingestion_profile_append", + "description": "Append a value to a list-valued property on a Mixpanel user profile via Engage $append. If the property does not yet exist, it is created as a single-element list. Unlike $union, duplicate values are allowed. Useful for ordered logs like \"Recent Searches\"." + }, + { + "slug": "mixpanelingestion", + "name": "mixpanelingestion_profile_batch_update", + "description": "Send a batch of mixed user-profile updates to Mixpanel Engage in a single call. Each item in 'updates' is a fully-formed update object with its own \"$token\", \"$distinct_id\", and one operation key ($set, $set_once, $add, $union, $append, $remove, $unset, or $delete) — the same sh…" + }, + { + "slug": "mixpanelingestion", + "name": "mixpanelingestion_profile_delete", + "description": "Permanently delete a Mixpanel user profile and all of its properties via Engage $delete. This does not delete the user's historical events, only their profile. If duplicate profiles exist due to identity merging, set 'ignore_alias' to true so you don't accidentally delete the or…" + }, + { + "slug": "mixpanelingestion", + "name": "mixpanelingestion_profile_increment", + "description": "Increment (or decrement, using a negative value) numeric properties on a Mixpanel user profile via Engage $add. The given amounts are added to the existing values; if a property is not yet present it is treated as 0. Useful for counters such as \"Number of Logins\" or \"Files Uploa…" + }, + { + "slug": "mixpanelingestion", + "name": "mixpanelingestion_profile_remove", + "description": "Remove a specific value from a list-valued property on a Mixpanel user profile via Engage $remove. If the value is not present, no change is made. The opposite of 'mixpanelingestion_profile_append'." + }, + { + "slug": "mixpanelingestion", + "name": "mixpanelingestion_profile_set", + "description": "Set (overwrite) properties on a Mixpanel user profile via Engage $set. Creates the profile if it does not already exist. Use this for properties that should always reflect the latest value, such as \"Plan\" or \"Last Login\". For properties that should only be set the first time, us…" + }, + { + "slug": "mixpanelingestion", + "name": "mixpanelingestion_profile_set_once", + "description": "Set properties on a Mixpanel user profile via Engage $set_once, but only if they are not already set — existing values are never overwritten. Creates the profile if it does not already exist. Useful for properties like \"First Login Date\" that should be recorded once and never ch…" + }, + { + "slug": "mixpanelingestion", + "name": "mixpanelingestion_profile_union", + "description": "Add values to a list-valued property on a Mixpanel user profile via Engage $union, ensuring each value only appears once in the resulting list. Creates the profile if it does not already exist. Useful for properties like \"Purchased Categories\" that accumulate unique values over …" + }, + { + "slug": "mixpanelingestion", + "name": "mixpanelingestion_profile_unset", + "description": "Permanently remove one or more named properties (and their values) from a Mixpanel user profile via Engage $unset. This deletes the properties themselves, not the profile — use 'mixpanelingestion_profile_delete' to delete the whole profile." + }, + { + "slug": "mixpanelingestion", + "name": "mixpanelingestion_track_event", + "description": "Send a single event to Mixpanel via the classic /track endpoint, authenticated with your Mixpanel Project Token (not your Service Account). Use this for lightweight, fire-and-forget event tracking. For reliable server-side ingestion with validation and duplicate protection, pref…" + }, { "slug": "mobbinmcp", "name": "mobbinmcp_search_flows", @@ -50174,6 +52199,536 @@ "name": "storeleadsmcp_search_technologies", "description": "Search technologies used by e-commerce stores. Filter by install count." }, + { + "slug": "stripe", + "name": "stripe_accept_quote_dahlia", + "description": "Accept a finalized Quote. Converts it into a subscription or invoice." + }, + { + "slug": "stripe", + "name": "stripe_attach_payment_method_dahlia", + "description": "Attach a PaymentMethod to a Customer." + }, + { + "slug": "stripe", + "name": "stripe_cancel_payment_intent_dahlia", + "description": "Cancels a PaymentIntent object when it's in a cancellable state. Depending on the payment method, it may be possible to cancel a PaymentIntent once it has been confirmed and is in requires_capture state." + }, + { + "slug": "stripe", + "name": "stripe_cancel_payout_dahlia", + "description": "Cancel a payout that has not yet been paid out. Only cancels payouts with status 'pending'." + }, + { + "slug": "stripe", + "name": "stripe_cancel_quote_dahlia", + "description": "Cancel a Quote that has been finalized but not yet accepted." + }, + { + "slug": "stripe", + "name": "stripe_cancel_setup_intent_dahlia", + "description": "Cancel a SetupIntent that has not been confirmed." + }, + { + "slug": "stripe", + "name": "stripe_cancel_subscription_dahlia", + "description": "Cancels a customer's subscription immediately. The customer will not be charged again for the subscription. By default the subscription is canceled immediately but if prorate is set, any remaining charges are refunded." + }, + { + "slug": "stripe", + "name": "stripe_close_dispute_dahlia", + "description": "Close a dispute and accept the chargeback. This cannot be undone." + }, + { + "slug": "stripe", + "name": "stripe_confirm_payment_intent_dahlia", + "description": "Confirm that your customer intends to pay with current or provided payment method. Upon confirmation, the PaymentIntent will attempt to initiate a payment. If the payment method requires action (3DS, redirect), the PaymentIntent will move to requires_action." + }, + { + "slug": "stripe", + "name": "stripe_confirm_setup_intent_dahlia", + "description": "Confirm a SetupIntent and attempt to collect a payment method for future use." + }, + { + "slug": "stripe", + "name": "stripe_create_checkout_session_dahlia", + "description": "Create a Checkout Session to accept one-time or subscription payments via Stripe-hosted page." + }, + { + "slug": "stripe", + "name": "stripe_create_coupon_dahlia", + "description": "Create a coupon that can be redeemed for a discount on subscriptions or one-time charges." + }, + { + "slug": "stripe", + "name": "stripe_create_customer_dahlia", + "description": "Creates a new customer object. Use this to store a customer's payment and billing details. The customer object allows you to perform recurring charges and track multiple charges associated with the same customer." + }, + { + "slug": "stripe", + "name": "stripe_create_customer_portal_session_dahlia", + "description": "Creates a session of the customer portal. A portal session describes the instantiation of the customer portal for a particular customer. By visiting the session's URL, the customer can manage their subscriptions and billing details. Portal sessions are short-lived and will expir…" + }, + { + "slug": "stripe", + "name": "stripe_create_invoice_dahlia", + "description": "This endpoint creates a draft invoice for a given customer. The draft invoice created pulls in all pending invoice items on that customer, including prorations. The invoice remains a draft until you finalize the invoice, which allows you to pay, send, and delete the invoice." + }, + { + "slug": "stripe", + "name": "stripe_create_invoice_item_dahlia", + "description": "Create an invoice item to be added to a pending invoice." + }, + { + "slug": "stripe", + "name": "stripe_create_payment_intent_dahlia", + "description": "Creates a PaymentIntent object. After the PaymentIntent is created, attach a payment method and confirm to continue the payment. You can also create and confirm a PaymentIntent in a single step by using the confirm parameter." + }, + { + "slug": "stripe", + "name": "stripe_create_payment_method_dahlia", + "description": "Create a PaymentMethod object. Attach it to a Customer to enable reusable payment." + }, + { + "slug": "stripe", + "name": "stripe_create_payout_dahlia", + "description": "Create a payout to send funds to a bank account or debit card." + }, + { + "slug": "stripe", + "name": "stripe_create_plan_dahlia", + "description": "Create a Plan (legacy billing API). Consider using Prices instead for new integrations." + }, + { + "slug": "stripe", + "name": "stripe_create_price_dahlia", + "description": "Creates a new price for an existing product. Prices define how much and how often to charge for products. This includes one-time prices and recurring prices for subscriptions." + }, + { + "slug": "stripe", + "name": "stripe_create_product_dahlia", + "description": "Creates a new product object. Products describe the specific goods or services you offer to your customers. Products are used in conjunction with Prices to configure how much and how often you charge customers." + }, + { + "slug": "stripe", + "name": "stripe_create_promotion_code_dahlia", + "description": "Create a promotion code for a coupon that customers can redeem." + }, + { + "slug": "stripe", + "name": "stripe_create_quote_dahlia", + "description": "Create a Quote for a subscription or one-time payment, which can be sent to customers for approval." + }, + { + "slug": "stripe", + "name": "stripe_create_refund_dahlia", + "description": "Create a refund for a charge or payment intent. Refunds a charge that has previously been created, with optional partial amount." + }, + { + "slug": "stripe", + "name": "stripe_create_setup_intent_dahlia", + "description": "Create a SetupIntent to collect payment method details for future off-session payments." + }, + { + "slug": "stripe", + "name": "stripe_create_subscription_dahlia", + "description": "Creates a new subscription on an existing customer. Each customer can have multiple active subscriptions if needed." + }, + { + "slug": "stripe", + "name": "stripe_create_subscription_item_dahlia", + "description": "Add a new item to an existing subscription." + }, + { + "slug": "stripe", + "name": "stripe_create_tax_rate_dahlia", + "description": "Create a tax rate that can be applied to invoices and subscriptions." + }, + { + "slug": "stripe", + "name": "stripe_create_transfer_dahlia", + "description": "Create a transfer to send funds to a connected Stripe account (Connect platforms)." + }, + { + "slug": "stripe", + "name": "stripe_create_webhook_endpoint_dahlia", + "description": "Create a webhook endpoint to receive Stripe event notifications at your HTTPS URL. Supports subscribing to any number of event types (or use * to receive all events)." + }, + { + "slug": "stripe", + "name": "stripe_delete_coupon_dahlia", + "description": "Delete a coupon. Customers that have already applied this coupon are not affected." + }, + { + "slug": "stripe", + "name": "stripe_delete_customer_dahlia", + "description": "Permanently deletes a customer. It cannot be undone. Also immediately cancels any active subscriptions on the customer." + }, + { + "slug": "stripe", + "name": "stripe_delete_invoice_item_dahlia", + "description": "Delete an invoice item. Can only delete items that have not been finalized in an invoice." + }, + { + "slug": "stripe", + "name": "stripe_delete_plan_dahlia", + "description": "Delete a Plan. Customers subscribed to this plan are not affected." + }, + { + "slug": "stripe", + "name": "stripe_delete_subscription_item_dahlia", + "description": "Delete a subscription item, removing it from the subscription." + }, + { + "slug": "stripe", + "name": "stripe_delete_webhook_endpoint_dahlia", + "description": "Delete a webhook endpoint. Once deleted, the endpoint will no longer receive events from Stripe." + }, + { + "slug": "stripe", + "name": "stripe_detach_payment_method_dahlia", + "description": "Detach a PaymentMethod from a Customer, making it reusable for other customers." + }, + { + "slug": "stripe", + "name": "stripe_expire_checkout_session_dahlia", + "description": "Expire a Checkout Session before it has been completed. Can only expire sessions in 'open' status." + }, + { + "slug": "stripe", + "name": "stripe_finalize_invoice_dahlia", + "description": "Stripe automatically finalizes drafts before sending them. However, if you'd like to finalize a draft invoice manually, you can do so using this method. After an invoice is finalized, it can be paid or sent to customers." + }, + { + "slug": "stripe", + "name": "stripe_finalize_quote_dahlia", + "description": "Finalize a Quote to make it ready to be accepted by the customer." + }, + { + "slug": "stripe", + "name": "stripe_get_account_dahlia", + "description": "Retrieve the details of the current Stripe account." + }, + { + "slug": "stripe", + "name": "stripe_get_balance_dahlia", + "description": "Retrieve the current balance of the Stripe account, showing available and pending amounts by currency." + }, + { + "slug": "stripe", + "name": "stripe_get_balance_transaction_dahlia", + "description": "Retrieve a balance transaction by ID. Balance transactions represent funds moving through the Stripe account." + }, + { + "slug": "stripe", + "name": "stripe_get_charge_dahlia", + "description": "Retrieves the details of a charge that has previously been created. Supply the unique charge ID that was returned from your previous request, and Stripe will return the corresponding charge information." + }, + { + "slug": "stripe", + "name": "stripe_get_checkout_session_dahlia", + "description": "Retrieve a Checkout Session by ID." + }, + { + "slug": "stripe", + "name": "stripe_get_coupon_dahlia", + "description": "Retrieve a coupon by its ID." + }, + { + "slug": "stripe", + "name": "stripe_get_customer_dahlia", + "description": "Retrieves the details of an existing customer. You need only supply the unique customer identifier that was returned upon customer creation." + }, + { + "slug": "stripe", + "name": "stripe_get_dispute_dahlia", + "description": "Retrieve a dispute by ID. A dispute occurs when a customer questions a charge with their card issuer." + }, + { + "slug": "stripe", + "name": "stripe_get_event_dahlia", + "description": "Retrieve an event by ID. Events are Stripe's way of notifying your application about changes." + }, + { + "slug": "stripe", + "name": "stripe_get_invoice_dahlia", + "description": "Retrieves the invoice with the given ID. Supply the unique invoice identifier that was returned from your previous request, and Stripe will return the corresponding invoice information." + }, + { + "slug": "stripe", + "name": "stripe_get_invoice_item_dahlia", + "description": "Retrieves the invoice item with the given ID. Supply the unique invoice item identifier and Stripe will return the corresponding invoice item information." + }, + { + "slug": "stripe", + "name": "stripe_get_payment_intent_dahlia", + "description": "Retrieves the details of a PaymentIntent that was previously created. Supply the unique PaymentIntent ID and Stripe will return the corresponding PaymentIntent information." + }, + { + "slug": "stripe", + "name": "stripe_get_payment_method_dahlia", + "description": "Retrieve a PaymentMethod object." + }, + { + "slug": "stripe", + "name": "stripe_get_payout_dahlia", + "description": "Retrieve a payout by ID." + }, + { "slug": "stripe", "name": "stripe_get_plan_dahlia", "description": "Retrieve a Plan by ID." }, + { + "slug": "stripe", + "name": "stripe_get_price_dahlia", + "description": "Retrieves the price with the given ID." + }, + { + "slug": "stripe", + "name": "stripe_get_product_dahlia", + "description": "Retrieves the details of an existing product. Supply the unique product ID from either a product creation request or the product list, and Stripe will return the corresponding product information." + }, + { + "slug": "stripe", + "name": "stripe_get_promotion_code_dahlia", + "description": "Retrieve a promotion code by ID." + }, + { "slug": "stripe", "name": "stripe_get_quote_dahlia", "description": "Retrieve a Quote by ID." }, + { + "slug": "stripe", + "name": "stripe_get_refund_dahlia", + "description": "Retrieve the details of an existing refund." + }, + { + "slug": "stripe", + "name": "stripe_get_setup_intent_dahlia", + "description": "Retrieve a SetupIntent by ID." + }, + { + "slug": "stripe", + "name": "stripe_get_subscription_dahlia", + "description": "Retrieves the subscription with the given ID. Supply the unique subscription identifier that was returned from your previous request, and Stripe will return the corresponding subscription information." + }, + { + "slug": "stripe", + "name": "stripe_get_subscription_item_dahlia", + "description": "Retrieves the subscription item with the given ID. Supply the unique subscription item identifier and Stripe will return the corresponding subscription item information." + }, + { + "slug": "stripe", + "name": "stripe_get_tax_rate_dahlia", + "description": "Retrieve a tax rate by ID." + }, + { + "slug": "stripe", + "name": "stripe_get_transfer_dahlia", + "description": "Retrieve a transfer by ID." + }, + { + "slug": "stripe", + "name": "stripe_get_webhook_endpoint_dahlia", + "description": "Retrieve a webhook endpoint by ID." + }, + { + "slug": "stripe", + "name": "stripe_list_accounts_dahlia", + "description": "List all connected accounts on your platform (Connect platforms only)." + }, + { + "slug": "stripe", + "name": "stripe_list_balance_transactions_dahlia", + "description": "List all balance transactions, optionally filtered by currency, source, or type." + }, + { + "slug": "stripe", + "name": "stripe_list_charges_dahlia", + "description": "Returns a list of charges you've previously created. The charges are returned in sorted order, with the most recent charges appearing first." + }, + { + "slug": "stripe", + "name": "stripe_list_checkout_sessions_dahlia", + "description": "List all Checkout Sessions." + }, + { "slug": "stripe", "name": "stripe_list_coupons_dahlia", "description": "List all coupons." }, + { + "slug": "stripe", + "name": "stripe_list_customer_payment_methods_dahlia", + "description": "List all PaymentMethods attached to a specific customer." + }, + { + "slug": "stripe", + "name": "stripe_list_customers_dahlia", + "description": "Returns a list of your customers. The customers are returned sorted by creation date, with the most recent customers appearing first. Supports filtering by email and pagination for large customer lists." + }, + { + "slug": "stripe", + "name": "stripe_list_disputes_dahlia", + "description": "List all disputes, optionally filtered by charge or payment intent." + }, + { + "slug": "stripe", + "name": "stripe_list_events_dahlia", + "description": "List all events. Events represent noteworthy activity on your Stripe account." + }, + { + "slug": "stripe", + "name": "stripe_list_invoice_items_dahlia", + "description": "Returns a list of your invoice items. Invoice items are returned sorted by creation date, with the most recent invoice items appearing first." + }, + { + "slug": "stripe", + "name": "stripe_list_invoice_line_items_dahlia", + "description": "When retrieving an invoice, you'll get a lines property containing the total count of line items and the first handful of those items. There is also a URL where you can retrieve the full (paginated) list of line items." + }, + { + "slug": "stripe", + "name": "stripe_list_invoices_dahlia", + "description": "Returns a list of your invoices. The invoices are returned sorted by creation date, with the most recent invoices appearing first." + }, + { + "slug": "stripe", + "name": "stripe_list_payment_intents_dahlia", + "description": "Returns a list of PaymentIntents. The PaymentIntents are returned sorted by creation date, with the most recent PaymentIntents appearing first." + }, + { + "slug": "stripe", + "name": "stripe_list_payment_methods_dahlia", + "description": "List PaymentMethods for a customer." + }, + { + "slug": "stripe", + "name": "stripe_list_payouts_dahlia", + "description": "List all payouts, with optional filters by status and arrival date." + }, + { "slug": "stripe", "name": "stripe_list_plans_dahlia", "description": "List all Plans." }, + { + "slug": "stripe", + "name": "stripe_list_prices_dahlia", + "description": "Returns a list of your active prices, excluding inline prices. For the list of inactive prices, set active to false." + }, + { + "slug": "stripe", + "name": "stripe_list_products_dahlia", + "description": "Returns a list of your products. The products are returned sorted by creation date, with the most recent products appearing first." + }, + { + "slug": "stripe", + "name": "stripe_list_promotion_codes_dahlia", + "description": "List all promotion codes." + }, + { "slug": "stripe", "name": "stripe_list_quotes_dahlia", "description": "List all Quotes." }, + { + "slug": "stripe", + "name": "stripe_list_refunds_dahlia", + "description": "List all refunds, optionally filtered by charge or payment intent." + }, + { + "slug": "stripe", + "name": "stripe_list_setup_intents_dahlia", + "description": "List all SetupIntents." + }, + { + "slug": "stripe", + "name": "stripe_list_subscription_items_dahlia", + "description": "Returns a list of subscription items for a given subscription. Subscription items represent the component lines of a subscription." + }, + { + "slug": "stripe", + "name": "stripe_list_subscriptions_dahlia", + "description": "Returns a list of your subscriptions. The subscriptions are returned sorted by creation date, with the most recent subscriptions appearing first." + }, + { + "slug": "stripe", + "name": "stripe_list_tax_rates_dahlia", + "description": "List all tax rates." + }, + { + "slug": "stripe", + "name": "stripe_list_transfers_dahlia", + "description": "List all transfers to connected accounts." + }, + { + "slug": "stripe", + "name": "stripe_list_webhook_endpoints_dahlia", + "description": "List all webhook endpoints." + }, + { + "slug": "stripe", + "name": "stripe_pay_invoice_dahlia", + "description": "Stripe automatically creates and then attempts to collect payment on invoices for customers on subscriptions according to your subscriptions settings. However, if you'd like to attempt payment on an invoice out of the normal collection schedule or for some other reason, you use …" + }, + { + "slug": "stripe", + "name": "stripe_update_coupon_dahlia", + "description": "Update a coupon's name or metadata." + }, + { + "slug": "stripe", + "name": "stripe_update_customer_dahlia", + "description": "Updates the specified customer by setting the values of the parameters passed. Any parameters not provided will be left unchanged." + }, + { + "slug": "stripe", + "name": "stripe_update_dispute_dahlia", + "description": "Update a dispute to submit evidence to the card issuer and potentially win the chargeback." + }, + { + "slug": "stripe", + "name": "stripe_update_invoice_item_dahlia", + "description": "Update an invoice item's amount, description, or metadata." + }, + { + "slug": "stripe", + "name": "stripe_update_plan_dahlia", + "description": "Update a Plan's nickname, active status, or metadata." + }, + { + "slug": "stripe", + "name": "stripe_update_product_dahlia", + "description": "Updates the specific product by setting the values of the parameters passed. Any parameters not provided will be left unchanged." + }, + { + "slug": "stripe", + "name": "stripe_update_promotion_code_dahlia", + "description": "Update a promotion code's active status or metadata." + }, + { + "slug": "stripe", + "name": "stripe_update_quote_dahlia", + "description": "Update a draft Quote." + }, + { + "slug": "stripe", + "name": "stripe_update_refund_dahlia", + "description": "Update the metadata on a refund." + }, + { + "slug": "stripe", + "name": "stripe_update_subscription_dahlia", + "description": "Updates an existing subscription to match the specified parameters. When updating a subscription, any parameters not provided will be left unchanged." + }, + { + "slug": "stripe", + "name": "stripe_update_subscription_item_dahlia", + "description": "Update a subscription item, for example to change the price or quantity." + }, + { + "slug": "stripe", + "name": "stripe_update_tax_rate_dahlia", + "description": "Update a tax rate's display name, description, or active status." + }, + { + "slug": "stripe", + "name": "stripe_update_transfer_dahlia", + "description": "Update a transfer's metadata." + }, + { + "slug": "stripe", + "name": "stripe_update_webhook_endpoint_dahlia", + "description": "Update a webhook endpoint's URL, enabled events, or disabled status." + }, + { + "slug": "stripe", + "name": "stripe_void_invoice_dahlia", + "description": "Mark a finalized invoice as void. This cannot be undone. Voiding an invoice is similar to deletion, however it only applies to finalized invoices and maintains a papertrail where the invoice can still be found." + }, { "slug": "stripemcp", "name": "stripemcp_cancel_subscription",