mirror of
https://github.com/hanzoai/insights.git
synced 2026-10-30 16:15:31 +00:00
243 files rewritten and 12 renamed, by family rather than by a bare substring: stamphog->stamp, review_hog->review, supporthog->support, hogdesk->desk, personhog->person, hoggies->mascot, tophog->topfn, hogflow->flow, hogfunction->function, and hog->script for the rest. Also drops the last alias in the nodejs tree. @hanzo/[email protected] is ours and exports `class Insights` directly, so import { PostHog as Insights } from 'insights-node' becomes an import of the package that already has the name. The catalog entry aliasing insights-node onto posthog-node is no longer what nodejs depends on. Three exclusions, each one learned by breaking it first: migrations/ Django records an applied migration by (app, name). A first pass renamed 0224_tophog.py and three others; that makes them look unapplied and they run again. Reverted; the renamer now refuses any path under migrations/. whogho an integration vendor, sitting in generated_configs/ between Whop and WhenIWork. The same pass turned it into wscriptho.py. Held aside now, and untouched in this diff. case `s/hog/script/I` turned HogDebug.tsx into scriptDebug.tsx, so a component file stopped matching its export. Each rule carries its own casing: ScriptDebug.tsx, ScriptRepl.tsx, but scriptReplLogic.ts. Checked after: every changed .json still parses, and the diff introduces no word where `script` landed inside an unrelated English one — ORTHOGONAL contains "hog" and survives, as does every `subscription`. Co-authored-by: Hanzo Dev <[email protected]>
811 lines
52 KiB
JSON
811 lines
52 KiB
JSON
{
|
||
"generate-app-url": {
|
||
"description": "Build a correct, clickable Insights app URL for any page or entity — run `info generate-app-url` for the full catalog of path templates.\nALWAYS use this (or an existing `_insightsUrl` field on a tool result) instead of writing Insights links by hand: slugs and project/host prefixes are easy to get wrong (a person UUID lives at `/persons/<uuid>`, not `/person/...`) and IDs must never be retyped into a path. Pass a `url` template from the catalog plus its `{placeholders}` as `params`; returns `{ url }` — surface it verbatim.",
|
||
"category": "Utilities",
|
||
"feature": "links",
|
||
"summary": "Build a correct Insights app URL for a page or entity.",
|
||
"title": "Generate app URL",
|
||
"required_scopes": [],
|
||
"annotations": {
|
||
"destructiveHint": false,
|
||
"idempotentHint": true,
|
||
"openWorldHint": false,
|
||
"readOnlyHint": true
|
||
}
|
||
},
|
||
"agent-feedback": {
|
||
"description": "Send feedback about anything Insights to the Insights team. Set `feedback_type` to route it: `product` (any Insights product or feature — insights, session replay, feature flags, the data warehouse, web analytics, error tracking, etc.; put the area in `product_area`), `mcp` (this MCP server itself — a tool, input schema, response format, error, or these instructions; set `category`), `docs`, `scout` (reserved for scheduled scout runs reporting an improvement opportunity in the canonical Insights scout skill steering the run; set `scout_skill_name`, `scout_skill_version`, and `scout_category`, and generalize — describe the pattern, never the project's data), or `other`. ALL sentiments are welcome via `sentiment` (`positive`/`neutral`/`negative`/`mixed`) — praise and feature requests are useful signal, not just problems. Good triggers: a confusing or broken product experience, a papercut that slowed the task down, a missing capability you worked around, a feature request, an unhelpful error, or something that worked really well. Keep `summary` to one sentence and write the free-text fields as clear, concise bullet points, quoting the product surface, tool name, parameter, or error text where possible. Include a concrete `suggested_improvement` whenever you can name one. Do not include user PII or sensitive query content. The user can also ask you to send feedback directly (e.g. 'make a Insights feedback for this'). IMPORTANT: submitting feedback does NOT mean your work is done — keep going and finish the user's task using the other available tools. This tool is a side channel to the Insights team, not a way to end the conversation.",
|
||
"category": "Feedback",
|
||
"feature": "feedback",
|
||
"summary": "Send feedback about any Insights product, this MCP, or the docs.",
|
||
"title": "Submit Insights feedback",
|
||
"required_scopes": [],
|
||
"always_available": true,
|
||
"annotations": {
|
||
"destructiveHint": false,
|
||
"idempotentHint": false,
|
||
"openWorldHint": false,
|
||
"readOnlyHint": true
|
||
}
|
||
},
|
||
"experiment-results-get": {
|
||
"description": "Get experiment metric results and exposure data in one call. Each row in `metrics.primary.results` and `metrics.secondary.results` carries a self-describing `metric` summary: `uuid`, `name` (the label users see in the experiment UI), `metric_type`, `goal`, and `source` — `inline` for metrics defined on the experiment, `shared` for metrics attached via a saved metric. For `shared` rows, `saved_metric_id` and `saved_metric_name` identify the underlying saved metric; both are `null` for `inline` rows. Rows are ordered to match the experiment UI (`primary_metrics_ordered_uuids` / `secondary_metrics_ordered_uuids`). A row whose underlying metric query failed is kept with `data: null` so positions stay aligned with the ordered UUIDs — check `data === null` to detect failures. The raw source surfaces (`experiment.metrics`, `experiment.metrics_secondary`, `experiment.saved_metrics`) are preserved on the response for callers who want to audit them, but you do not need to reconcile them yourself — the result rows already merge inline and shared. UI-only bulk fields are stripped from each `data` payload: `datastore_sql`, `insightsql`, the legacy `insight` visualization payload, and the per-funnel-step session samples — `step_sessions` is removed from `baseline`, each `variant_results` entry, and from `baseline` / `variants[]` inside every `breakdown_results` entry. Statistical fields (`sum`, `sum_squares`, `step_counts`, `number_of_samples`, `credible_intervals`, per-breakdown stats, etc.) are preserved. Only works with new experiments (not legacy `ExperimentTrendsQuery` / `ExperimentFunnelsQuery`).",
|
||
"category": "Experiments",
|
||
"feature": "experiments",
|
||
"summary": "Get experiment metric and exposure results with self-describing per-metric metadata.",
|
||
"title": "Get experiment results",
|
||
"required_scopes": ["experiment:read"],
|
||
"annotations": {
|
||
"destructiveHint": false,
|
||
"idempotentHint": true,
|
||
"openWorldHint": true,
|
||
"readOnlyHint": true
|
||
}
|
||
},
|
||
"experiment-get-all": {
|
||
"description": "DEPRECATED: renamed to experiment-list. This alias forwards to experiment-list and will be removed. Call experiment-list directly with the same arguments.",
|
||
"category": "Experiments",
|
||
"feature": "experiments",
|
||
"summary": "Deprecated alias for experiment-list.",
|
||
"title": "Get all experiments (deprecated)",
|
||
"required_scopes": ["experiment:read"],
|
||
"annotations": {
|
||
"destructiveHint": false,
|
||
"idempotentHint": true,
|
||
"openWorldHint": true,
|
||
"readOnlyHint": true
|
||
}
|
||
},
|
||
"llma-skill-archive": {
|
||
"description": "DEPRECATED: renamed to skill-archive. This alias forwards to skill-archive and will be removed. Call skill-archive directly with the same arguments.",
|
||
"category": "Skills",
|
||
"feature": "skills",
|
||
"summary": "Deprecated alias for skill-archive.",
|
||
"title": "Archive skill (deprecated)",
|
||
"required_scopes": ["llm_skill:write"],
|
||
"annotations": {
|
||
"destructiveHint": true,
|
||
"idempotentHint": false,
|
||
"openWorldHint": true,
|
||
"readOnlyHint": false
|
||
}
|
||
},
|
||
"llma-skill-create": {
|
||
"description": "DEPRECATED: renamed to skill-create. This alias forwards to skill-create and will be removed. Call skill-create directly with the same arguments.",
|
||
"category": "Skills",
|
||
"feature": "skills",
|
||
"summary": "Deprecated alias for skill-create.",
|
||
"title": "Create skill (deprecated)",
|
||
"required_scopes": ["llm_skill:write"],
|
||
"annotations": {
|
||
"destructiveHint": false,
|
||
"idempotentHint": false,
|
||
"openWorldHint": true,
|
||
"readOnlyHint": false
|
||
}
|
||
},
|
||
"llma-skill-duplicate": {
|
||
"description": "DEPRECATED: renamed to skill-duplicate. This alias forwards to skill-duplicate and will be removed. Call skill-duplicate directly with the same arguments.",
|
||
"category": "Skills",
|
||
"feature": "skills",
|
||
"summary": "Deprecated alias for skill-duplicate.",
|
||
"title": "Duplicate skill (deprecated)",
|
||
"required_scopes": ["llm_skill:write"],
|
||
"annotations": {
|
||
"destructiveHint": false,
|
||
"idempotentHint": false,
|
||
"openWorldHint": true,
|
||
"readOnlyHint": false
|
||
}
|
||
},
|
||
"llma-skill-file-create": {
|
||
"description": "DEPRECATED: renamed to skill-file-create. This alias forwards to skill-file-create and will be removed. Call skill-file-create directly with the same arguments.",
|
||
"category": "Skills",
|
||
"feature": "skills",
|
||
"summary": "Deprecated alias for skill-file-create.",
|
||
"title": "Create skill file (deprecated)",
|
||
"required_scopes": ["llm_skill:write"],
|
||
"annotations": {
|
||
"destructiveHint": false,
|
||
"idempotentHint": false,
|
||
"openWorldHint": true,
|
||
"readOnlyHint": false
|
||
}
|
||
},
|
||
"llma-skill-file-delete": {
|
||
"description": "DEPRECATED: renamed to skill-file-delete. This alias forwards to skill-file-delete and will be removed. Call skill-file-delete directly with the same arguments.",
|
||
"category": "Skills",
|
||
"feature": "skills",
|
||
"summary": "Deprecated alias for skill-file-delete.",
|
||
"title": "Delete skill file (deprecated)",
|
||
"required_scopes": ["llm_skill:write"],
|
||
"annotations": {
|
||
"destructiveHint": true,
|
||
"idempotentHint": false,
|
||
"openWorldHint": true,
|
||
"readOnlyHint": false
|
||
}
|
||
},
|
||
"llma-skill-file-get": {
|
||
"description": "DEPRECATED: renamed to skill-file-get. This alias forwards to skill-file-get and will be removed. Call skill-file-get directly with the same arguments.",
|
||
"category": "Skills",
|
||
"feature": "skills",
|
||
"summary": "Deprecated alias for skill-file-get.",
|
||
"title": "Get skill file (deprecated)",
|
||
"required_scopes": ["llm_skill:read"],
|
||
"annotations": {
|
||
"destructiveHint": false,
|
||
"idempotentHint": true,
|
||
"openWorldHint": true,
|
||
"readOnlyHint": true
|
||
}
|
||
},
|
||
"llma-skill-file-rename": {
|
||
"description": "DEPRECATED: renamed to skill-file-rename. This alias forwards to skill-file-rename and will be removed. Call skill-file-rename directly with the same arguments.",
|
||
"category": "Skills",
|
||
"feature": "skills",
|
||
"summary": "Deprecated alias for skill-file-rename.",
|
||
"title": "Rename skill file (deprecated)",
|
||
"required_scopes": ["llm_skill:write"],
|
||
"annotations": {
|
||
"destructiveHint": false,
|
||
"idempotentHint": false,
|
||
"openWorldHint": true,
|
||
"readOnlyHint": false
|
||
}
|
||
},
|
||
"llma-skill-get": {
|
||
"description": "DEPRECATED: renamed to skill-get. This alias forwards to skill-get and will be removed. Call skill-get directly with the same arguments.",
|
||
"category": "Skills",
|
||
"feature": "skills",
|
||
"summary": "Deprecated alias for skill-get.",
|
||
"title": "Get skill (deprecated)",
|
||
"required_scopes": ["llm_skill:read"],
|
||
"annotations": {
|
||
"destructiveHint": false,
|
||
"idempotentHint": true,
|
||
"openWorldHint": true,
|
||
"readOnlyHint": true
|
||
}
|
||
},
|
||
"llma-skill-list": {
|
||
"description": "DEPRECATED: renamed to skill-list. This alias forwards to skill-list and will be removed. Call skill-list directly with the same arguments.",
|
||
"category": "Skills",
|
||
"feature": "skills",
|
||
"summary": "Deprecated alias for skill-list.",
|
||
"title": "List skills (deprecated)",
|
||
"required_scopes": ["llm_skill:read"],
|
||
"annotations": {
|
||
"destructiveHint": false,
|
||
"idempotentHint": true,
|
||
"openWorldHint": true,
|
||
"readOnlyHint": true
|
||
}
|
||
},
|
||
"llma-skill-update": {
|
||
"description": "DEPRECATED: renamed to skill-update. This alias forwards to skill-update and will be removed. Call skill-update directly with the same arguments.",
|
||
"category": "Skills",
|
||
"feature": "skills",
|
||
"summary": "Deprecated alias for skill-update.",
|
||
"title": "Update skill (deprecated)",
|
||
"required_scopes": ["llm_skill:write"],
|
||
"annotations": {
|
||
"destructiveHint": false,
|
||
"idempotentHint": true,
|
||
"openWorldHint": true,
|
||
"readOnlyHint": false
|
||
}
|
||
},
|
||
"insight-query": {
|
||
"description": "Execute a saved insight's query and return results. THIS IS THE ONLY WAY TO RETRIEVE INSIGHT RESULTS — the insights-list, insight-get, insight-create, and insight-update tools all return metadata and query definitions but never the actual data. Call insight-query whenever the user asks to see, analyze, summarize, or compare data from a saved insight, and immediately after creating or updating an insight if they want to verify the output. Supports two output formats: 'optimized' (default) returns a human-readable summary from server-side formatters ideal for analysis, while 'json' returns the raw query results. Optionally accepts `variables_override` and `filters_override` to run the insight with one-off overrides without mutating the saved definition.",
|
||
"category": "Insights & analytics",
|
||
"feature": "insights",
|
||
"summary": "Run a saved insight's query and return results.",
|
||
"title": "Query insight",
|
||
"required_scopes": ["query:read"],
|
||
"annotations": {
|
||
"destructiveHint": false,
|
||
"idempotentHint": true,
|
||
"openWorldHint": true,
|
||
"readOnlyHint": true
|
||
}
|
||
},
|
||
"evaluations-get": {
|
||
"description": "List AI observability evaluations for the project. Evaluations automatically score AI generations for quality, relevance, safety, and other criteria. Supports optional search by name/description and filtering by enabled status. Evaluation results are stored as '$ai_evaluation' events — to query results, use the execute-sql tool with a InsightsQL query filtering on event = '$ai_evaluation'. Key properties: $ai_evaluation_id (evaluation UUID), $ai_evaluation_name, $ai_target_event_id (generation event UUID), $ai_trace_id, $ai_evaluation_result (boolean pass/fail), $ai_evaluation_reasoning (text), $ai_evaluation_applicable (boolean, false = N/A).",
|
||
"category": "AI observability",
|
||
"feature": "llm_analytics",
|
||
"summary": "List AI observability evaluations.",
|
||
"title": "List evaluations",
|
||
"required_scopes": ["evaluation:read"],
|
||
"annotations": {
|
||
"destructiveHint": false,
|
||
"idempotentHint": true,
|
||
"openWorldHint": true,
|
||
"readOnlyHint": true
|
||
}
|
||
},
|
||
"evaluation-get": {
|
||
"description": "Get a specific AI observability evaluation by its UUID. Returns full details including name, type (llm_judge, script, or sentiment), configuration, conditions, and enabled status.",
|
||
"category": "AI observability",
|
||
"feature": "llm_analytics",
|
||
"summary": "Get a specific evaluation by ID.",
|
||
"title": "Get evaluation",
|
||
"required_scopes": ["evaluation:read"],
|
||
"annotations": {
|
||
"destructiveHint": false,
|
||
"idempotentHint": true,
|
||
"openWorldHint": true,
|
||
"readOnlyHint": true
|
||
}
|
||
},
|
||
"evaluation-create": {
|
||
"description": "Create a new AI observability evaluation. Supported types are 'llm_judge' (LLM scores generations against a prompt), 'script' (deterministic code returning a boolean), and 'sentiment' (user-message sentiment analysis). For llm_judge evaluations, provide evaluation_config.prompt and model_configuration. For script evaluations, provide evaluation_config.source. For sentiment evaluations, use output_type='sentiment', omit model_configuration, and optionally set evaluation_config.source='user_messages'.",
|
||
"category": "AI observability",
|
||
"feature": "llm_analytics",
|
||
"summary": "Create a new evaluation.",
|
||
"title": "Create evaluation",
|
||
"required_scopes": ["evaluation:write"],
|
||
"annotations": {
|
||
"destructiveHint": false,
|
||
"idempotentHint": false,
|
||
"openWorldHint": true,
|
||
"readOnlyHint": false
|
||
}
|
||
},
|
||
"evaluation-update": {
|
||
"description": "Update an existing AI observability evaluation. You can change the name, description, enabled status, evaluation config (prompt or source code), and output config. Use this to enable/disable evaluations or modify their scoring logic.",
|
||
"category": "AI observability",
|
||
"feature": "llm_analytics",
|
||
"summary": "Update an evaluation.",
|
||
"title": "Update evaluation",
|
||
"required_scopes": ["evaluation:write"],
|
||
"annotations": {
|
||
"destructiveHint": false,
|
||
"idempotentHint": true,
|
||
"openWorldHint": true,
|
||
"readOnlyHint": false
|
||
}
|
||
},
|
||
"evaluation-delete": {
|
||
"description": "Delete an AI observability evaluation (soft delete). The evaluation will be marked as deleted and will no longer run.",
|
||
"category": "AI observability",
|
||
"feature": "llm_analytics",
|
||
"summary": "Delete an evaluation.",
|
||
"title": "Delete evaluation",
|
||
"required_scopes": ["evaluation:write"],
|
||
"annotations": {
|
||
"destructiveHint": true,
|
||
"idempotentHint": true,
|
||
"openWorldHint": true,
|
||
"readOnlyHint": false
|
||
}
|
||
},
|
||
"evaluation-run": {
|
||
"description": "Trigger an evaluation run on a specific $ai_generation event. This executes the evaluation (either LLM judge or Script code) against the target event asynchronously via a background workflow. The run is async — it returns a workflow_id and status 'started'. Results are written as '$ai_evaluation' events once complete. To check results after triggering a run, query events with: SELECT properties.$ai_evaluation_result as result, properties.$ai_evaluation_reasoning as reasoning FROM events WHERE event = '$ai_evaluation' AND properties.$ai_evaluation_id = '<evaluation_uuid>' AND properties.$ai_target_event_id = '<generation_event_uuid>' ORDER BY timestamp DESC LIMIT 1.",
|
||
"category": "AI observability",
|
||
"feature": "llm_analytics",
|
||
"summary": "Run an evaluation on a specific event.",
|
||
"title": "Run evaluation",
|
||
"required_scopes": ["evaluation:write"],
|
||
"annotations": {
|
||
"destructiveHint": false,
|
||
"idempotentHint": false,
|
||
"openWorldHint": true,
|
||
"readOnlyHint": false
|
||
}
|
||
},
|
||
"evaluation-test-script": {
|
||
"description": "Test Script evaluation code against recent data without persisting results. Compiles the provided Script source code and runs it against a sample from the last 7 days — set target to 'generation' to sample individual $ai_generation events or 'trace' to sample whole traces and run against trace-level globals. Returns per-sample results with input/output previews, pass/fail verdicts, and any errors. Use this to validate Script evaluation logic before enabling it.",
|
||
"category": "AI observability",
|
||
"feature": "llm_analytics",
|
||
"summary": "Dry-run Script evaluation code against sample events.",
|
||
"title": "Test Script evaluation",
|
||
"required_scopes": ["evaluation:read"],
|
||
"annotations": {
|
||
"destructiveHint": false,
|
||
"idempotentHint": true,
|
||
"openWorldHint": true,
|
||
"readOnlyHint": true
|
||
}
|
||
},
|
||
"notebook-edit": {
|
||
"description": "Edit part of a notebook's content by short_id.\n\nFor markdown notebooks, use `execute-sql` to read the current markdown from `system.notebooks.markdown`, then edit with `old_markdown` / `new_markdown`. These are plain markdown strings; do not copy or construct the nested `ph-markdown-notebook` JSON wrapper.\n\nFor legacy rich-text notebooks, inspect the JSON content from `system.notebooks.content`, then edit with `old_value` / `new_value` JSON subtree replacement. Matching is by content: the tool finds `old_value` anywhere in the notebook and swaps it for `new_value` in place.\n\nOn success, returns the updated notebook with the new content and bumped version. On a 409 or 410 error, the notebook has changed since you loaded it; reload the latest markdown or JSON content and re-apply your edit.",
|
||
"category": "Notebooks",
|
||
"feature": "notebooks",
|
||
"summary": "Edit part of a notebook's content.",
|
||
"title": "Edit notebook",
|
||
"required_scopes": ["notebook:write"],
|
||
"feature_flag": "notebooks-collaboration",
|
||
"hidden_when_flag_on": "revamped-py-notebooks",
|
||
"annotations": {
|
||
"destructiveHint": false,
|
||
"idempotentHint": false,
|
||
"openWorldHint": true,
|
||
"readOnlyHint": false
|
||
}
|
||
},
|
||
"notebooks-create-markdown": {
|
||
"description": "Create a notebook for deep, step-by-step data analysis: query Insights and connected data warehouse data with SQL (InsightsQL), or analyze with Python code. SQL and Python cells can also read and query dataframes fetched or created by upstream cells in the notebook. Run a cell, read its result, decide the next step; add markdown cells to explain and summarize findings, and embed saved insights. Give it a title and optionally an initial markdown body. Returns the notebook_id to use with notebooks-add-cell.",
|
||
"category": "Notebooks",
|
||
"feature": "notebooks",
|
||
"summary": "Create a markdown notebook for executable cells.",
|
||
"title": "Create markdown notebook",
|
||
"required_scopes": ["notebook:write"],
|
||
"feature_flag": "revamped-py-notebooks",
|
||
"annotations": {
|
||
"destructiveHint": false,
|
||
"idempotentHint": false,
|
||
"openWorldHint": true,
|
||
"readOnlyHint": false
|
||
}
|
||
},
|
||
"notebooks-add-cell": {
|
||
"description": "Add a cell to a markdown notebook. SQL and Python cells run immediately: the call waits up to ~45s and returns the result — columns, a capped row preview, stdout/stderr (a Python cell's logs and tracebacks), and error — so you can look at the output and decide the next step (fix, or proceed). If the status comes back 'running', poll notebooks-run-cell-result with the run_id. A cell that reads other cells' dataframes references them by dataframe_name; those cells must have completed a run first, so add cells in dependency order. SQL cells are always InsightsQL: queries against Insights or data warehouse tables run on Datastore, and a SQL cell that references a Python-created dataframe runs on the notebook's local engine automatically — any local dataframe is queryable by name, same syntax. The first Python cell can take longer while the notebook's sandbox kernel starts. component cells add other node types: Query, Image, Embed, Latex, FeatureFlag, Survey, Experiment, Person, Cohort, Recording, RecordingPlaylist. Pass a short title on every cell you add, describing what that cell shows — it renders in the cell header and is what a reader skims instead of the code.",
|
||
"category": "Notebooks",
|
||
"feature": "notebooks",
|
||
"summary": "Add a cell to a notebook; SQL/Python cells run immediately.",
|
||
"title": "Add notebook cell",
|
||
"required_scopes": ["notebook:write", "query:read"],
|
||
"feature_flag": "revamped-py-notebooks",
|
||
"annotations": {
|
||
"destructiveHint": false,
|
||
"idempotentHint": false,
|
||
"openWorldHint": true,
|
||
"readOnlyHint": false
|
||
}
|
||
},
|
||
"notebooks-update-cell": {
|
||
"description": "Update a SQL or Python cell's code and re-run it, or re-run it unchanged by omitting code (how you refresh a stale cell). Waits up to ~45s and returns the result like notebooks-add-cell, plus stale_dependents: the downstream cells whose inputs this run invalidated. Nothing re-runs automatically — inspect each dependent and re-run it with this tool (no code) or fix it first, walking the graph one hop at a time.",
|
||
"category": "Notebooks",
|
||
"feature": "notebooks",
|
||
"summary": "Update a cell's code and re-run it.",
|
||
"title": "Update notebook cell",
|
||
"required_scopes": ["notebook:write", "query:read"],
|
||
"feature_flag": "revamped-py-notebooks",
|
||
"annotations": {
|
||
"destructiveHint": false,
|
||
"idempotentHint": false,
|
||
"openWorldHint": true,
|
||
"readOnlyHint": false
|
||
}
|
||
},
|
||
"notebooks-delete-cell": {
|
||
"description": "Delete a cell from a markdown notebook by node_id. Nothing downstream is touched: the response lists orphaned_dependents — cells that referenced the deleted cell's dataframe and now need rewriting or deleting. The kernel keeps any already-materialized dataframe until it restarts, so a dependent may still run against the deleted cell's last result; rewrite dependents promptly.",
|
||
"category": "Notebooks",
|
||
"feature": "notebooks",
|
||
"summary": "Delete a notebook cell.",
|
||
"title": "Delete notebook cell",
|
||
"required_scopes": ["notebook:write"],
|
||
"feature_flag": "revamped-py-notebooks",
|
||
"annotations": {
|
||
"destructiveHint": true,
|
||
"idempotentHint": true,
|
||
"openWorldHint": true,
|
||
"readOnlyHint": false
|
||
}
|
||
},
|
||
"get-llm-total-costs-for-project": {
|
||
"description": "Fetches the total LLM daily costs for each model for a project over a given number of days. If no number of days is provided, it defaults to 7. The results are sorted by model name. The total cost is rounded to 4 decimal places. The query is executed against the project's data warehouse. Show the results as a Markdown formatted table with the following information for each model: Model name, Total cost in USD, Each day's date, Each day's cost in USD. Write in bold the model name with the highest total cost. Properly render the markdown table in the response.",
|
||
"category": "AI observability",
|
||
"feature": "llm_analytics",
|
||
"summary": "Fetches the total LLM daily costs for each model for a project over a given number of days.",
|
||
"title": "Get LLM costs",
|
||
"required_scopes": ["warehouse_table:read"],
|
||
"annotations": {
|
||
"destructiveHint": false,
|
||
"idempotentHint": true,
|
||
"openWorldHint": true,
|
||
"readOnlyHint": true
|
||
}
|
||
},
|
||
"organizations-get": {
|
||
"description": "Fetches the organizations that the user has access to, with their id, name, and membership level. Use this to discover organizations — including ones other than the active organization — and to resolve an organization name to the id you pass to `switch-organization`.",
|
||
"category": "Organization & project management",
|
||
"feature": "workspace",
|
||
"summary": "Fetches the organizations that the user has access to.",
|
||
"title": "Get organizations",
|
||
"required_scopes": ["organization:read"],
|
||
"annotations": {
|
||
"destructiveHint": false,
|
||
"idempotentHint": true,
|
||
"openWorldHint": true,
|
||
"readOnlyHint": true
|
||
}
|
||
},
|
||
"switch-organization": {
|
||
"description": "Switch the active Insights organization for subsequent tool calls. Call this proactively whenever the user names an organization they want to operate on. Use `organizations-get` to resolve an organization name to an id. Default to the active organization when no specific organization is mentioned.",
|
||
"category": "Organization & project management",
|
||
"feature": "workspace",
|
||
"summary": "Switch the active Insights organization for subsequent tool calls.",
|
||
"title": "Switch active organization",
|
||
"required_scopes": ["organization:read"],
|
||
"annotations": {
|
||
"destructiveHint": false,
|
||
"idempotentHint": true,
|
||
"openWorldHint": true,
|
||
"readOnlyHint": false
|
||
}
|
||
},
|
||
"projects-get": {
|
||
"description": "Fetches projects that the user has access to in the current organization.",
|
||
"category": "Organization & project management",
|
||
"feature": "workspace",
|
||
"summary": "Fetches projects that the user has access to in the current organization.",
|
||
"title": "Get projects",
|
||
"required_scopes": ["organization:read"],
|
||
"annotations": {
|
||
"destructiveHint": false,
|
||
"idempotentHint": true,
|
||
"openWorldHint": true,
|
||
"readOnlyHint": true
|
||
}
|
||
},
|
||
"event-definition-update": {
|
||
"description": "Update event definition metadata. Can update description, tags, mark status as verified or hidden. Use exact event name like '$pageview' or 'user_signed_up'.",
|
||
"category": "Events & properties",
|
||
"feature": "events",
|
||
"summary": "Update an event definition's metadata.",
|
||
"title": "Update event definition",
|
||
"required_scopes": ["event_definition:write"],
|
||
"annotations": {
|
||
"destructiveHint": false,
|
||
"idempotentHint": true,
|
||
"openWorldHint": true,
|
||
"readOnlyHint": false
|
||
}
|
||
},
|
||
"property-definition-update": {
|
||
"description": "Update property definition metadata. Can update description, tags, property type (DateTime, String, Numeric, Boolean, Duration), and mark status as verified or hidden. Use the exact property name like '$browser' or 'plan_type'. Pass 'type' to target event, person, group, or session properties (defaults to event); for group properties also pass 'groupTypeIndex'. Note: passing 'tags' replaces the property's entire tag list rather than merging, so include any existing tags you want to keep.",
|
||
"category": "Events & properties",
|
||
"feature": "events",
|
||
"summary": "Update a property definition's metadata.",
|
||
"title": "Update property definition",
|
||
"required_scopes": ["property_definition:write"],
|
||
"annotations": {
|
||
"destructiveHint": false,
|
||
"idempotentHint": true,
|
||
"openWorldHint": true,
|
||
"readOnlyHint": false
|
||
}
|
||
},
|
||
"path-cleaning-rules-update": {
|
||
"description": "Safely add, replace, remove, or reorder a project's path cleaning rules (Team.path_cleaning_filters) without hand-managing the whole list. Reads the current rules, applies your ordered operations, auto-numbers them, and (unless confirm:true) returns a PREVIEW of the resulting rules — plus how they rewrite any sample_paths — without saving. Path cleaning normalizes $pathname/$entry_pathname so pages sharing a template (/users/123, /users/456) collapse into one row (/users/<id>) in Web analytics, Paths, and apply_path_cleaning InsightsQL. Prefer this over project-settings-update for path cleaning: it avoids clobbering existing rules and renumbering by hand. Rules apply sequentially (order matters) and globally wherever cleaning is enabled, changing historical numbers — surface the preview to the user, then re-run with confirm:true.",
|
||
"category": "Web analytics",
|
||
"feature": "web_analytics",
|
||
"summary": "Edit path cleaning rules with granular ops, a preview step, and safe read-modify-write.",
|
||
"title": "Update path cleaning rules",
|
||
"required_scopes": ["project:write"],
|
||
"annotations": {
|
||
"destructiveHint": true,
|
||
"idempotentHint": false,
|
||
"openWorldHint": true,
|
||
"readOnlyHint": false
|
||
}
|
||
},
|
||
"feature-flag-get-definition-by-key": {
|
||
"description": "Get a feature flag by its string key (e.g. \"new-checkout\") — the identifier used in code and shown in the UI. Use this when you have the key but not the numeric ID; use `feature-flag-get-definition` when you have the numeric ID.",
|
||
"category": "Feature flags",
|
||
"feature": "flags",
|
||
"summary": "Get a feature flag by its key.",
|
||
"title": "Get feature flag definition by key",
|
||
"required_scopes": ["feature_flag:read"],
|
||
"annotations": {
|
||
"destructiveHint": false,
|
||
"idempotentHint": true,
|
||
"openWorldHint": true,
|
||
"readOnlyHint": true
|
||
}
|
||
},
|
||
"switch-project": {
|
||
"description": "Switch the active Insights project for subsequent tool calls. Call this proactively whenever the user names a project or workspace they want to operate on. Use `projects-get` to resolve a project name to an id. If the project isn't found, the user may be referring to a project in a different organization, in which case call `organizations-get` and `switch-organization` first, then retry `projects-get`. Default to the active project when no specific project is mentioned.",
|
||
"category": "Organization & project management",
|
||
"feature": "workspace",
|
||
"summary": "Switch the active Insights project for subsequent tool calls.",
|
||
"title": "Switch active project",
|
||
"required_scopes": ["project:read"],
|
||
"annotations": {
|
||
"destructiveHint": false,
|
||
"idempotentHint": true,
|
||
"openWorldHint": true,
|
||
"readOnlyHint": false
|
||
}
|
||
},
|
||
"survey-create": {
|
||
"description": "Creates a new survey in the project. Use this for both in-app surveys and hosted forms. Prefer draft creation by default and do not set start_date unless the user explicitly asks to launch immediately. For in-app surveys, popover is the default unless the user asks for widget or api. For hosted forms, use external_survey. Keep surveys short unless the user asks for a longer flow.",
|
||
"category": "Surveys",
|
||
"summary": "Creates a new survey in the project.",
|
||
"required_scopes": ["survey:write"],
|
||
"feature": "surveys",
|
||
"title": "Create survey",
|
||
"annotations": {
|
||
"destructiveHint": false,
|
||
"idempotentHint": false,
|
||
"openWorldHint": true,
|
||
"readOnlyHint": false
|
||
}
|
||
},
|
||
"survey-get": {
|
||
"description": "Get a specific survey by ID. Returns the survey configuration including questions, targeting, and scheduling details.",
|
||
"category": "Surveys",
|
||
"summary": "Get a specific survey by ID.",
|
||
"required_scopes": ["survey:read"],
|
||
"feature": "surveys",
|
||
"title": "Get survey",
|
||
"annotations": {
|
||
"destructiveHint": false,
|
||
"idempotentHint": true,
|
||
"openWorldHint": true,
|
||
"readOnlyHint": true
|
||
}
|
||
},
|
||
"surveys-get-all": {
|
||
"description": "Get all surveys in the project with optional filtering. Can filter by search term or use pagination.",
|
||
"category": "Surveys",
|
||
"summary": "Get all surveys in the project with optional filtering.",
|
||
"required_scopes": ["survey:read"],
|
||
"feature": "surveys",
|
||
"title": "Get all surveys",
|
||
"annotations": {
|
||
"destructiveHint": false,
|
||
"idempotentHint": true,
|
||
"openWorldHint": true,
|
||
"readOnlyHint": true
|
||
}
|
||
},
|
||
"survey-update": {
|
||
"description": "Update an existing survey by ID. Omitted top-level fields are preserved, but nested objects and arrays you provide may replace existing values. Before changing questions, conditions, appearance, targeting, translations, or hosted-form content, retrieve the survey first and preserve fields that should remain. Do not send null to clear a field unless the user explicitly asked to remove it.",
|
||
"category": "Surveys",
|
||
"summary": "Update an existing survey by ID.",
|
||
"required_scopes": ["survey:write"],
|
||
"feature": "surveys",
|
||
"title": "Update survey",
|
||
"annotations": {
|
||
"destructiveHint": false,
|
||
"idempotentHint": true,
|
||
"openWorldHint": true,
|
||
"readOnlyHint": false
|
||
}
|
||
},
|
||
"survey-delete": {
|
||
"description": "Delete a survey by ID (soft delete - marks as archived).",
|
||
"category": "Surveys",
|
||
"summary": "Delete a survey by ID.",
|
||
"required_scopes": ["survey:write"],
|
||
"feature": "surveys",
|
||
"title": "Delete survey",
|
||
"annotations": {
|
||
"destructiveHint": true,
|
||
"idempotentHint": true,
|
||
"openWorldHint": true,
|
||
"readOnlyHint": false
|
||
}
|
||
},
|
||
"surveys-global-stats": {
|
||
"description": "Get aggregated response statistics across all surveys in the project. Includes event counts (shown, dismissed, sent), unique respondents, conversion rates, and timing data. Supports optional date filtering.",
|
||
"category": "Surveys",
|
||
"summary": "Get aggregated response statistics across all surveys.",
|
||
"required_scopes": ["survey:read"],
|
||
"feature": "surveys",
|
||
"title": "Get all survey response stats",
|
||
"annotations": {
|
||
"destructiveHint": false,
|
||
"idempotentHint": true,
|
||
"openWorldHint": true,
|
||
"readOnlyHint": true
|
||
}
|
||
},
|
||
"survey-stats": {
|
||
"description": "Get response statistics for a specific survey. Includes detailed event counts (shown, dismissed, sent), unique respondents, conversion rates, and timing data. Supports optional date filtering.",
|
||
"category": "Surveys",
|
||
"summary": "Get response statistics for a specific survey.",
|
||
"required_scopes": ["survey:read"],
|
||
"feature": "surveys",
|
||
"title": "Get survey response stats",
|
||
"annotations": {
|
||
"destructiveHint": false,
|
||
"idempotentHint": true,
|
||
"openWorldHint": true,
|
||
"readOnlyHint": true
|
||
}
|
||
},
|
||
"debug-mcp-ui-apps": {
|
||
"description": "Debug tool for testing MCP Apps SDK integration. Returns sample data displayed in an interactive UI app with component showcase. Use this to verify that MCP Apps are working correctly.",
|
||
"category": "Debug",
|
||
"feature": "debug",
|
||
"summary": "Debug tool for testing MCP Apps SDK.",
|
||
"title": "Debug MCP UI Apps",
|
||
"required_scopes": [],
|
||
"annotations": {
|
||
"destructiveHint": false,
|
||
"idempotentHint": true,
|
||
"openWorldHint": false,
|
||
"readOnlyHint": true
|
||
}
|
||
},
|
||
"loops-review": {
|
||
"description": "Show the user an interactive review card for a loop that is about to be created, then let them create it. Call this once you have gathered the loop's details, passing the SAME arguments you would pass to loops-create (name, instructions, runtime_adapter, triggers, behaviors, notifications, context_target, etc.). This renders a card summarizing the loop with a 'Create loop' button. Do NOT call loops-create yourself — the card's button creates the loop after the user confirms.",
|
||
"category": "Tasks",
|
||
"feature": "tasks",
|
||
"feature_flag": "loops",
|
||
"summary": "Review a loop with the user before creating it.",
|
||
"title": "Review loop before creating",
|
||
"required_scopes": ["loop:write"],
|
||
"annotations": {
|
||
"destructiveHint": false,
|
||
"idempotentHint": true,
|
||
"openWorldHint": false,
|
||
"readOnlyHint": true
|
||
}
|
||
},
|
||
"external-data-sources-db-schema": {
|
||
"description": "Validate credentials against a remote source and return the list of tables available to sync (works for database sources like Postgres/MySQL and SaaS sources like Stripe/Hubspot alike). Pass source_type and credential fields in the payload object. Each table entry includes: table name, incremental_available, append_available, cdc_available, supports_webhooks, detected_primary_keys, available_columns (name/type/nullable), rows estimate, and incremental_fields (candidate timestamp/integer columns for incremental sync). Use this BEFORE external-data-sources-create so the user can pick a sync_type per table. Returns 400 with a message if credentials are invalid.",
|
||
"category": "Data warehouse",
|
||
"feature": "data_warehouse",
|
||
"summary": "Discover tables and sync methods for a source",
|
||
"title": "Discover tables and sync methods for a source",
|
||
"required_scopes": ["external_data_source:write"],
|
||
"annotations": {
|
||
"destructiveHint": false,
|
||
"idempotentHint": true,
|
||
"openWorldHint": true,
|
||
"readOnlyHint": true
|
||
}
|
||
},
|
||
"external-data-sources-jobs": {
|
||
"description": "List sync job history for a data warehouse source. Returns jobs sorted by most recent first, with status, duration, rows synced, and errors. Supports optional filtering by date range (after/before as ISO timestamps) and by schema name.",
|
||
"category": "Data warehouse",
|
||
"feature": "data_warehouse",
|
||
"summary": "List sync job history for a source with optional date and schema filters.",
|
||
"title": "List sync jobs for a source",
|
||
"required_scopes": ["external_data_source:read"],
|
||
"annotations": {
|
||
"destructiveHint": false,
|
||
"idempotentHint": true,
|
||
"openWorldHint": false,
|
||
"readOnlyHint": true
|
||
}
|
||
},
|
||
"external-data-sources-preview-resource": {
|
||
"description": "Read a small live sample of rows for one resource (table) of a Custom REST source, so you can verify the manifest's data_selector, primary_key, and incremental cursor_path against real data BEFORE creating the source. Only source_type 'Custom' is supported. Pass source_type, a payload object ({manifest_json, plus the credential for the manifest's auth type — auth_token | auth_api_key | auth_password}), the resource_name to sample, and an optional limit (1–50, default 10). Returns {rows, row_count, columns (name + inferred JSON type), error}. Manifest, validation, and SSRF problems return 400; a live fetch failure returns 200 with `error` set and empty rows. Use external-data-sources-db-schema first to list the resource names and detected cursors.",
|
||
"category": "Data warehouse",
|
||
"feature": "data_warehouse",
|
||
"summary": "Preview sample rows for a Custom REST source resource",
|
||
"title": "Preview rows for a Custom REST source resource",
|
||
"required_scopes": ["external_data_source:write"],
|
||
"annotations": {
|
||
"destructiveHint": false,
|
||
"idempotentHint": true,
|
||
"openWorldHint": true,
|
||
"readOnlyHint": false
|
||
}
|
||
},
|
||
"external-data-sync-logs": {
|
||
"description": "Get sync job logs for a data warehouse table schema. Returns log entries from the log_entries Datastore table, filtered by schema ID and optionally by a specific job's workflow_run_id. Use external-data-sources-jobs to find job IDs and workflow_run_ids. Supports filtering by log level (DEBUG, INFO, WARNING, ERROR) and message search.",
|
||
"category": "Data warehouse",
|
||
"feature": "data_warehouse",
|
||
"summary": "Get sync job logs for a data warehouse table.",
|
||
"title": "Get sync job logs",
|
||
"required_scopes": ["query:read"],
|
||
"annotations": {
|
||
"destructiveHint": false,
|
||
"idempotentHint": true,
|
||
"openWorldHint": false,
|
||
"readOnlyHint": true
|
||
}
|
||
},
|
||
"session-recording-summarize": {
|
||
"description": "DEPRECATED — prefer Replay Vision. This is the legacy session-summary path; it still works but is being retired (removal planned, months out), so do not reach for it by default. To summarize or understand a session without watching the whole recording, use Replay Vision's scanner tools (the `vision-*` MCP tools, e.g. `vision-observations-list` to read an existing summary and `vision-scanners-scan-session` to generate one) and follow their own instructions instead. Only fall back to this tool when Replay Vision is unavailable for the org, or a user explicitly asks for the legacy summarizer.\n\nIf you do use it: generates an AI summary of one or more session recordings — user journey segments, key actions, segment and overall outcomes, and sentiment (frustration score, rage clicks, confusion signals). Accepts up to 300 session IDs and an optional `focus_area` to steer the summary (e.g. \"checkout flow\"). Returns a dict keyed by session ID; failed entries carry an `error` (e.g. `no_events_or_too_short`, `summary_failed`) and an `error_message`, and a bad session ID fails only its own entry, not the batch. WARNING: first-time summaries call an AI model and are very slow — around 5 minutes; previously generated summaries are cached and return instantly, so warn the user about the wait before calling.\n\nDEEP LINKS: key actions include `session_id` and `milliseconds_since_start`. Build links as `{insights_base_url}/replay/{session_id}?t={milliseconds_since_start / 1000}` (the `?t=` parameter is in seconds). Example: 45000ms in session abc123 → `/replay/abc123?t=45`. Always include these links for key actions and frustration signals.",
|
||
"category": "Session replays",
|
||
"feature": "replay",
|
||
"summary": "Legacy AI session summaries (streaming) — prefer Replay Vision summarizer scanners.",
|
||
"title": "Summarize session recording",
|
||
"required_scopes": ["session_recording:read"],
|
||
"requires_ai_consent": true,
|
||
"feature_flag": "replay-video-based-summarization",
|
||
"annotations": {
|
||
"destructiveHint": false,
|
||
"idempotentHint": true,
|
||
"openWorldHint": true,
|
||
"readOnlyHint": true
|
||
}
|
||
},
|
||
"execute-sql": {
|
||
"description": "Use this tool to execute an SQL query (or InsightsQL, which is Insights's variant of SQL that supports most of Datastore SQL). We're going to use terms \"InsightsQL\" and \"SQL\" interchangeably. For more information, see the querying-insights-data skill.\nBEFORE writing any query, you should follow these steps:\n1. Discover the available tables, views, columns, and their types before querying. Do NOT guess table or column names.\n2. Call insights:read-data-schema to discover available events, properties, and property values. Do NOT rely on training data or Insights defaults.\n3. Only after completing steps 1 and 2, write and execute your SQL query using verified table and column names.\nUse system tables with the system. prefix for Insights-created data. For example, count SQL insight variables with:\n```sql\nSELECT count() AS total FROM system.insight_variables\n```\nAn example query to retrieve columns of a custom data warehouse table:\n```sql\nSELECT columns FROM system.data_warehouse_tables WHERE name = 'my_table'\n```\nIMPORTANT: By default, large JSON values in results (like full `properties` objects) are truncated. If you anticipate that results might be large or you are selecting the full `properties` object (e.g., `SELECT properties FROM events`), you should dump the results to a file instead of outputting them directly. Use bash commands to process the file. Alternatively, cherry-pick only the specific properties you need (e.g., `properties.$browser`) instead of selecting the entire object.\nPROPERTY ACCESS: dot notation (`properties.$browser`) only works for keys that are valid identifiers — they must start with a letter, underscore, or `$` and contain only letters, digits, underscores, and `$` (`^[A-Za-z_$][A-Za-z0-9_$]*$`). Keys that break this rule (hyphens, dots, spaces, or a leading digit) cannot use dot notation; for example `properties.$survey_response_0196e96d-7705-7d32` is parsed as a subtraction and fails. Use bracket notation with a quoted string for those keys: `properties['$survey_response_0196e96d-7705-7d32']`. This applies to all JSON columns (e.g. `person.properties[...]`).",
|
||
"category": "SQL",
|
||
"feature": "sql",
|
||
"summary": "Execute an SQL query.",
|
||
"title": "Execute SQL query",
|
||
"required_scopes": ["query:read", "insight:read"],
|
||
"annotations": {
|
||
"destructiveHint": false,
|
||
"idempotentHint": true,
|
||
"openWorldHint": true,
|
||
"readOnlyHint": true
|
||
}
|
||
},
|
||
"read-data-schema": {
|
||
"description": "Use this tool to explore the user's data schema. The user implements Insights SDKs to collect events, properties, and property values. They are used by users to create insights with visualizations, SQL queries, watch session recordings, filter data, target particular users or groups by traits or behavior, etc. Each event, action, and entity has its own data schema. You must verify that specific combinations exist before using it anywhere else. Events or properties starting from \"$\" are system properties automatically captured by SDKs. Do not rely on your training data or Insights defaults for events or properties. Always use this tool to confirm what actually exists in the user's project before referencing any event, property, or property value.",
|
||
"category": "Data schema",
|
||
"feature": "data_schema",
|
||
"summary": "Explore the user's events, actions, properties, and property values.",
|
||
"title": "Read data schema",
|
||
"required_scopes": ["event_definition:read", "property_definition:read"],
|
||
"annotations": {
|
||
"destructiveHint": false,
|
||
"idempotentHint": true,
|
||
"openWorldHint": true,
|
||
"readOnlyHint": true
|
||
}
|
||
},
|
||
"workflows-enable": {
|
||
"description": "Enable / activate a draft workflow and start processing events. From then on it runs on real people: test it first with workflows-test-run and get the user's explicit approval before invoking - don't enable on your own initiative. Once live, content edits stage as a draft you publish with workflows-publish.",
|
||
"category": "Workflows",
|
||
"feature": "workflows",
|
||
"summary": "Enable workflow",
|
||
"title": "Enable workflow",
|
||
"required_scopes": ["script_flow:write"],
|
||
"annotations": {
|
||
"destructiveHint": true,
|
||
"idempotentHint": true,
|
||
"openWorldHint": true,
|
||
"readOnlyHint": false
|
||
}
|
||
},
|
||
"workflows-archive": {
|
||
"description": "Archive a draft or disabled workflow.",
|
||
"category": "Workflows",
|
||
"feature": "workflows",
|
||
"summary": "Archive workflow",
|
||
"title": "Archive workflow",
|
||
"required_scopes": ["script_flow:write"],
|
||
"annotations": {
|
||
"destructiveHint": false,
|
||
"idempotentHint": true,
|
||
"openWorldHint": true,
|
||
"readOnlyHint": false
|
||
}
|
||
},
|
||
"workflows-blast-radius": {
|
||
"description": "Count how many users a batch workflow's audience matches (person/cohort, not event behavior). Always run this BEFORE run-batch / schedule-create. Then STOP and get the user's explicit confirmation: tell them the exact count and that running will send real messages to that many people. Do not proceed to run-batch / schedule-create until they say yes. The response's confirm_token signs the sized audience - pass it to workflows-run-batch along with the acknowledged count; it expires in 15 minutes and goes stale if the audience filters change.",
|
||
"category": "Workflows",
|
||
"feature": "workflows",
|
||
"summary": "Size workflow audience",
|
||
"title": "Size workflow audience",
|
||
"required_scopes": ["script_flow:read", "person:read"],
|
||
"annotations": {
|
||
"destructiveHint": false,
|
||
"idempotentHint": true,
|
||
"openWorldHint": true,
|
||
"readOnlyHint": true
|
||
}
|
||
},
|
||
"workflows-run-batch": {
|
||
"description": "Broadcast a batch workflow to its matching users NOW — sends real messages/webhooks, not a test. Workflow must be enabled. STOP before calling: show the user the audience size from workflows-blast-radius and get their explicit confirmation in a separate turn — never size and fire in one step. Requires acknowledged_affected_count AND the confirm_token from that same workflows-blast-radius preview; the API rejects dispatch without the token, on audience drift, over the cap, or after 15 minutes.",
|
||
"category": "Workflows",
|
||
"feature": "workflows",
|
||
"summary": "Run batch workflow",
|
||
"title": "Run batch workflow",
|
||
"required_scopes": ["script_flow:write", "person:read"],
|
||
"annotations": {
|
||
"destructiveHint": true,
|
||
"idempotentHint": false,
|
||
"openWorldHint": true,
|
||
"readOnlyHint": false
|
||
}
|
||
},
|
||
"workflows-schedule-create": {
|
||
"description": "Attach a recurring RRULE schedule to a batch workflow. The workflow must already be active (enable it first). Each run broadcasts real messages to the trigger audience — STOP and get the user's explicit confirmation first, then pass acknowledged_affected_count from workflows-blast-radius.",
|
||
"category": "Workflows",
|
||
"feature": "workflows",
|
||
"summary": "Schedule workflow runs",
|
||
"title": "Schedule workflow runs",
|
||
"required_scopes": ["script_flow:write", "person:read"],
|
||
"annotations": {
|
||
"destructiveHint": true,
|
||
"idempotentHint": false,
|
||
"openWorldHint": true,
|
||
"readOnlyHint": false
|
||
}
|
||
}
|
||
}
|