# MCP tools

The Lessly MCP server exposes these tools to your AI agent.

The machine-readable catalog is served at [`/mcp/tools.json`](/mcp/tools.json) — that endpoint is what an MCP client reads.

## Tools

Every tool the live server exposes, grouped by feature area. Each name links to its reference page with arguments, an example prompt, and an "Open in Claude" CTA.

### Analytics

1 tool.

- [`analytics_query_run`](/reference/mcp-tools/analytics_query_run) — Answer a natural-language analytics question for the current product.

### Brain

41 tools.

- [`brain_backup_create`](/reference/mcp-tools/brain_backup_create) — Request an on-demand point-in-time backup of the current product's Brain memory. Async (202): records a running snapshot and runs the backup in the background — returns \{ accepted, snapshotId }; poll brain\_backups\_list / brain\_backup\_status for completion. Rejects (409) if a backup is already running for the product.
- [`brain_backup_restore`](/reference/mcp-tools/brain_backup_restore) — DESTRUCTIVE: full-replace restore of the current product's Brain from a snapshot (wipe + load). Takes an automatic pre-restore snapshot first (safety net). Requires confirm:true AND confirmProductId echo; refuses on product/snapshot mismatch or embedding-dims mismatch. Async — returns \{ accepted, restoreId }; poll brain\_restore\_status.
- [`brain_backup_status`](/reference/mcp-tools/brain_backup_status) — Get a backup status by snapshot id, or the latest backup for the current product.
- [`brain_backups_list`](/reference/mcp-tools/brain_backups_list) — List the current product's backups (most recent first).
- [`brain_clickup_channels_list`](/reference/mcp-tools/brain_clickup_channels_list) — List the chat channels in a ClickUp workspace connection (for selecting channels to ingest)
- [`brain_clickup_connections_list`](/reference/mcp-tools/brain_clickup_connections_list) — List the ClickUp workspace connections available to the current product
- [`brain_clickup_lists_list`](/reference/mcp-tools/brain_clickup_lists_list) — List all lists in a ClickUp space (folderless and within folders, optionally filtered by search)
- [`brain_clickup_spaces_list`](/reference/mcp-tools/brain_clickup_spaces_list) — List the spaces in a ClickUp connection (optionally filtered by search)
- [`brain_cognition_digest`](/reference/mcp-tools/brain_cognition_digest) — Queue a System-2 digest over the product shared pool (async); returns \{ accepted, run\_id }. Poll brain\_cognition\_status for the result.
- [`brain_cognition_status`](/reference/mcp-tools/brain_cognition_status) — Read the engine-global System-2 queue gauge plus this product's last digest/sweep run (status, counts, timing).
- [`brain_cognition_sweep`](/reference/mcp-tools/brain_cognition_sweep) — Queue a cross-domain sweep over the product shared pool (async); returns \{ accepted, run\_id }. Poll brain\_cognition\_status for the result.
- [`brain_connector_branches_list`](/reference/mcp-tools/brain_connector_branches_list) — List branches for a repository on a GitHub connection
- [`brain_connector_connections_list`](/reference/mcp-tools/brain_connector_connections_list) — List the GitHub connections available to the current product
- [`brain_connector_repos_list`](/reference/mcp-tools/brain_connector_repos_list) — List repositories accessible to a GitHub connection (optionally filtered by search)
- [`brain_daemon_batch_status`](/reference/mcp-tools/brain_daemon_batch_status) — Get batch ingestion status for a daemon (pending count, job, ETA, model, outcome)
- [`brain_daemon_create`](/reference/mcp-tools/brain_daemon_create) — Create a new ingestion daemon (github, clickup or gdrive)
- [`brain_daemon_get`](/reference/mcp-tools/brain_daemon_get) — Get a specific ingestion daemon by id
- [`brain_daemon_reingest`](/reference/mcp-tools/brain_daemon_reingest) — Force re-ingest of specific document paths for a daemon: clears their stored content hash and triggers a realtime run, so degraded or never-measured documents are re-extracted instead of hash-skipped forever
- [`brain_daemon_remove`](/reference/mcp-tools/brain_daemon_remove) — Remove an ingestion daemon and its connector state (leaves ingested memory)
- [`brain_daemon_run`](/reference/mcp-tools/brain_daemon_run) — Trigger an immediate run for a daemon and return its current status
- [`brain_daemon_run_items`](/reference/mcp-tools/brain_daemon_run_items) — List the per-item ingest ledger for a run (filter by outcome, esp. denied)
- [`brain_daemon_runs`](/reference/mcp-tools/brain_daemon_runs) — Recent run history for a daemon with per-run ingest counts
- [`brain_daemon_status`](/reference/mcp-tools/brain_daemon_status) — Get the latest run status for a daemon
- [`brain_daemon_update`](/reference/mcp-tools/brain_daemon_update) — Update an ingestion daemon (config, enabled, name, branch)
- [`brain_daemons_list`](/reference/mcp-tools/brain_daemons_list) — List configured ingestion daemons for this product
- [`brain_gdrive_connections_list`](/reference/mcp-tools/brain_gdrive_connections_list) — List Google Drive connections for this product with their picked files
- [`brain_knowledge_entity_memories`](/reference/mcp-tools/brain_knowledge_entity_memories) — List the memories a knowledge entity was extracted from (its DERIVED\_FROM evidence)
- [`brain_knowledge_graph`](/reference/mcp-tools/brain_knowledge_graph) — Export the product knowledge graph (entities + typed relations) as nodes and edges; truncation keeps the highest-degree nodes, so a small limit returns the hub concepts
- [`brain_knowledge_neighborhood`](/reference/mcp-tools/brain_knowledge_neighborhood) — Expand the neighborhood (related entities + relations) around one knowledge entity
- [`brain_knowledge_relations`](/reference/mcp-tools/brain_knowledge_relations) — List typed relations (depends\_on, competes\_with, …) in the product knowledge graph
- [`brain_knowledge_search`](/reference/mcp-tools/brain_knowledge_search) — Search product knowledge-graph entities (Feature, Decision, Risk, …) for the current product
- [`brain_memory_add`](/reference/mcp-tools/brain_memory_add) — Store a memory for the current product
- [`brain_memory_delete`](/reference/mcp-tools/brain_memory_delete) — Delete a memory you own (or a shared one)
- [`brain_memory_get`](/reference/mcp-tools/brain_memory_get) — Get one memory by id (product+agent scoped)
- [`brain_memory_list`](/reference/mcp-tools/brain_memory_list) — List memories (shared + your private by default)
- [`brain_memory_search`](/reference/mcp-tools/brain_memory_search) — Search memories for the current product
- [`brain_memory_stats`](/reference/mcp-tools/brain_memory_stats) — Summary counts for the current product (memories by layer, graph nodes/edges, entities)
- [`brain_memory_update`](/reference/mcp-tools/brain_memory_update) — Replace a memory you own (or a shared one)
- [`brain_product_shared_memory_reset`](/reference/mcp-tools/brain_product_shared_memory_reset) — DESTRUCTIVE admin op: reset a product's SHARED Brain memory (vectors + knowledge graph) and clear its connector\_state so a re-ingest re-writes. Requires confirm:true AND confirmProductId echo; gated by an env arm flag, an env allowlist, and governance access.
- [`brain_restore_status`](/reference/mcp-tools/brain_restore_status) — Read a restore run's status (pending|wiped|importing|completed|failed) with counts + timing, by restoreId (returned by brain\_backup\_restore).
- [`brain_usage_report`](/reference/mcp-tools/brain_usage_report) — Reported LLM/embedding token usage for this product, next to the platform billing aggregate

### Consent

15 tools.

- [`consent_config_cookie_domain_upsert`](/reference/mcp-tools/consent_config_cookie_domain_upsert) — Sets an explicit cookie Domain for the consent cookie (lessly\_consent). By default the banner derives the widest owned boundary automatically: the registrable domain (eTLD+1) on customer sites, or the deploy host on Lessly platform hosts — so consent given on site.com also covers docs.site.com. Set cookieDomain only to NARROW that perimeter, e.g. when several Lessly products live on subdomains of one domain and each must keep its own consent (cookieDomain: "docs.site.com" on the docs product). The value must be a suffix of the page hostname at runtime, otherwise the banner ignores it and falls back to auto-derivation. Platform deploy suffixes (lessly.dev / lessly.com / lessly.run / lessly.tech / v2.\*) are rejected — a cookie on those would leak consent across tenants. Pass null or an empty string to remove the override.
- [`consent_config_customization_upsert`](/reference/mcp-tools/consent_config_customization_upsert) — Fine-tunes the banner beyond brand tokens, when the theme alone is not enough. logoUrl / coverUrl — https URLs to images hosted on the client's side (we store nothing; an empty string removes the asset; an external URL exposes the visitor's IP to that host); coverUrl is a header strip across the top of the banner. position — where the banner sits on the page ("bottom" / "top" / "bottom-left" / "bottom-right" / "center-modal"); this is the banner's placement, distinct from the reopen-icon corner in consent\_config\_floating\_icon\_upsert. logoAlign — "start" / "center" / "end"; contentAlign — "start" / "center". All fields are optional and patch-merge onto the previous customization. This layer does not change button equality ("Accept all" / "Reject all") or the provider list.
- [`consent_config_floating_icon_upsert`](/reference/mcp-tools/consent_config_floating_icon_upsert) — Configures the always-available "Cookie settings" entry point that lets a visitor reopen their consent preferences after they have made a choice. By default Lessly renders a floating icon in a page corner; you can move it, or bind the entry point to an element the site already has (for example a "Cookie settings" link in the footer) instead of showing the icon. Fields (under `floatingIcon`): enabled — whether to render Lessly's built-in floating icon; position — which corner the icon sits in ("bottom-right" / "bottom-left" / "top-right" / "top-left"); customSelector — a CSS selector for an existing element on the page (e.g. "#footer-cookie-link") whose click opens consent settings, or null to rely on the built-in icon only. To hide the built-in icon (enabled: false) you must provide a customSelector, so the visitor always keeps a way to reopen settings.
- [`consent_config_theme_upsert`](/reference/mcp-tools/consent_config_theme_upsert) — Adapts the consent banner's appearance to the site's brand. Pass what you observe on the client's site: brandColor — the site's primary brand color (any CSS color); surface — whether the site is "light" or "dark"; corners — button corner shape ("sharp" / "rounded" / "pill"); font — the site's font, given as a font name, a full CSS font stack, or "inherit" to adopt the host page's font. If the brand tokens are not enough, fine-tune `overrides`: backgroundColor, textColor, borderColor, focusColor, dangerColor, successColor, warningColor. All fields are optional and patch-merge onto the previous theme. To identify the site: use a URL from the request; otherwise the latest decision `pageUrl`; otherwise ask the user once. This layer is cosmetic only — after applying, "Accept all" and "Reject all" stay equally prominent and the provider list is unchanged.
- [`consent_dashboard_config_get`](/reference/mcp-tools/consent_dashboard_config_get) — Returns consent config for the current product: theme — the editable brand-theme intent previously set via consent\_config\_theme\_upsert; customization — the editable escape-hatch intent (logo/cover URLs, position, alignment) set via consent\_config\_customization\_upsert (empty object if none set yet) — and floatingIcon (trigger settings). When no consent\_config row exists, returns defaults; never 404s.
- [`consent_dashboard_decisions_list`](/reference/mcp-tools/consent_dashboard_decisions_list) — Returns the latest consent decisions for the current product — each with its HMAC signature (`stamp`) and a computed accept/deny/custom/withdrawal label. Read-only; useful to confirm decisions are still being signed.
- [`consent_dashboard_embed_snippet_get`](/reference/mcp-tools/consent_dashboard_embed_snippet_get) — Returns the consent banner embed \<script> tag and public edge URL for the current product. Read-only. Insert script\_tag VERBATIM, including its leading HTML comment, as the FIRST script in \<head> — before any tracker, tag manager or inline loader. Never add async or defer: banner.js must execute before the parser reaches the first tracker, otherwise trackers run before consent is known.
- [`consent_dashboard_stats_get`](/reference/mcp-tools/consent_dashboard_stats_get) — Returns lightweight dashboard stats for the current product (currently total record count). Read-only.
- [`consent_embed_get`](/reference/mcp-tools/consent_embed_get) — Returns the consent banner embed \<script> tag for the current product. Insert script\_tag VERBATIM, including its leading HTML comment, as the FIRST script in \<head> — before any tracker, tag manager or inline loader. Never add async or defer: banner.js must execute before the parser reaches the first tracker, otherwise trackers run before consent is known.
- [`consent_providers_create`](/reference/mcp-tools/consent_providers_create) — Create a new consent provider. cookies (optional) is the full set; cookies must have unique names within the provider.
- [`consent_providers_delete`](/reference/mcp-tools/consent_providers_delete) — Delete a consent provider and all its cookies (cascade).
- [`consent_providers_list`](/reference/mcp-tools/consent_providers_list) — List all consent providers (and their cookies) for the current product.
- [`consent_providers_update`](/reference/mcp-tools/consent_providers_update) — Update an existing consent provider. cookies: undefined leaves cookies unchanged, [] clears them, [...] replaces the whole set. privacyUrl: null clears the field.
- [`consent_records_export`](/reference/mcp-tools/consent_records_export) — Export consent records for the current product as CSV (workspace-scoped). Returns inline CSV up to `limit` rows; if more rows match the filter, also returns `download_url` pointing to the streaming HTTP endpoint with the same filters applied. For an Art. 15 (DSAR) access request, pass `record_id` (the UUID from the visitor's consent cookie) to filter the export to that visitor's full decision chain.
- [`consent_stats_get`](/reference/mcp-tools/consent_stats_get) — Returns aggregated consent decision stats for the current product over a configurable window (default 30d, max 365d). Returns integer percentages 0..100; due to per-bucket rounding the sum may be 99..101. Read-only.

### Deployment

107 tools.

- [`deployment_alert_create`](/reference/mcp-tools/deployment_alert_create) — Create a threshold alert rule for a service or managed service
- [`deployment_alert_delete`](/reference/mcp-tools/deployment_alert_delete) — Delete an alert rule
- [`deployment_alert_events_list`](/reference/mcp-tools/deployment_alert_events_list) — List recent alert firing/resolved events in an environment
- [`deployment_alert_list`](/reference/mcp-tools/deployment_alert_list) — List alert rules in an environment
- [`deployment_alert_update`](/reference/mcp-tools/deployment_alert_update) — Update an alert rule (threshold, comparator, enabled)
- [`deployment_analytics_query`](/reference/mcp-tools/deployment_analytics_query) — Ask a natural-language question about THIS product's deployment data (deployments, deploy events, environments, services, domains, managed services) and get a computed answer. Returns the generated SQL, the result rows, and a natural-language answer. Read-only; scoped to the current product.
- [`deployment_audit_list`](/reference/mcp-tools/deployment_audit_list) — List configuration-change audit events for an environment, newest first
- [`deployment_build_get`](/reference/mcp-tools/deployment_build_get) — Get a single build by deployment id
- [`deployment_build_list`](/reference/mcp-tools/deployment_build_list) — List builds for a service, newest first
- [`deployment_build_logs`](/reference/mcp-tools/deployment_build_logs) — Snapshot build logs for a deployment (Cloud Logging proxy)
- [`deployment_canvas_get`](/reference/mcp-tools/deployment_canvas_get) — Get canvas state (nodes + services) for an environment
- [`deployment_canvas_move_node`](/reference/mcp-tools/deployment_canvas_move_node) — Update position/size of a canvas node
- [`deployment_cloud_sql_backfill_log_flags`](/reference/mcp-tools/deployment_cloud_sql_backfill_log_flags) — Apply this product's managed Postgres (Cloud SQL) log flags to existing instance(s), idempotently (safe to re-run; zero downtime). Optionally target one instanceId.
- [`deployment_cloud_sql_database_attach`](/reference/mcp-tools/deployment_cloud_sql_database_attach) — Attach a managed Postgres database to a service in an environment; injects DATABASE\_URL (and PG\* vars) as a secret.
- [`deployment_cloud_sql_database_create`](/reference/mcp-tools/deployment_cloud_sql_database_create) — Create a logical database (with its own role) on the managed Postgres instance.
- [`deployment_cloud_sql_database_delete`](/reference/mcp-tools/deployment_cloud_sql_database_delete) — Delete a logical managed Postgres database (detaches from all services first).
- [`deployment_cloud_sql_database_detach`](/reference/mcp-tools/deployment_cloud_sql_database_detach) — Detach a managed Postgres database from a service; removes the injected connection secrets. Does not delete the database.
- [`deployment_cloud_sql_database_get`](/reference/mcp-tools/deployment_cloud_sql_database_get) — Get a logical managed Postgres database by id.
- [`deployment_cloud_sql_database_list`](/reference/mcp-tools/deployment_cloud_sql_database_list) — List the logical managed Postgres databases on an instance.
- [`deployment_cloud_sql_instance_backup`](/reference/mcp-tools/deployment_cloud_sql_instance_backup) — Take an on-demand backup of the managed Postgres (Cloud SQL) instance.
- [`deployment_cloud_sql_instance_backup_list`](/reference/mcp-tools/deployment_cloud_sql_instance_backup_list) — List backup runs for the managed Postgres (Cloud SQL) instance.
- [`deployment_cloud_sql_instance_create`](/reference/mcp-tools/deployment_cloud_sql_instance_create) — Provision the product's managed Postgres instance on Google Cloud SQL — fully managed by Google Cloud, with automated backups and point-in-time recovery, a dedicated instance, and easy resize.
- [`deployment_cloud_sql_instance_delete`](/reference/mcp-tools/deployment_cloud_sql_instance_delete) — Delete the managed Postgres (Cloud SQL) instance (must have no databases).
- [`deployment_cloud_sql_instance_get`](/reference/mcp-tools/deployment_cloud_sql_instance_get) — Get the product's managed Postgres (Cloud SQL) instance and its status.
- [`deployment_cloud_sql_instance_list`](/reference/mcp-tools/deployment_cloud_sql_instance_list) — List the product's managed Postgres (Cloud SQL) instance(s).
- [`deployment_cloud_sql_instance_resize`](/reference/mcp-tools/deployment_cloud_sql_instance_resize) — Resize the managed Postgres (Cloud SQL) instance to a different tier (CPU/RAM).
- [`deployment_cloud_sql_instance_restore`](/reference/mcp-tools/deployment_cloud_sql_instance_restore) — Restore the managed Postgres (Cloud SQL) instance IN-PLACE from a backup run (destructive — overwrites current data).
- [`deployment_cloud_sql_logs`](/reference/mcp-tools/deployment_cloud_sql_logs) — Snapshot the last N Postgres log lines for a managed Postgres (Cloud SQL) instance.
- [`deployment_deployment_cancel`](/reference/mcp-tools/deployment_deployment_cancel) — Cancel a non-terminal deployment, releasing the in-progress lock so the service can deploy again
- [`deployment_deployment_get`](/reference/mcp-tools/deployment_deployment_get) — Get a single deployment by id
- [`deployment_deployment_list`](/reference/mcp-tools/deployment_deployment_list) — List deployments for a service (newest first)
- [`deployment_domain_add`](/reference/mcp-tools/deployment_domain_add) — Register a custom domain for an environment; returns CNAME+TXT DNS instructions
- [`deployment_domain_allowed_list`](/reference/mcp-tools/deployment_domain_allowed_list) — List Governance-approved base domains the product may add subdomains of
- [`deployment_domain_get`](/reference/mcp-tools/deployment_domain_get) — Get a domain by id (includes DNS instructions for custom domains awaiting verification)
- [`deployment_domain_list`](/reference/mcp-tools/deployment_domain_list) — List domains for an environment (auto + custom)
- [`deployment_domain_list_by_service`](/reference/mcp-tools/deployment_domain_list_by_service) — List domains routed to a service (backward-compat)
- [`deployment_domain_redirect_www`](/reference/mcp-tools/deployment_domain_redirect_www) — Toggle the www→apex 301 redirect for an apex custom domain
- [`deployment_domain_remove`](/reference/mcp-tools/deployment_domain_remove) — Remove a custom domain (auto-domains are removed via service.delete)
- [`deployment_domain_routes_add`](/reference/mcp-tools/deployment_domain_routes_add) — Add a path-route to a custom domain
- [`deployment_domain_routes_list`](/reference/mcp-tools/deployment_domain_routes_list) — List path-routes for a domain
- [`deployment_domain_routes_remove`](/reference/mcp-tools/deployment_domain_routes_remove) — Remove a path-route (default route cannot be removed)
- [`deployment_domain_routes_update`](/reference/mcp-tools/deployment_domain_routes_update) — Update a path-route
- [`deployment_domain_verify`](/reference/mcp-tools/deployment_domain_verify) — Force an out-of-band DNS verification check for a custom domain
- [`deployment_environment_create`](/reference/mcp-tools/deployment_environment_create) — Create a new environment
- [`deployment_environment_delete`](/reference/mcp-tools/deployment_environment_delete) — Delete an environment (production cannot be deleted)
- [`deployment_environment_fork`](/reference/mcp-tools/deployment_environment_fork) — Fork an environment: deep-clone services, variables (not secrets), domains, and volumes from a base environment
- [`deployment_environment_get`](/reference/mcp-tools/deployment_environment_get) — Get a single environment by id
- [`deployment_environment_list`](/reference/mcp-tools/deployment_environment_list) — List environments for the current product. Optionally filter by type (persistent or pr-preview).
- [`deployment_environment_reconcile`](/reference/mcp-tools/deployment_environment_reconcile) — Re-emit the provision or deprovision workflow for an environment, with optional force-finalizer-strip on deprovision
- [`deployment_environment_update`](/reference/mcp-tools/deployment_environment_update) — Update an environment (name is the only updatable field)
- [`deployment_events_list_by_environment`](/reference/mcp-tools/deployment_events_list_by_environment) — List deploy events for an environment, newest first
- [`deployment_events_list_by_service`](/reference/mcp-tools/deployment_events_list_by_service) — List deploy events for a service, newest first
- [`deployment_managed_service_backup`](/reference/mcp-tools/deployment_managed_service_backup) — Create a backup snapshot of a managed service
- [`deployment_managed_service_backup_list`](/reference/mcp-tools/deployment_managed_service_backup_list) — List backup snapshots for a managed service
- [`deployment_managed_service_connect_info`](/reference/mcp-tools/deployment_managed_service_connect_info) — Get connection info and variable reference syntax for a managed service
- [`deployment_managed_service_delete`](/reference/mcp-tools/deployment_managed_service_delete) — Delete a managed service (soft-delete, triggers deprovisioning)
- [`deployment_managed_service_get`](/reference/mcp-tools/deployment_managed_service_get) — Get a managed service by id
- [`deployment_managed_service_list`](/reference/mcp-tools/deployment_managed_service_list) — List managed services in an environment
- [`deployment_managed_service_logs`](/reference/mcp-tools/deployment_managed_service_logs) — Get pod logs for a managed service
- [`deployment_managed_service_provision`](/reference/mcp-tools/deployment_managed_service_provision) — Provision a managed service (e.g. Postgres, Redis) inside an environment
- [`deployment_managed_service_reconcile`](/reference/mcp-tools/deployment_managed_service_reconcile) — Retry provisioning of a managed service that failed
- [`deployment_managed_service_resize`](/reference/mcp-tools/deployment_managed_service_resize) — Increase storage size of a managed service (cannot shrink)
- [`deployment_managed_service_restore`](/reference/mcp-tools/deployment_managed_service_restore) — Restore a managed service from a backup snapshot
- [`deployment_managed_service_start`](/reference/mcp-tools/deployment_managed_service_start) — Start a stopped managed service
- [`deployment_managed_service_stop`](/reference/mcp-tools/deployment_managed_service_stop) — Stop a running managed service
- [`deployment_managed_service_types`](/reference/mcp-tools/deployment_managed_service_types) — List available managed service engines and versions
- [`deployment_metrics_get`](/reference/mcp-tools/deployment_metrics_get) — Get metric time series for a service or managed service over a fixed window (15m/1h/6h/24h/7d). Services return resource metrics (cpu, memory, net\_in, net\_out) plus HTTP metrics (rps, p50, p95, p99, error\_rate); managed services return cpu, memory, net\_in, net\_out, disk.
- [`deployment_preview_environment_create`](/reference/mcp-tools/deployment_preview_environment_create) — Create a preview environment from an open PR
- [`deployment_preview_environment_delete`](/reference/mcp-tools/deployment_preview_environment_delete) — Delete a preview environment immediately
- [`deployment_preview_environment_list`](/reference/mcp-tools/deployment_preview_environment_list) — List all preview environments
- [`deployment_preview_policy_get`](/reference/mcp-tools/deployment_preview_policy_get) — Get preview policy for a base environment (returns defaults if none configured)
- [`deployment_preview_policy_set`](/reference/mcp-tools/deployment_preview_policy_set) — Configure preview policy for a base environment (enabled, maxPreviews, ttlHours)
- [`deployment_service_create`](/reference/mcp-tools/deployment_service_create) — Create a service inside an environment
- [`deployment_service_delete`](/reference/mcp-tools/deployment_service_delete) — Delete a service
- [`deployment_service_exec`](/reference/mcp-tools/deployment_service_exec) — Run a command against a service. mode:"exec" (default) execs non-interactively into the first running pod (debugging); mode:"job" runs a one-off Job of the service's current image with its env (migrations). Returns stdout/stderr + exit code as text. command is run via /bin/sh -c.
- [`deployment_service_get`](/reference/mcp-tools/deployment_service_get) — Get a single service by id
- [`deployment_service_list`](/reference/mcp-tools/deployment_service_list) — List services within an environment
- [`deployment_service_logs`](/reference/mcp-tools/deployment_service_logs) — Snapshot the last N runtime log lines for a service
- [`deployment_service_redeploy`](/reference/mcp-tools/deployment_service_redeploy) — Roll out a new deployment for a service from its current source and variables (runs asynchronously; poll the deployment for status)
- [`deployment_service_restart`](/reference/mcp-tools/deployment_service_restart) — Trigger a rolling restart of a service without changing the deployed image
- [`deployment_service_rollback`](/reference/mcp-tools/deployment_service_rollback) — Roll back a service to a previous deployment by re-deploying its imageRef
- [`deployment_service_scale`](/reference/mcp-tools/deployment_service_scale) — Scale a service to N replicas without redeploy (min 0 = stop)
- [`deployment_service_update`](/reference/mcp-tools/deployment_service_update) — Update service fields
- [`deployment_service_wake`](/reference/mcp-tools/deployment_service_wake) — Wake a sleeping (scale-to-zero) service
- [`deployment_ssh_command`](/reference/mcp-tools/deployment_ssh_command) — Get the ssh command string to connect to a service
- [`deployment_ssh_key_delete`](/reference/mcp-tools/deployment_ssh_key_delete) — Delete a registered SSH public key
- [`deployment_ssh_key_list`](/reference/mcp-tools/deployment_ssh_key_list) — List SSH public keys registered in the current workspace
- [`deployment_ssh_key_register`](/reference/mcp-tools/deployment_ssh_key_register) — Register an SSH public key for the current workspace
- [`deployment_suspension_get`](/reference/mcp-tools/deployment_suspension_get) — Get the product's billing-suspension state (stage, reason, grace deadline) and whether enforcement is active
- [`deployment_variable_list`](/reference/mcp-tools/deployment_variable_list) — List variables for a service (secret values are returned as null)
- [`deployment_variable_list_env`](/reference/mcp-tools/deployment_variable_list_env) — List environment-scope (shared) variables
- [`deployment_variable_list_product`](/reference/mcp-tools/deployment_variable_list_product) — List product-scope (global) variables
- [`deployment_variable_set`](/reference/mcp-tools/deployment_variable_set) — Create or update a variable on a service. Pass `isSecret: true` to encrypt the value via KMS — this transition is irreversible (a row that is already secret cannot be downgraded to plain).
- [`deployment_variable_set_env`](/reference/mcp-tools/deployment_variable_set_env) — Create or update an environment-scope shared variable
- [`deployment_variable_set_product`](/reference/mcp-tools/deployment_variable_set_product) — Create or update a product-scope global variable
- [`deployment_variable_unset`](/reference/mcp-tools/deployment_variable_unset) — Delete a variable from a service by key
- [`deployment_variable_unset_env`](/reference/mcp-tools/deployment_variable_unset_env) — Delete an environment-scope variable by key
- [`deployment_variable_unset_product`](/reference/mcp-tools/deployment_variable_unset_product) — Delete a product-scope variable by key
- [`deployment_vcs_branch_list`](/reference/mcp-tools/deployment_vcs_branch_list) — List branches for a repository on a GitHub connection
- [`deployment_vcs_connection_list`](/reference/mcp-tools/deployment_vcs_connection_list) — List the GitHub connections available to the current product
- [`deployment_vcs_repo_list`](/reference/mcp-tools/deployment_vcs_repo_list) — List repositories accessible to a GitHub connection (optionally filtered by search)
- [`deployment_volume_create`](/reference/mcp-tools/deployment_volume_create) — Create a volume
- [`deployment_volume_delete`](/reference/mcp-tools/deployment_volume_delete) — Permanently delete a detached volume
- [`deployment_volume_detach`](/reference/mcp-tools/deployment_volume_detach) — Detach a volume from its service (data preserved)
- [`deployment_volume_get`](/reference/mcp-tools/deployment_volume_get) — Get a volume
- [`deployment_volume_list`](/reference/mcp-tools/deployment_volume_list) — List volumes in environment
- [`deployment_volume_resize`](/reference/mcp-tools/deployment_volume_resize) — Increase a volume size

### Mail

51 tools.

- [`mail_apikey_create`](/reference/mcp-tools/mail_apikey_create) — Issue a scoped sending API key; the full secret is returned only once
- [`mail_apikey_delete`](/reference/mcp-tools/mail_apikey_delete) — Revoke an API key by id
- [`mail_apikey_list`](/reference/mcp-tools/mail_apikey_list) — List active API keys (prefix + metadata only, never the secret)
- [`mail_audience_create`](/reference/mcp-tools/mail_audience_create) — Create an audience (a named bucket of contacts) for the current product
- [`mail_audience_delete`](/reference/mcp-tools/mail_audience_delete) — Delete an audience and all its contacts (cascade)
- [`mail_audience_get`](/reference/mcp-tools/mail_audience_get) — Get a single audience by id
- [`mail_audience_list`](/reference/mcp-tools/mail_audience_list) — List audiences for the current product
- [`mail_audience_update`](/reference/mcp-tools/mail_audience_update) — Rename an audience
- [`mail_broadcast_cancel`](/reference/mcp-tools/mail_broadcast_cancel) — Cancel a draft or queued broadcast
- [`mail_broadcast_create`](/reference/mcp-tools/mail_broadcast_create) — Create a draft broadcast (inline content or a template reference) targeting an audience
- [`mail_broadcast_delete`](/reference/mcp-tools/mail_broadcast_delete) — Delete a draft broadcast
- [`mail_broadcast_get`](/reference/mcp-tools/mail_broadcast_get) — Get one broadcast by id
- [`mail_broadcast_list`](/reference/mcp-tools/mail_broadcast_list) — List broadcasts for the product (cursor-paginated)
- [`mail_broadcast_queue`](/reference/mcp-tools/mail_broadcast_queue) — Queue a draft broadcast — fans out one email per eligible contact
- [`mail_broadcast_stats`](/reference/mcp-tools/mail_broadcast_stats) — Per-broadcast analytics: recipients/suppressed/failed + delivered/opened/clicked/bounced
- [`mail_broadcast_update`](/reference/mcp-tools/mail_broadcast_update) — Edit a draft broadcast
- [`mail_contact_create`](/reference/mcp-tools/mail_contact_create) — Add a contact to an audience
- [`mail_contact_delete`](/reference/mcp-tools/mail_contact_delete) — Delete a contact from an audience
- [`mail_contact_get`](/reference/mcp-tools/mail_contact_get) — Get a single contact by id
- [`mail_contact_list`](/reference/mcp-tools/mail_contact_list) — List contacts in an audience
- [`mail_contact_update`](/reference/mcp-tools/mail_contact_update) — Update a contact (properties or unsubscribed flag)
- [`mail_domain_allowed_list`](/reference/mcp-tools/mail_domain_allowed_list) — List apex domains this product may register sending domains under (from governance)
- [`mail_domain_create`](/reference/mcp-tools/mail_domain_create) — Register a sending domain (SES Easy DKIM) and return the DNS records to publish
- [`mail_domain_delete`](/reference/mcp-tools/mail_domain_delete) — Delete a sending domain and its SES identity
- [`mail_domain_get`](/reference/mcp-tools/mail_domain_get) — Get a sending domain with its DNS records and per-record verification status
- [`mail_domain_list`](/reference/mcp-tools/mail_domain_list) — List sending domains for the current product
- [`mail_domain_update`](/reference/mcp-tools/mail_domain_update) — Update tracking / TLS / return-path config for a domain
- [`mail_domain_verify`](/reference/mcp-tools/mail_domain_verify) — Re-check a domain's DNS + SES verification immediately
- [`mail_email_cancel`](/reference/mcp-tools/mail_email_cancel) — Cancel a scheduled email
- [`mail_email_get`](/reference/mcp-tools/mail_email_get) — Retrieve an email by id, with its last event
- [`mail_email_send`](/reference/mcp-tools/mail_email_send) — Send a single email
- [`mail_email_send_batch`](/reference/mcp-tools/mail_email_send_batch) — Send up to 100 emails in one atomic batch
- [`mail_email_update`](/reference/mcp-tools/mail_email_update) — Reschedule a scheduled email to a new ISO-8601 instant
- [`mail_reputation_get`](/reference/mcp-tools/mail_reputation_get) — Current sender-reputation status for the product: hard-bounce and complaint rates over the rolling window, the sample volume, whether sends are throttled, the tripped metric, and the configured thresholds
- [`mail_stats_get`](/reference/mcp-tools/mail_stats_get) — Dashboard aggregation for the product over 7d|30d|90d: sent/delivered/bounced/complained totals, period-over-period deltas, daily volume buckets, and deliverability percentages
- [`mail_suppression_add`](/reference/mcp-tools/mail_suppression_add) — Manually suppress a recipient address (reason is always "manual"); idempotent
- [`mail_suppression_list`](/reference/mcp-tools/mail_suppression_list) — List suppressed recipient addresses for the current product (paginated, filter by reason or address substring)
- [`mail_suppression_remove`](/reference/mcp-tools/mail_suppression_remove) — Remove an address from the suppression list; idempotent (returns whether a row existed)
- [`mail_template_create`](/reference/mcp-tools/mail_template_create) — Create a draft email template with typed \{\{ variable }} placeholders
- [`mail_template_delete`](/reference/mcp-tools/mail_template_delete) — Delete a template
- [`mail_template_get`](/reference/mcp-tools/mail_template_get) — Get a single email template by id
- [`mail_template_list`](/reference/mcp-tools/mail_template_list) — List email templates for the current product
- [`mail_template_publish`](/reference/mcp-tools/mail_template_publish) — Publish a template (draft -> published)
- [`mail_template_update`](/reference/mcp-tools/mail_template_update) — Update a draft template (published templates are not editable)
- [`mail_usage_get`](/reference/mcp-tools/mail_usage_get) — Current free-tier usage for the product: emails sent this day and month with used/limit/remaining, the hard cap, a blocked flag, and the point-in-time contacts count
- [`mail_webhook_create`](/reference/mcp-tools/mail_webhook_create) — Register a webhook endpoint for the current product. Returns the signing secret ONCE.
- [`mail_webhook_delete`](/reference/mcp-tools/mail_webhook_delete) — Delete a webhook endpoint.
- [`mail_webhook_deliveries_list`](/reference/mcp-tools/mail_webhook_deliveries_list) — List recent delivery attempts for a webhook endpoint (status, attempts, last error).
- [`mail_webhook_get`](/reference/mcp-tools/mail_webhook_get) — Get a webhook endpoint by id (secret omitted).
- [`mail_webhook_list`](/reference/mcp-tools/mail_webhook_list) — List webhook endpoints for the current product (secret omitted).
- [`mail_webhook_update`](/reference/mcp-tools/mail_webhook_update) — Update a webhook endpoint (url, enabled\_events, description, or enable/disable).

### Organization

78 tools.

- [`organization_auth_me`](/reference/mcp-tools/organization_auth_me) — Returns the current identity: identity ID, email, and identity type (e.g. "service" for a service token, which has no email)
- [`organization_billing_budgets_get`](/reference/mcp-tools/organization_billing_budgets_get) — Reads the active product's billing budget: the spending ceiling, the per-product caps and the current consumption against them.
- [`organization_billing_budgets_set`](/reference/mcp-tools/organization_billing_budgets_set) — Sets the spending ceiling of the active product's budget, in integer minor units of the currency the organization's ledger already pinned. Zero means 'spend nothing beyond what is included'.
- [`organization_billing_caps_clear`](/reference/mcp-tools/organization_billing_caps_clear) — Clears the spending cap of one product in the caller’s organization, leaving only the organization-wide ceiling. The product must belong to the same organization as the active product.
- [`organization_billing_caps_set`](/reference/mcp-tools/organization_billing_caps_set) — Sets the spending cap of one product in the caller’s organization, in integer minor units. The product must belong to the same organization as the active product; any other is refused.
- [`organization_bindings_list`](/reference/mcp-tools/organization_bindings_list) — Lists the extension bindings attached to a domain in a product
- [`organization_clickup_install`](/reference/mcp-tools/organization_clickup_install) — Starts the ClickUp OAuth connect flow for a product and returns the install URL
- [`organization_clickup_list-installations`](/reference/mcp-tools/organization_clickup_list-installations) — Lists the ClickUp installations connected to a product
- [`organization_cloudflare_install`](/reference/mcp-tools/organization_cloudflare_install) — Starts the Cloudflare OAuth connect flow for a product and returns the consent URL
- [`organization_connectors_approve-request`](/reference/mcp-tools/organization_connectors_approve-request) — Approves a connector access request, attaching the product (org owner/admin)
- [`organization_connectors_attach`](/reference/mcp-tools/organization_connectors_attach) — Attaches products to a connector (batch, idempotent; org owner/admin)
- [`organization_connectors_delete`](/reference/mcp-tools/organization_connectors_delete) — Deletes a connector org-wide: soft-delete, remove all attachments, tear down routing (org owner/admin)
- [`organization_connectors_deny-request`](/reference/mcp-tools/organization_connectors_deny-request) — Denies a connector access request (org owner/admin)
- [`organization_connectors_detach`](/reference/mcp-tools/organization_connectors_detach) — Detaches one product from a connector (org owner/admin). Last detach → dormant.
- [`organization_connectors_list`](/reference/mcp-tools/organization_connectors_list) — Lists active connectors in a product
- [`organization_connectors_list-attachments`](/reference/mcp-tools/organization_connectors_list-attachments) — Lists the products a connector is attached to (org owner/admin)
- [`organization_connectors_list-available`](/reference/mcp-tools/organization_connectors_list-available) — Lists org connectors not yet attached to a product, with this product's request status
- [`organization_connectors_list-org`](/reference/mcp-tools/organization_connectors_list-org) — Lists an organization's connectors with their product attachments (org owner/admin)
- [`organization_connectors_list-requests`](/reference/mcp-tools/organization_connectors_list-requests) — Lists connector access requests for an organization (org owner/admin)
- [`organization_connectors_remove`](/reference/mcp-tools/organization_connectors_remove) — Detaches the current product from a connector
- [`organization_connectors_request`](/reference/mcp-tools/organization_connectors_request) — Requests access to an org connector for a product (any product member)
- [`organization_create`](/reference/mcp-tools/organization_create) — Creates a new organization owned by the current user and sets it as the active organization for the session.
- [`organization_domains_add`](/reference/mcp-tools/organization_domains_add) — Adds a custom domain to a product. The domain always starts in external (self-managed DNS) mode; when the product has an active Cloudflare connector that can write DNS, the response carries a managedDns hint naming the connector and the tool that switches the domain to managed mode.
- [`organization_domains_get`](/reference/mcp-tools/organization_domains_get) — Gets a single custom domain in a product by id
- [`organization_domains_list`](/reference/mcp-tools/organization_domains_list) — Lists the custom domains configured in a product
- [`organization_domains_remove`](/reference/mcp-tools/organization_domains_remove) — Removes a custom domain from a product
- [`organization_domains_set-mode`](/reference/mcp-tools/organization_domains_set-mode) — Switches a custom domain between external (self-managed DNS) and managed mode. Managed mode requires providerConnectorId — the id of an active Cloudflare connector attached to the product — and hands the domain's records to the platform reconciler.
- [`organization_extensions_list-installed`](/reference/mcp-tools/organization_extensions_list-installed) — Lists extensions available to the current product
- [`organization_feedback_submit`](/reference/mcp-tools/organization_feedback_submit) — Submit product feedback — opens a GitHub issue in the Lessly feedback repo. Use when the user wants to report a bug, request a feature, or leave feedback about the platform.
- [`organization_gdrive_install`](/reference/mcp-tools/organization_gdrive_install) — Starts the Google Drive OAuth connect flow for a product and returns the consent URL
- [`organization_github_install`](/reference/mcp-tools/organization_github_install) — Starts the GitHub app installation flow for a product. When the product's organization already has GitHub connections, returns them so one can be reused (attached) instead of dead-ending on GitHub's already-installed settings page. `url` is always returned — connecting an additional, different GitHub org stays possible.
- [`organization_github_list-installations`](/reference/mcp-tools/organization_github_list-installations) — Lists the GitHub app installations connected to a product
- [`organization_googleads_install`](/reference/mcp-tools/organization_googleads_install) — Starts the Google Ads OAuth connect flow for an organization and returns the consent URL
- [`organization_list`](/reference/mcp-tools/organization_list) — Lists the organizations the current user belongs to (owned or via membership).
- [`organization_member_accept-invite`](/reference/mcp-tools/organization_member_accept-invite) — Accepts an organization invitation using the invitation token
- [`organization_member_invite`](/reference/mcp-tools/organization_member_invite) — Invites a user to an organization by email, optionally sharing products
- [`organization_member_list`](/reference/mcp-tools/organization_member_list) — Lists the stored members of an organization with their roles and product grants
- [`organization_member_list-invitations`](/reference/mcp-tools/organization_member_list-invitations) — Lists invitations for an organization
- [`organization_member_list-product-access`](/reference/mcp-tools/organization_member_list-product-access) — Lists the products in an organization a member can access, with role, grant source, and expiry (management view; expired grants are shown with expiresAt).
- [`organization_member_remove`](/reference/mcp-tools/organization_member_remove) — Removes a member from an organization
- [`organization_member_revoke-invitation`](/reference/mcp-tools/organization_member_revoke-invitation) — Revokes a pending organization invitation
- [`organization_member_set-role`](/reference/mcp-tools/organization_member_set-role) — Changes an organization member's role (owner only)
- [`organization_member_share-product`](/reference/mcp-tools/organization_member_share-product) — Grants an organization member explicit access to a product
- [`organization_member_unshare-product`](/reference/mcp-tools/organization_member_unshare-product) — Revokes an explicit product share from an organization member
- [`organization_members_assign-role`](/reference/mcp-tools/organization_members_assign-role) — Assigns a role to a member of a product
- [`organization_permission_catalog`](/reference/mcp-tools/organization_permission_catalog) — Lists the full permission catalog (key, display\_name, group, level, scope) derived from @McpTool handlers. Only scope="product" entries are grantable in role/point-rights pickers; scope="user" entries are informational.
- [`organization_product_create`](/reference/mcp-tools/organization_product_create) — Creates a new product with the given name
- [`organization_product_list`](/reference/mcp-tools/organization_product_list) — Lists all products the current user has access to
- [`organization_product_list-access`](/reference/mcp-tools/organization_product_list-access) — Lists who can work in a product: the explicit grants and their roles, the organization owners and admins who inherit full access (read-only here), the organization members holding no access yet, and the organization's named roles a grant can be handed at. `canManage` states whether the caller may change any of it.
- [`organization_product_list-members`](/reference/mcp-tools/organization_product_list-members) — Lists all active members of a product with their roles
- [`organization_product_list-roles`](/reference/mcp-tools/organization_product_list-roles) — Lists the roles assignable to a product member (system templates + product custom roles)
- [`organization_product_revoke-access`](/reference/mcp-tools/organization_product_revoke-access) — Revokes a product grant from an organization member. Access inherited from an organization role is lifted in the organization, and the product owner is removed by transferring ownership.
- [`organization_product_select`](/reference/mcp-tools/organization_product_select) — Sets the active product for the current session and reconciles the active organization to that product's organization. Session state: the selection persists for the whole MCP session and every product-scoped tool call resolves against it until changed. Without an explicit selection the session resolves an active product implicitly, so results can belong to a product other than the intended one.
- [`organization_product_set-access`](/reference/mcp-tools/organization_product_set-access) — Grants an organization member access to a product, or changes the role they already hold, at a standard role (admin, member, viewer) or one of the organization's named roles. The target must already be an active member of the product's organization; owner is transfer-only, and access inherited from an organization role is changed in the organization.
- [`organization_product_update`](/reference/mcp-tools/organization_product_update) — Updates an existing product's name and/or description
- [`organization_public-keys_create`](/reference/mcp-tools/organization_public-keys_create) — Creates a public key for a product. The plaintext key is returned only in this response and cannot be retrieved again.
- [`organization_public-keys_list`](/reference/mcp-tools/organization_public-keys_list) — Lists a product's public keys. Never returns key material.
- [`organization_public-keys_revoke`](/reference/mcp-tools/organization_public-keys_revoke) — Revokes a public key. Idempotent; revocation is permanent.
- [`organization_public-keys_update-scope`](/reference/mcp-tools/organization_public-keys_update-scope) — Replaces the scope of an active public key.
- [`organization_public-routes_list`](/reference/mcp-tools/organization_public-routes_list) — Lists the public routes declared by the product's toolkits, with each route's access mode and public URL.
- [`organization_roles_create`](/reference/mcp-tools/organization_roles_create) — Creates a reusable organization role with allow/deny permission patterns (owner/admin)
- [`organization_roles_delete`](/reference/mcp-tools/organization_roles_delete) — Deletes an organization role (owner/admin). Already-materialized product grants are unaffected.
- [`organization_roles_get`](/reference/mcp-tools/organization_roles_get) — Gets a single organization role by id
- [`organization_roles_list`](/reference/mcp-tools/organization_roles_list) — Lists the reusable custom roles defined in an organization
- [`organization_roles_update`](/reference/mcp-tools/organization_roles_update) — Updates an organization role's name or allow/deny patterns (owner/admin)
- [`organization_security_mfa_enable`](/reference/mcp-tools/organization_security_mfa_enable) — Turns ON organization-wide multi-factor authentication (2FA) enforcement for an organization. Owner-only: only the owner of the organization may call it. This is deliberately one-way — disabling MFA enforcement is not available over MCP; use the organization security settings in the Product App instead. The policy is strictest-wins across all of a member’s organizations, so enabling it here forces MFA enrollment for every member of this organization at their next sign-in or token refresh.
- [`organization_select`](/reference/mcp-tools/organization_select) — Sets the active organization for the current session and returns the resolved active product. Session state: the switch also rewrites the session product selection — the current product survives only when it belongs to the new organization, otherwise the caller's first product in that organization is selected, or the selection is cleared when there is none.
- [`organization_support_thread_create`](/reference/mcp-tools/organization_support_thread_create) — Open a support thread on the caller's behalf — the body becomes the first message. Use when the user wants to contact Lessly support.
- [`organization_support_thread_get`](/reference/mcp-tools/organization_support_thread_get) — Read one of the caller's own support threads with its full conversation. A thread that belongs to somebody else is reported as not found.
- [`organization_support_thread_reply`](/reference/mcp-tools/organization_support_thread_reply) — Reply in one of the caller's own support threads. A thread that belongs to somebody else is reported as not found.
- [`organization_support_threads_list`](/reference/mcp-tools/organization_support_threads_list) — List the caller's own support threads, most recently updated first. Use when the user asks about their support requests or tickets.
- [`platform_auth_me`](/reference/mcp-tools/platform_auth_me) — DEPRECATED — use organization\_auth\_me. Returns the current identity: identity ID, email, and identity type (e.g. "service" for a service token, which has no email)
- [`platform_connectors_list`](/reference/mcp-tools/platform_connectors_list) — DEPRECATED — use organization\_connectors\_list. Lists active connectors in a product
- [`platform_extensions_list-installed`](/reference/mcp-tools/platform_extensions_list-installed) — DEPRECATED — use organization\_extensions\_list-installed. Lists extensions available to the current product
- [`platform_product_create`](/reference/mcp-tools/platform_product_create) — DEPRECATED — use organization\_product\_create. Creates a new product with the given name
- [`platform_product_list`](/reference/mcp-tools/platform_product_list) — DEPRECATED — use organization\_product\_list. Lists all products the current user has access to
- [`platform_product_list-members`](/reference/mcp-tools/platform_product_list-members) — DEPRECATED — use organization\_product\_list-members. Lists all active members of a product with their roles
- [`platform_product_select`](/reference/mcp-tools/platform_product_select) — DEPRECATED — use organization\_product\_select. Sets the active product for the current session and reconciles the active organization to that product's organization. Session state: the selection persists for the whole MCP session and every product-scoped tool call resolves against it until changed. Without an explicit selection the session resolves an active product implicitly, so results can belong to a product other than the intended one.

### Realtime

28 tools.

- [`realtime_archive_export`](/reference/mcp-tools/realtime_archive_export) — Start an async NDJSON export of a channel's archived history to the product bucket. Returns an export id; poll realtime\_archive\_export\_status until done.
- [`realtime_archive_export_status`](/reference/mcp-tools/realtime_archive_export_status) — Check an archive export: status, and the NDJSON blob reference once done
- [`realtime_archive_get`](/reference/mcp-tools/realtime_archive_get) — Read a channel's durably archived history from Postgres (survives the Redis hot window). Offset-paginated: pass the returned next\_offset as after\_offset for the next page.
- [`realtime_grant_create`](/reference/mcp-tools/realtime_grant_create) — Grant a subject (identity id or "\*" for all identities) operations on channels matching a pattern; "\*" in a pattern matches exactly one segment
- [`realtime_grant_list`](/reference/mcp-tools/realtime_grant_list) — List realtime channel grants for this product, optionally filtered by subject
- [`realtime_grant_revoke`](/reference/mcp-tools/realtime_grant_revoke) — Revoke a realtime channel grant by id
- [`realtime_history_get`](/reference/mcp-tools/realtime_history_get) — Read message history of a realtime channel: either a cursor (offset + epoch, replays strictly after the offset; recovered:false on epoch mismatch or aged-out entries) or a window (last\_n / last\_ms). Conceptually requires the `history` capability; in Phase 1 this surface is Identity-authenticated management access.
- [`realtime_messages_publish`](/reference/mcp-tools/realtime_messages_publish) — Publish a JSON message to a realtime channel of the current product
- [`realtime_namespace_create`](/reference/mcp-tools/realtime_namespace_create) — Register a realtime namespace (the part of a channel name before the first colon) with its policy: visibility, presence, client events, history, encryption, identified-only
- [`realtime_namespace_delete`](/reference/mcp-tools/realtime_namespace_delete) — Delete a realtime namespace by name (grants on it stop resolving)
- [`realtime_namespace_get`](/reference/mcp-tools/realtime_namespace_get) — Get a realtime namespace and its policy by name
- [`realtime_namespace_list`](/reference/mcp-tools/realtime_namespace_list) — List all realtime namespaces registered for this product
- [`realtime_namespace_update`](/reference/mcp-tools/realtime_namespace_update) — Update the policy of a realtime namespace
- [`realtime_presence_enter`](/reference/mcp-tools/realtime_presence_enter) — Enter presence on a realtime channel; upserts the caller (or member\_id) into the roster
- [`realtime_presence_get`](/reference/mcp-tools/realtime_presence_get) — Get the current presence roster for a channel. Roster is deduplicated by identity (connections counts live sockets); a per-connection view is deferred — the store is identity-keyed.
- [`realtime_presence_leave`](/reference/mcp-tools/realtime_presence_leave) — Leave presence on a realtime channel, removing the caller (or member\_id) from the roster
- [`realtime_presence_stats`](/reference/mcp-tools/realtime_presence_stats) — Get the presence member count for a channel
- [`realtime_presence_update`](/reference/mcp-tools/realtime_presence_update) — Update a presence member's info and/or refresh its TTL
- [`realtime_public_access_status`](/reference/mcp-tools/realtime_public_access_status) — Check whether this product has a public key configured — an onboarding hint for the portal, never an authorization decision
- [`realtime_status_get`](/reference/mcp-tools/realtime_status_get) — Get realtime service status: Redis fan-out connectivity, token signing key presence, gateway URL
- [`realtime_tokens_create`](/reference/mcp-tools/realtime_tokens_create) — Mint a short-lived capability token (JWT) carrying the capabilities the identity has via namespace policy and grants (optionally filtered to the given channels), plus the gateway WebSocket URL to connect to
- [`realtime_webhook_create`](/reference/mcp-tools/realtime_webhook_create) — Register a client webhook: lifecycle notifications (channel occupied/vacated, presence member added/removed) are POSTed to the URL signed with HMAC-SHA256. Returns the full signing secret ONCE.
- [`realtime_webhook_delete`](/reference/mcp-tools/realtime_webhook_delete) — Delete a client webhook (its secrets and delivery log go with it)
- [`realtime_webhook_deliveries_list`](/reference/mcp-tools/realtime_webhook_deliveries_list) — List recent delivery attempts of a webhook (status, attempts, response code)
- [`realtime_webhook_get`](/reference/mcp-tools/realtime_webhook_get) — Get a client webhook by id (secret metadata only, never the secret)
- [`realtime_webhook_list`](/reference/mcp-tools/realtime_webhook_list) — List all client webhooks registered for this product (secret metadata only)
- [`realtime_webhook_secret_rotate`](/reference/mcp-tools/realtime_webhook_secret_rotate) — Rotate the webhook signing secret with an overlap window: the new secret signs immediately (returned ONCE), the previous one keeps verifying until its grace expiry
- [`realtime_webhook_update`](/reference/mcp-tools/realtime_webhook_update) — Update a client webhook: url, event filter, description, active flag

### Support

44 tools.

- [`support_agent_create`](/reference/mcp-tools/support_agent_create) — Create a support agent profile for this product. Binding a Lessly identity is optional and the value is stored verbatim — nothing resolves it or checks that the user exists. An unbound profile is a bot or the client's own backend, and it replies exactly like a human agent does
- [`support_agent_get`](/reference/mcp-tools/support_agent_get) — Get one support agent by id, deactivated ones included. An agent belonging to another product is reported as not found. Through the public edge the profile comes back without lesslyUserId — the binding never leaves the authenticated plane
- [`support_agent_list`](/reference/mcp-tools/support_agent_list) — List this product support agents by display name. Deactivated agents are hidden unless asked for: they keep every message they wrote but cannot take new threads. Through the public edge the profiles come back without lesslyUserId — the binding never leaves the authenticated plane
- [`support_agent_update`](/reference/mcp-tools/support_agent_update) — Edit an agent profile. Pass null to clear the title, the avatar or the Lessly binding; omit a field to leave it alone. Setting isActive to false deactivates the agent: it keeps every message it wrote and every thread it already sits on, but cannot be assigned to another one
- [`support_attachment_create`](/reference/mcp-tools/support_attachment_create) — Reserve a file on a support thread and get a short-lived signed URL to upload it to. The bytes never pass through this API: PUT them to the returned uploadUrl with the same Content-Type, then call support\_attachment\_finalize. Until finalized the attachment is pending — it cannot be attached to a message and is invisible in message output. A thread belonging to another product is reported as not found
- [`support_attachment_finalize`](/reference/mcp-tools/support_attachment_finalize) — Confirm that an upload landed. Storage is asked whether the object exists and how large it is; if it is not there the call is refused and the attachment stays pending. On success the attachment becomes uploaded — it can now be named in support\_message\_create and carries a download URL. Calling it again on an uploaded attachment is safe and simply returns a fresh download URL
- [`support_label_create`](/reference/mcp-tools/support_label_create) — Add a label to this product label dictionary. A label is a free-form tag: nothing automates off it and a thread may carry any number of them. Names are unique per product
- [`support_label_list`](/reference/mcp-tools/support_label_list) — List this product label dictionary by name. A product that has invented no tags yet gets an empty list — unlike statuses, there is nothing to seed
- [`support_message_create`](/reference/mcp-tools/support_message_create) — Post a message into a support thread. A message has exactly one author: either an opaque external identifier from the client's own user base, or a support agent — never both and never neither. Direction, authorship and visibility are independent: an internal note may be inbound or outbound. Posting a message moves the parent thread's last reply timestamp. A message may carry files: create and finalize them first, then name them in attachmentIds. Through the public edge an agent author is accepted only if that agent carries no Lessly binding — a bot or the calling backend; an agent bound to a Lessly identity may author only from a signed-in session
- [`support_message_list`](/reference/mcp-tools/support_message_list) — List messages oldest first — the conversation reads forward. Name a threadId to read one thread, or omit it to read every thread of this product, which is how a client catches up on what it missed: pass since with the timestamp of the last message it has, then follow nextCursor until it comes back null. Paging is stable across messages that share a timestamp, so a walk neither skips nor repeats one. Filter by direction and by visibility; omit visibility to get public messages and internal notes together. A thread belonging to another product is reported as not found
- [`support_response_escalate`](/reference/mcp-tools/support_response_escalate) — Turn a survey response into a feedback thread so a person can follow up. The thread opens on the product’s default open status, titled with the survey’s name, authored by the same external respondent, carrying the response metadata plus surveyResponseId, and rated with the response score when it fits 0..10. No message is written — the answers stay on the response, and neither the end user nor an agent typed anything. A response that was already escalated is refused with a conflict naming the thread it went to
- [`support_response_get`](/reference/mcp-tools/support_response_get) — Get one survey response by id, with its answers exactly as they were submitted. A response belonging to another product is reported as not found
- [`support_response_list`](/reference/mcp-tools/support_response_list) — List the responses of ONE survey, newest first — surveyId is required, because a page mixing two surveys would carry answers keyed by two different question sets. Filters: score range (scoreMin/scoreMax, inclusive — a response with no score matches neither bound), a creation window (from/to), completed, plus pagination
- [`support_rule_create`](/reference/mcp-tools/support_rule_create) — Write a delivery rule: where a survey should be shown (a URL match), on which devices, when (immediately, after a delay, or on the client’s own event) and how often. Nothing here runs on this side — the rule is configuration a client’s own runtime reads back through the public edge and acts on. A rule reaches that edge only while its survey is published, so a rule may be written against a draft and simply waits
- [`support_rule_delete`](/reference/mcp-tools/support_rule_delete) — Delete a delivery rule for good. Unlike a survey, a rule is not archived — it has no responses behind it and nothing outlives it, so the row is removed and cannot be recovered. The survey it targeted is untouched. To stop delivery reversibly, set enabled to false instead
- [`support_rule_get`](/reference/mcp-tools/support_rule_get) — Get one delivery rule by id, with its whole configuration. A rule belonging to another product is reported as not found
- [`support_rule_list`](/reference/mcp-tools/support_rule_list) — List this product’s delivery rules, newest first, optionally narrowed to one survey, to the live or switched-off ones, or to the rules that apply to a given page URL and device. This is the same answer a client’s runtime fetches through the public edge, where a URL is required and only live rules on published surveys are visible
- [`support_rule_update`](/reference/mcp-tools/support_rule_update) — Edit a delivery rule: its URL match, device, trigger, frequency, conditions, or whether it is live at all. Every value replaces the old one whole rather than merging into it. The survey is not editable — a rule is the targeting OF one survey, and retargeting it silently would change what every matching page shows; delete it and write the one you meant. Switching a rule off is the quiet way to stop delivering without touching the survey
- [`support_status_archive`](/reference/mcp-tools/support_status_archive) — Retire a status. There is no way to delete one: every thread on it moves to the target status in the same transaction, so no thread is ever left on an archived status. The target must be a different, live status of this product
- [`support_status_create`](/reference/mcp-tools/support_status_create) — Add a status to this product status dictionary. The name is what people see; the category is what automation and reporting read, and it cannot change once threads sit on the status
- [`support_status_list`](/reference/mcp-tools/support_status_list) — List this product status dictionary in display order. A product that never opened settings gets the four defaults seeded on the first call. Archived statuses are hidden unless asked for
- [`support_status_update`](/reference/mcp-tools/support_status_update) — Rename, recolour or reorder a status. The category may only change while no thread references the status: changing it later would rewrite the history of every metric derived from it. A status belonging to another product is reported as not found
- [`support_survey_archive`](/reference/mcp-tools/support_survey_archive) — Switch a survey off for good, from either draft or published. Archiving is terminal — there is no way back in v2 — and it deletes nothing: every response already collected stays readable
- [`support_survey_create`](/reference/mcp-tools/support_survey_create) — Open a new survey. It starts as a draft — editable and not yet answerable — whatever questions travel with it. There is no way to create one already published: publishing runs the structure validator, and a create that skipped it would be a second way in
- [`support_survey_get`](/reference/mcp-tools/support_survey_get) — Get one survey by id, with its whole question set. A survey belonging to another product is reported as not found. Through the public edge only a PUBLISHED survey is readable — a draft or an archived one is reported as not found there
- [`support_survey_list`](/reference/mcp-tools/support_survey_list) — List this product’s surveys, newest first, optionally narrowed to one lifecycle state (draft, published or archived), with pagination
- [`support_survey_publish`](/reference/mcp-tools/support_survey_publish) — Publish a draft survey, which is what makes it answerable and what freezes its structure. Publishing validates the whole question set: it must be non-empty, question ids must be unique, radio and checkbox questions must offer options, a statement may not be required, and every skip must target a later question or the literal "end". A survey that is already published or archived is refused
- [`support_survey_stats`](/reference/mcp-tools/support_survey_stats) — Aggregate one survey’s responses over a time window: how many came in and how many reached the end, then per question — option counts for radio and checkbox, mean and distribution for rating and nps, an answered count for the rest. For the FIRST nps question it also returns promoters (9-10), passives (7-8), detractors (0-6) and the NPS score: percentage of promoters minus percentage of detractors over everyone who answered, rounded once. The window defaults to the last 30 days — omitting from does not mean "since the beginning"
- [`support_survey_unpublish`](/reference/mcp-tools/support_survey_unpublish) — Return a published survey to draft so it can be edited. It stops accepting responses immediately; the responses already collected are untouched. A survey that is not published is refused
- [`support_survey_update`](/reference/mcp-tools/support_survey_update) — Edit a survey’s name or question set. Only a draft is editable — publishing freezes the structure, because answers are keyed by question id and rewriting the questions under them would change what every collected response was answering. To edit a live survey, unpublish it first. questions replaces the whole set; pass an empty array to clear it
- [`support_thread_assign`](/reference/mcp-tools/support_thread_assign) — Put a support agent on a thread, or pass null to return it to the unassigned queue — clearing an assignment is an ordinary operation, not an error. An agent belonging to another product is reported as not found
- [`support_thread_create`](/reference/mcp-tools/support_thread_create) — Open a support thread on behalf of an external end user. The author is an opaque identifier from the client's own user base and is stored verbatim. The thread opens on the product's default open status; there is no status argument. An optional rating — an integer 0..10, both ends inclusive — may travel with it and is stored verbatim too; omit it for an unrated thread, because 0 is a real score at the bottom of the scale
- [`support_thread_get`](/reference/mcp-tools/support_thread_get) — Get one support thread by id, with its status joined in. A thread belonging to another product is reported as not found
- [`support_thread_list`](/reference/mcp-tools/support_thread_list) — List support threads for this product, newest first — by creation time by default, or by last modification with sort='updated'. Every filter lives here: type, status, status category, assignee, external author, creation window, rating range (ratingMin/ratingMax, inclusive — a thread nobody rated matches neither bound), plus pagination
- [`support_thread_status_set`](/reference/mcp-tools/support_thread_status_set) — Move a thread to a status. Any status may follow any other — there are no transition rules. The category is never a parameter: it comes from the status the thread lands on. A status belonging to another product is reported as not found, and an archived status is refused
- [`support_thread_update`](/reference/mcp-tools/support_thread_update) — Edit a thread: its title, its priority, its labels and its client-owned metadata. Moving a thread between statuses and putting an agent on it have their own tools and are not possible here. labelIds replaces the entire label set — pass an empty array to clear it, and a label belonging to another product is reported as not found
- [`support_webhook_create`](/reference/mcp-tools/support_webhook_create) — Register an HTTPS endpoint to receive Support events for this product, and mint its signing secret. The secret is returned here in clear and NOWHERE ELSE — exactly once, so store it now: it cannot be read back and can only be replaced by rotating it. Plain http:// endpoints are rejected
- [`support_webhook_delete`](/reference/mcp-tools/support_webhook_delete) — Remove a registered endpoint and the delivery history that points at it. To stop delivery without losing the registration, set its status to disabled instead
- [`support_webhook_deliveries_list`](/reference/mcp-tools/support_webhook_deliveries_list) — List webhook delivery attempts for this product, newest first. Filter by endpoint, by state (pending, delivered, failed), by event type or by the time the delivery was opened. Each row carries the exact JSON body that was sent, the last HTTP status and, while attempts remain, when the next one is due
- [`support_webhook_get`](/reference/mcp-tools/support_webhook_get) — Get one registered endpoint by id. The signing secret is not part of the answer. An endpoint belonging to another product is reported as not found
- [`support_webhook_list`](/reference/mcp-tools/support_webhook_list) — List the endpoints this product has registered, oldest first. Signing secrets are never included — only the short prefix that tells two endpoints apart
- [`support_webhook_redeliver`](/reference/mcp-tools/support_webhook_redeliver) — Send a past delivery to its endpoint again, with the original payload and the original idempotencyKey — a receiver that already processed it can recognise and ignore the repeat. The original delivery row is kept as history and a new one is opened for this attempt. If the endpoint has since been disabled or unsubscribed from the event, nothing is delivered
- [`support_webhook_rotate_secret`](/reference/mcp-tools/support_webhook_rotate_secret) — Replace the signing secret of an endpoint and return the new one in clear, exactly once. The old secret stops verifying immediately — there is no grace window, so update the receiver before rotating
- [`support_webhook_update`](/reference/mcp-tools/support_webhook_update) — Edit a registered endpoint: its url, the event types it subscribes to, its description or its status. Setting status to disabled keeps the registration and stops delivery. Omit a field to leave it alone; pass null to clear the description. The signing secret is not editable here — rotate it instead

### Tracking

36 tools.

- [`tracking_domains_create`](/reference/mcp-tools/tracking_domains_create) — Claim a first-party tracking host under a product domain
- [`tracking_domains_delete`](/reference/mcp-tools/tracking_domains_delete) — Release a tracking-host binding
- [`tracking_domains_get`](/reference/mcp-tools/tracking_domains_get) — Get one tracking-host binding and its status
- [`tracking_domains_list`](/reference/mcp-tools/tracking_domains_list) — List the product's custom domains and tracking-host bindings
- [`tracking_domains_verify`](/reference/mcp-tools/tracking_domains_verify) — Run an immediate liveness check for a pending binding
- [`tracking_event-names_archive`](/reference/mcp-tools/tracking_event-names_archive) — Archive an event name (hides it from dashboards only; ingestion and counts continue unchanged).
- [`tracking_event-names_list`](/reference/mcp-tools/tracking_event-names_list) — List the event-name catalog for the current product with counts, first/last seen, sampled prop keys, and status.
- [`tracking_event-names_unarchive`](/reference/mcp-tools/tracking_event-names_unarchive) — Unarchive an event name (restores its visibility in dashboards).
- [`tracking_googleads_connection_status`](/reference/mcp-tools/tracking_googleads_connection_status) — Google Ads connection status for the current product: whether a Google Ads account is connected and which account (loginCustomerId / customerId), or whether it still needs account selection or re-auth.
- [`tracking_googleads_conversion_actions`](/reference/mcp-tools/tracking_googleads_conversion_actions) — List the connected Google Ads account's conversion actions (resource, name, category, status) so you can map a tracked event to a Google conversion action with a per-rule value (net revenue or a fixed amount).
- [`tracking_googleads_feedback_config_get`](/reference/mcp-tools/tracking_googleads_feedback_config_get) — Get the Google Ads conversion-feedback config for the current product (enabled, mode, lookbackDays, event→conversion-action rules, accountCurrency — the connected account's currency, best-effort, null if unavailable — useful for defaulting a fixed-value rule's currency, and dynamicValueEvents — the revenue-eligible event-names that may use the Dynamic value source).
- [`tracking_googleads_feedback_config_set`](/reference/mcp-tools/tracking_googleads_feedback_config_set) — Set the Google Ads conversion-feedback config (enable/disable, mode, lookback, rules, enhancedConversions). enhancedConversions adds hashed email/phone as additive match keys alongside gclid. Returns the config plus safety guidance. Rules are validated against the account's conversion actions.
- [`tracking_googleads_feedback_run`](/reference/mcp-tools/tracking_googleads_feedback_run) — Manually run one conversion-feedback upload pass for the current product now (uploads newly-attributed conversions across all enabled rules since the last run). Useful for testing; the daily cron runs this automatically.
- [`tracking_googleads_feedback_status`](/reference/mcp-tools/tracking_googleads_feedback_status) — Google Ads conversion-feedback status for the current product: enabled/mode, rule count, cumulative uploaded/failed counts, last-run coverage (selected vs matched vs uploaded, plus noGclid so gclid-match coverage is visible), safety guidance, accountCurrency (the connected account's currency, best-effort, null if unavailable), and dynamicValueEvents (the revenue-eligible event-names that may use the Dynamic value source).
- [`tracking_googleads_feedback_uploads`](/reference/mcp-tools/tracking_googleads_feedback_uploads) — List the most recent Google Ads offline-conversion uploads for the current product (per-row ledger: conversionKey, gclid, conversionAction, conversionDatetime, valueMicros, currency, orderId, status, error, uploadedAt). Newest first. Query: limit (default 100, max 500).
- [`tracking_googleads_roas_report`](/reference/mcp-tools/tracking_googleads_roas_report) — Google Ads ROAS/CPA per campaign->ad\_group->ad joining frozen cost rollups with attributed revenue. Attributed ROAS/CPA at campaign level; cost + platform metrics at every level. Currency-isolated; never summed across currencies. Query: from,to (ISO, required), model (last\_click|first\_click), lookbackDays (1-365), domain?, customerId?.
- [`tracking_googleads_sync_now`](/reference/mcp-tools/tracking_googleads_sync_now) — Pull the current product's Google Ads campaign/ad-group/ad structure and daily spend/metrics into the reporting tables now (backfill window). Returns per-table row counts. Skips gracefully if the account is pending selection or needs re-auth.
- [`tracking_googleads_tracking_health`](/reference/mcp-tools/tracking_googleads_tracking_health) — Google Ads URL-tracking health for the current product over a date range: how many Google paid clicks arrived, how many carried our ValueTrack URL parameters (marker \_lt\_campaign) vs how many were UNTAGGED (template not installed / broken), the breakage rate, whether the template is verified live, first/last untagged times, sample offending landing URLs. Read-only; computed on the fly from stored events (no Google Ads API call). dataQuality describes how complete the figures above are and holds no metric of its own: dataQuality.cookielessPaidClicks is how many of the paid clicks arrived cookieless (the visitor declined consent) — counted INSIDE paidClicks, never added to it, because a cookieless paid click is a real click and belongs in the breakage denominator. It is broken out so breakageRate is not read as one homogeneous population. Clicks from sites running no consent banner at all are NOT counted as cookieless: nobody was ever asked there, which is not the same as being told no.
- [`tracking_googleads_us_vs_platform`](/reference/mcp-tools/tracking_googleads_us_vs_platform) — Per-campaign comparison: our attributed revenue/conversions vs Google-reported conversions and conversions\_value, within each account currency. Query: from,to (ISO, required), model, lookbackDays, domain?, customerId?.
- [`tracking_identity_health`](/reference/mcp-tools/tracking_identity_health) — Identity match-rate metric: share of identified profiles and share with an ad touchpoint (proxy = has >=1 click\_id identifier).
- [`tracking_install-domains_create`](/reference/mcp-tools/tracking_install-domains_create) — Register a domain in the install-verification checklist for the current product
- [`tracking_install-domains_delete`](/reference/mcp-tools/tracking_install-domains_delete) — Remove a domain from the install-verification checklist for the current product
- [`tracking_install-domains_list`](/reference/mcp-tools/tracking_install-domains_list) — List install-verification domains for the current product with per-domain "script seen" status, plus auto-discovered domains sending events
- [`tracking_link-domains_create`](/reference/mcp-tools/tracking_link-domains_create) — Add a root domain to the cross-domain linking group for the current product
- [`tracking_link-domains_delete`](/reference/mcp-tools/tracking_link-domains_delete) — Remove a root domain from the cross-domain linking group for the current product
- [`tracking_link-domains_list`](/reference/mcp-tools/tracking_link-domains_list) — List the cross-domain linking group (domains whose links the tracking script decorates with the visitor id) for the current product
- [`tracking_live-events_list`](/reference/mcp-tools/tracking_live-events_list) — List the most recent tracking events for the current product (live visitor stream). Cursor-paged for incremental polling.
- [`tracking_profiles_delete`](/reference/mcp-tools/tracking_profiles_delete) — GDPR erasure: permanently delete a person and their events from Postgres and record an erasure request. Archived events are flagged as a deletion gap.
- [`tracking_profiles_export`](/reference/mcp-tools/tracking_profiles_export) — Export a person as JSON: profile + identity signals + full journey (capped at 50k events; truncated flag set if exceeded).
- [`tracking_profiles_get`](/reference/mcp-tools/tracking_profiles_get) — Get one person: profile, identity signals, and their chronological journey (query-time join over the person's anonymous ids).
- [`tracking_profiles_list`](/reference/mcp-tools/tracking_profiles_list) — List/search people (profiles) for the product; filter by email and status, cursor-paged.
- [`tracking_reports_attributed_journey`](/reference/mcp-tools/tracking_reports_attributed_journey) — One person's journey with, for their originating conversion, the attribution decision explained (winning touchpoint + why) under the requested model and lookback window. Attribution is never locked in — changing model/window re-reads the same history.
- [`tracking_reports_event_volume`](/reference/mcp-tools/tracking_reports_event_volume) — Traffic for a date range as TWO headline figures plus a data-quality block. totalEvents counts events. visitorsDeduplicatedPerUtcDay counts PEOPLE, over both populations at once: visitors who consented are deduplicated by their anonymous\_id, visitors who declined by a server-derived daily\_visitor\_key. It is one COUNT DISTINCT, not a sum of two figures, and there is no second set of numbers to add to it. READ THE FIELD NAME LITERALLY — the caveat is the metric, not a footnote. The daily key is rebuilt from a salt that is destroyed every UTC midnight, so the same declining visitor gets a DIFFERENT key tomorrow and is counted again. Consequences you must state whenever you report this number over more than one day: (1) weekly and monthly unique-visitor counts are OVERSTATED, and the longer the window the worse it gets — a visitor who comes back on ten days counts as ten people; (2) returning-visitor, retention, frequency and loyalty analysis DO NOT WORK on this traffic at all, because the identity that would link the days was never created. This is not a defect awaiting a fix and no post-processing recovers the real figure; Plausible, PostHog and Matomo concede the same limitation about their own daily keys. dataQuality.visitorsOverstated tells you whether it bites for the window you asked for (true when the range spans more than one UTC day and there is declining traffic in it), and dataQuality.utcDaysInRange is how many UTC days the range spans. For an exact people count, ask for a single UTC day. dataQuality describes how COMPLETE the two headline figures are and contains no metric of its own — never present anything inside it as a headline number and never add it to anything. cookielessShare and noBannerShare are the fractions of events that arrived from declining visitors and from sites running no consent banner. consentGrantedEvents + cookielessEvents + noBannerEvents = totalEvents. noBannerEvents (nobody was ever asked) is deliberately kept apart from cookielessEvents (the visitor declined); merging them would tell a customer people refused when nobody was asked. identifiedEvents is a DIFFERENT cut — events carrying an anonymous\_id — that overlaps the consent buckets and is NOT the complement of cookielessEvents; never add those two together.
- [`tracking_reports_revenue_by_source`](/reference/mcp-tools/tracking_reports_revenue_by_source) — Revenue attributed by channel + UTM breakdown for a date range, under a chosen attribution model and lookback window. Includes a distinct unattributed row, totals, and a count-based match rate. Revenue is per-currency (never summed across currencies); refunds are netted explicitly.
- [`tracking_reports_source_people`](/reference/mcp-tools/tracking_reports_source_people) — List the people (profiles) behind one channel / UTM row from the revenue-by-source report, under the same model + window. Keyset-paginated; each person carries their attributed lifetime revenue per currency.
- [`tracking_snippets_get`](/reference/mcp-tools/tracking_snippets_get) — Get the tracking snippet for the caller's current product. Install it unconditionally. Do NOT wrap it in a consent gate and do NOT load it only after consent is granted: the tracker reads the visitor consent decision itself and switches to a cookieless mode that writes no cookies and sends no identifiers when statistics consent is declined or not yet given. Gating this tag makes declining and undecided visitors invisible entirely — the failure this behaviour exists to prevent.

### Users

42 tools.

- [`users_apikeys_create`](/reference/mcp-tools/users_apikeys_create) — Issue an API key for this product. type='server' mints a secret backend key (usk\_…) returned EXACTLY ONCE — it authenticates the code-exchange leg and is stored only as a hash, so a lost key must be replaced, never recovered. type='publishable' mints a non-secret browser key (upk\_…) that only names this product and stays readable afterwards.
- [`users_apikeys_list`](/reference/mcp-tools/users_apikeys_list) — List this product's API keys, newest first — id, label, type, visible prefix and revocation state. A server key's secret is never here; a publishable key's full value is, because it is not a secret.
- [`users_apikeys_revoke`](/reference/mcp-tools/users_apikeys_revoke) — Revoke an API key immediately. A revoked server key stops authenticating code exchanges on the next request; there is no grace period and no un-revoke.
- [`users_audit_list`](/reference/mcp-tools/users_audit_list) — Read this product's audit log, newest first. Every management-plane mutation writes one entry (user.created, user.updated, user.deleted, user.banned, user.unbanned) with the actor, target and timestamp. Filter by action, target and time range; paginate with the opaque `nextCursor`.
- [`users_config_get`](/reference/mcp-tools/users_config_get) — Read this product's end-user auth configuration (signup mode, password policy, session lifetime). Returns the defaults when nothing has been configured yet.
- [`users_config_upsert`](/reference/mcp-tools/users_config_upsert) — Create or update this product's end-user auth configuration. Only the fields you pass change; the rest keep their current values. Rejected while the product is paused (archived or blocked by the platform).
- [`users_factors_list`](/reference/mcp-tools/users_factors_list) — List the MFA factors an end user has enrolled: `totp` (an authenticator app) and `backup_codes` (single-use recovery codes), each with its status (`unverified` until enrollment was confirmed — an unverified factor gates NOTHING), when it was created and confirmed, and when it was last used. Backup codes also report `remaining`, the number still unspent; a user at 0 can no longer use that factor and should regenerate. NO SECRET IS EVER RETURNED — not the TOTP secret, not a backup code, not a digest of one. A user with no factors returns an empty list, which also means their sign-in completes at `aal1`.
- [`users_factors_reset`](/reference/mcp-tools/users_factors_reset) — OPERATOR RESET of an end user's MFA, for the case the normal recovery cannot serve: the user lost their authenticator AND their backup codes. This does NOT remove anything now. It SCHEDULES the removal behind this product's mandatory delay (config `mfa.resetDelayHours`, default 72) and immediately emails the user's primary address an abort link; if that mailbox is alive and its owner clicks, nothing happens. When the delay elapses, EVERY factor is deleted, every backup code with it, and EVERY SESSION of that user is revoked (a session that reached `aal2` must not outlive the factor that earned it) — after which the user signs in with their first factor alone and enrolls again. Every step is audited (`factor.reset_scheduled` / `_cancelled` / `_applied`) with the `reason` you pass, so do the identity proofing FIRST and write down what it was: this tool is a supervised account takeover, and the trail is what makes it reviewable.
- [`users_keys_list`](/reference/mcp-tools/users_keys_list) — List this product's JWT signing keys, newest first: the key id (the `kid` a token header carries), its lifecycle state, and when it was created, retired and revoked. `current` signs; `retired` no longer signs but is STILL published in JWKS until `overlapExpiresAt`, so tokens it signed keep verifying; `standby` is the pre-generated successor and is not published; `revoked` was evicted from JWKS immediately. Key material — public or private — is never returned here.
- [`users_keys_revoke`](/reference/mcp-tools/users_keys_revoke) — THE KEY-COMPROMISE DRILL. Evict a signing key from the published JWKS IMMEDIATELY — no overlap, no grace — so every token it ever signed stops verifying at once, mint or promote a fresh signing key in its place, and (by default) sign every end user of this product out, because a token the attacker forged with the stolen key is indistinguishable from a real one. Pass `revokeSessions: false` only when you are certain no forged token was issued. Give a reason: it is the only account of the incident the audit log will keep. This is disruptive and irreversible — for routine rotation use users\_keys\_rotate.
- [`users_keys_rotate`](/reference/mcp-tools/users_keys_rotate) — Rotate this product's JWT signing key with ZERO verifier downtime. The standby key (generated now if there is none) becomes the signing key, and the old one is retired into an overlap window — BOTH key ids stay in the published JWKS until `overlapExpiresAt`, so every token signed before the rotation keeps verifying for the rest of its life and no verifier has to re-fetch anything to keep working. The overlap is the product's access-token TTL plus five minutes. After it elapses the old key is revoked automatically and stops verifying. Use users\_keys\_revoke instead if the key is COMPROMISED and must die now.
- [`users_ops_retention_get`](/reference/mcp-tools/users_ops_retention_get) — What this product keeps and for how long. Returns the EFFECTIVE retention windows (spent one-time tokens, expired flow attempts, expired sessions and their refresh tokens) next to the documented defaults, the separate waitlist-entry window, the single cron that performs every sweep, and — deliberately — the list of what is NEVER swept and why. For the waitlist it also answers the two questions a published retention promise raises: whether this product's window is WIDER than the 180 days Lessly published (`waitlistWiderThanPromised`, a flag rather than a refusal), and whether the job that honours it is actually running — `lastSweep` carries the last pass this replica performed, counting THIS product's erasures only, and is NULL when it has observed none — which is not the same as a pass that erased zero. The windows are GRACE PERIODS ON TOP OF EXPIRY, never lifetimes: every live read carries its own expiry predicate, so an unswept expired row is inert and a window of 0 shortens nothing. Change them with users\_config\_upsert `retention`.
- [`users_ops_slo_get`](/reference/mcp-tools/users_ops_slo_get) — This product's service-level objectives and how it is doing against them RIGHT NOW: sign-in success rate, refresh error rate and mail-send failure rate, each with the objective, the evaluation window, the sample floor below which it is not judged, and the `users/alert.raised` kind a breach fires. Also returns the raw current window (sign-ins, refreshes, detected token reuse, mail sends) and the product's own trailing sign-in failure baseline — the number the per-product anomaly signal compares a spike against. A `status` of `insufficient_data` is NOT health: it means the window is too quiet to judge. The numbers come from ONE replica's in-process window, so treat them as a spot check rather than a fleet-wide error budget.
- [`users_sessions_get`](/reference/mcp-tools/users_sessions_get) — Read one end-user session in full: its status, device metadata, both expiries, the assurance level and factors it was established with, why it was revoked if it was, and the operator behind it if it is an impersonated session.
- [`users_sessions_impersonate`](/reference/mcp-tools/users_sessions_impersonate) — Start an impersonated session as one user of this product — support access, hard-capped. Returns an access token that expires within 30 minutes and CANNOT be refreshed; there is no refresh token. While it is in use, every credential, factor, identifier and session mutation is refused, the user is emailed (unless the product turned that notice off), and the whole thing is recorded in the audit trail against you. Give a real reason: it goes into the audit row and into that email.
- [`users_sessions_list`](/reference/mcp-tools/users_sessions_list) — List the end-user sessions of one user of this product, newest first — one row per device, with its status, device metadata and both expiries (the sliding inactivity window and the hard time-box). Revoked and expired sessions are included so an operator can see what happened, not only what is live.
- [`users_sessions_revoke`](/reference/mcp-tools/users_sessions_revoke) — Revoke end-user sessions: pass `sessionId` to sign out one device, or `userId` to sign out every device of that user. Revocation is immediate in this toolkit's own checked verification; an access token already issued keeps verifying locally until it expires (≤10 minutes by default). Returns how many sessions this call actually revoked — a second call on the same target returns 0.
- [`users_stats_get`](/reference/mcp-tools/users_stats_get) — One snapshot of this product's auth deployment: directory users split by DERIVED status (active, waitlisted, banned, soft-deleted, GDPR-erased), sessions that are live right now, verified second factors, the sign-in success rate over `window`, and an abuse block — lockouts (with the MFA subset), failed sign-ins, detected refresh-token reuse and breached-password sightings. The populations are point-in-time; only the sign-in and abuse numbers honour `window`. A rising abuse block against a falling success rate is what credential stuffing looks like from here. `successRate` is null, not 0, when nothing was attempted.
- [`users_users_ban`](/reference/mcp-tools/users_users_ban) — Ban an end user by stamping `bannedAt`. NOTE: sessions do not exist yet — until Phase 2 lands auth flows, this is a flag on the record and nothing is revoked or refused by it. Idempotent: banning an already-banned user refreshes the stamp.
- [`users_users_create`](/reference/mcp-tools/users_users_create) — Create an end user of this product with at least one identifier (email). Optionally store a password HASH — this toolkit never accepts a plaintext password, and nothing verifies the credential until auth flows land in Phase 2. Only one VERIFIED copy of an email may exist per product; unverified duplicates are allowed.
- [`users_users_delete`](/reference/mcp-tools/users_users_delete) — Soft-delete an end user: the record is retained with `deletedAt` set and disappears from the default list. This is NOT GDPR erasure — no data is purged, and the user can still be fetched by id.
- [`users_users_erase`](/reference/mcp-tools/users_users_erase) — GDPR hard erasure (Art. 17) of one end user. IRREVERSIBLE and quite different from users\_users\_delete: the identifier and identity rows are DELETED, the profile fields nulled and all three metadata bags emptied. What survives is a tombstone — the user row with its id and `erasedAt` — so that every foreign reference and webhook consumer holding that id still resolves. The audit trail is KEPT but pseudonymized (the metadata of rows targeting this user is cleared), because a security log that erasure can rewrite is not a security log. The email is freed: registering it again creates a NEW user id. Emits `users/user.erased` so consumers purge their own copies. Idempotent — erasing an already-erased user returns the same tombstone and changes nothing.
- [`users_users_export`](/reference/mcp-tools/users_users_export) — Export the end users of this product as pages of full records (profile, identifiers, metadata bags), using the same filters as users\_users\_list. Password hashes are NEVER included — neither a PHC hash nor an imported foreign one. Exporting credentials is deferred to a later phase, behind explicit elevated approval; until that gating exists, a hash cannot leave this toolkit. Every call is AUDITED (action `users.export`, with the filter and the row count), so this is not a silent read: use it for migrations, backups and subject-access requests, not as a listing shortcut. Page through with `nextCursor`.
- [`users_users_get`](/reference/mcp-tools/users_users_get) — Fetch one end user of this product by id, including their identifiers and metadata bags. Soft-deleted users are still returned (with `deletedAt` set).
- [`users_users_import`](/reference/mcp-tools/users_users_import) — Bulk-import end users into this product, up to 500 rows per call — batch client-side beyond that. Hashes only: pass `password.phcHash` for an argon2id PHC string, or `password.foreignHash` + `foreignHashAlgo` (bcrypt/argon2/pbkdf2/scrypt) for a hash from the system you are migrating off. A foreign hash is stored INERT — nothing verifies it until sign-in lands in Phase 2, where it is checked once and rehashed — so set `requiresReset: true` on rows whose source hash you do not trust. IDEMPOTENT by canonical identifier: a row whose email already exists VERIFIED in this product is skipped, not duplicated, so re-running the same file is safe. Imported identifiers default to verified (unlike users\_users\_create) — pass `verified: false` per identifier for addresses the source system never confirmed. Returns a PER-ROW report (\{row, status, userId, reason}) plus counts: one malformed row never fails the batch. Emits ONE batch event (`users/user.imported`, with counts) rather than a per-user created event, and writes ONE audit row.
- [`users_users_invite`](/reference/mcp-tools/users_users_invite) — Invite somebody to this product by email. Creates the user immediately with an UNVERIFIED identifier and NO credential — they appear in users\_users\_list straight away but cannot sign in until they accept — then mails a one-time invite link. Accepting the link sets their first password and verifies the address; no session comes from the link itself. IDEMPOTENT by address: re-inviting returns the SAME user (`created: false`), and whether it re-mails is a cooldown decision, so pressing the button twice cannot flood a mailbox (`mailed: false` means the invite is live but no email went out this time). Refuses an address that already belongs to a signed-up user. Requires a verified sender in this product's mail toolkit (config `email.from`); without one nothing is sent and `mailed` is false.
- [`users_users_list`](/reference/mcp-tools/users_users_list) — List the end users of this product, newest first. Filter by an identifier/name substring and by status. Soft-deleted users are hidden unless `includeDeleted` is true. Paginate with the opaque `nextCursor`.
- [`users_users_set_primary_identifier`](/reference/mcp-tools/users_users_set_primary_identifier) — OPERATOR OVERRIDE of a user's primary email address, for the case the normal flow cannot serve: the old address is unreachable (dead mailbox, imported user), so the user cannot approve the change themselves. This does NOT swap the address now. It SCHEDULES the swap behind this product's mandatory delay (config `emailChange.overrideDelayHours`, default 72) and immediately emails the OLD address an abort link; if that mailbox is alive and its owner clicks, nothing happens. When the delay elapses the address is swapped, verified, and EVERY SESSION of that user is revoked. Every step is audited (`email_change.override_scheduled` / `_cancelled` / `_applied`) with the `reason` you pass, so do the identity proofing first and write down what it was. Use users\_users\_update for profile fields; this tool is only for the identity a user signs in with.
- [`users_users_unban`](/reference/mcp-tools/users_users_unban) — Lift a ban by clearing `bannedAt`. See users\_users\_ban: the flag has no enforcement until Phase 2. Idempotent.
- [`users_users_update`](/reference/mcp-tools/users_users_update) — Update an end user's profile, status flags and metadata bags. Only the fields you pass change. A metadata field REPLACES that whole bag — send the full object you want stored. Write matrix in this phase: the management plane writes all three bags (public: end-user readable and may flow into the JWT; private: management plane only; unsafe: end-user writable later and never authoritative for authorization).
- [`users_waitlist_erase`](/reference/mcp-tools/users_waitlist_erase) — GDPR-erase one waitlist signup: the entry with its attribution and consent proof is deleted and the directory row is hard-erased (the id survives as a tombstone, the PII does not). IRREVERSIBLE. Use it for a right-to-erasure request; routine cleanup of stale pending entries happens on its own through the retention sweep.
- [`users_waitlist_funnel`](/reference/mcp-tools/users_waitlist_funnel) — Count this product's waitlist by funnel stage. `pending` is people waiting, `unconfirmed` is double-opt-in signups whose address never confirmed (they are NEVER invited), `invited` have a live invite, `registered` accepted it and are now full users, `withdrawn` asked to be removed. One consistent snapshot, not five separate reads.
- [`users_waitlist_import`](/reference/mcp-tools/users_waitlist_import) — Import a LEGACY waitlist into this product. Each row becomes a directory user in state `waitlisted` (no credential — a waitlist signup has nothing to sign in with) plus a WaitlistEntry whose consent proof is stored VERBATIM: the policy version, the timestamp and the source the OLD system recorded, never the import time. Rides the Phase 1 bulk import, so it is IDEMPOTENT by canonical identifier — re-running the same file skips instead of duplicating — and reports PER ROW (\{row, status, userId, reason}) so one bad row never fails the batch. Addresses that already have an entry are skipped `already_on_list`; addresses on the suppression list (they withdrew) are skipped `suppressed` and are NOT resurrected. SENDS NO EMAIL: an import is a migration, not a signup gesture. Imported addresses land UNVERIFIED, and by default confirmed — pass `confirmed: false` for rows the source system never reached, which then count as `unconfirmed` and are never invited. Up to 500 rows per call.
- [`users_waitlist_invite`](/reference/mcp-tools/users_waitlist_invite) — Promote waitlisted users by sending them the STANDARD invite email — the same one-time invite link `users_users_invite` sends, so accepting it sets their first password, verifies their address and turns the entry into `registered`. Batched: pass up to 100 user ids. Entries that already registered, that belong to another product, or whose address is on the suppression list (they withdrew) are SKIPPED with a reason rather than mailed. Requires a verified sender in this product's mail toolkit (config `email.from`).
- [`users_waitlist_list`](/reference/mcp-tools/users_waitlist_list) — List this product's waitlist entries, newest first. Each row is a directory user in state `waitlisted` PLUS the feature-local funnel state: where the signup came from (referrer/UTM), the consent proof recorded for it, and its status. Filter by `status` to work one stage of the funnel, or by `confirmed: false` to find double-opt-in signups whose address never confirmed. Paginate with `cursor`.
- [`users_webhooks_create`](/reference/mcp-tools/users_webhooks_create) — Register an outbound webhook endpoint for this product. Deliveries are signed with the Standard Webhooks wire format (webhook-id / webhook-timestamp / webhook-signature). The signing secret is returned EXACTLY ONCE — it is derived, never stored, so a lost secret is rotated with users\_webhooks\_rotate\_secret, never recovered.
- [`users_webhooks_delete`](/reference/mcp-tools/users_webhooks_delete) — Delete a webhook endpoint, its signing secrets and its delivery log. Immediate and final; deliveries already in flight stop.
- [`users_webhooks_deliveries_list`](/reference/mcp-tools/users_webhooks_deliveries_list) — This endpoint's recent deliveries, newest first: event type and id, status (pending / succeeded / failed), attempt count, the last response status and the last error. This is where 'my webhook never arrived' is answered.
- [`users_webhooks_get`](/reference/mcp-tools/users_webhooks_get) — One webhook endpoint. Another product’s endpoint and one that never existed answer identically.
- [`users_webhooks_list`](/reference/mcp-tools/users_webhooks_list) — List this product's webhook endpoints, newest first — url, subscribed events, paused state and the visible prefix of the current signing secret. The secret itself is never here.
- [`users_webhooks_rotate_secret`](/reference/mcp-tools/users_webhooks_rotate_secret) — Mint a NEW signing secret for this endpoint and return it exactly once. The previous secret keeps verifying for 24 hours — both signatures ride the webhook-signature header — so a receiver can swap its copy without dropping a delivery.
- [`users_webhooks_update`](/reference/mcp-tools/users_webhooks_update) — Change a webhook endpoint: its url, its subscribed events, its description, or `active` to pause and resume delivery without losing the endpoint or its secret.

### Waitlist

7 tools.

- [`waitlist_config_get`](/reference/mcp-tools/waitlist_config_get) — Get the waitlist configuration (consent text, policy url, policy label, policy version, sender domain, invite template, invite subject) for the current product. Returns null if not configured yet.
- [`waitlist_config_upsert`](/reference/mcp-tools/waitlist_config_upsert) — Create or replace the waitlist configuration for the current product (full-document upsert). consent\_text is plain text (may contain a \{policy} placeholder); policy\_url/policy\_label render a structured policy link; invite\_subject is the invite email subject line. Stored as-is; content correctness is the controller responsibility.
- [`waitlist_embed_get`](/reference/mcp-tools/waitlist_embed_get) — Returns the waitlist embed \<script> tag for the current product.
- [`waitlist_invites_send`](/reference/mcp-tools/waitlist_invites_send) — Send invite emails to waitlist signups. Provide an explicit email list and/or a filter; set force=true to resend when a live invite already exists.
- [`waitlist_signups_erase`](/reference/mcp-tools/waitlist_signups_erase) — GDPR Art.17 erasure by email within the current product. Hard-deletes the signup and its invite tokens, reduces the consent-ledger rows to the post-erasure minimum (raw email replaced by a keyed hash), and adds the email to the do-not-contact suppression list. Idempotent. Returns counts of what was affected; never returns PII.
- [`waitlist_signups_funnel`](/reference/mcp-tools/waitlist_signups_funnel) — Funnel counts (signup, invited, registered) for the current product over a time window, plus non\_monotonic. Each stage is counted by its own transition timestamp, so a window can be non-monotonic (registered > signup) — transition events within the period, not a fixed cohort.
- [`waitlist_signups_list`](/reference/mcp-tools/waitlist_signups_list) — List waitlist signups for the current product. Supports status filtering, keyset pagination, and field selection.
