{
  "version": "2026-09-08",
  "tools": [
    {
      "name": "deployment_service_create",
      "summary": "Create a service inside an environment.",
      "description": "Create a service in an existing environment from a git branch, a container image, or a static build. Requires product-scoped write access. Choose persistent mode for a running service or scheduled mode for a job; mode cannot change after creation. Returns: `{ id, environmentId, name, slug, source, ... }` — a service object, not a deployment id. Typical sequence: deployment_service_create → deployment_deployment_list with the returned service id → deployment_deployment_get with a deployment id from that list. Fails when: scheduled mode is combined with containerPort, replicas, or scaleToZero. Replace the example environmentId with your environment's UUID.",
      "module": "deployment",
      "args": [
        {
          "name": "mode",
          "type": "string",
          "required": false,
          "description": "persistent keeps a service running; scheduled runs a job. Cannot change after creation.",
          "default": "persistent"
        },
        {
          "name": "name",
          "type": "string",
          "required": true,
          "description": "Service name, 1–80 characters. The example uses api."
        },
        {
          "name": "slug",
          "type": "string",
          "required": false,
          "description": "URL slug, 1–40 characters."
        },
        {
          "name": "canvas",
          "type": "object",
          "required": false,
          "description": "Position on the environment canvas, with numeric x and y fields."
        },
        {
          "name": "probes",
          "type": "object",
          "required": false,
          "description": "Readiness and liveness checks. Each configured check requires a path starting with /; timing fields use seconds.",
          "default": "{}"
        },
        {
          "name": "source",
          "type": "object",
          "required": true,
          "description": "Source object: type is git, image, or static. Git requires branch; image requires registry and tag. The example uses the main branch; replace it with your branch and supply the repository details for your source."
        },
        {
          "name": "command",
          "type": "string | null",
          "required": false,
          "description": "Shell command for a scheduled run, 1–4096 characters. Omit it or use null to run the image entrypoint."
        },
        {
          "name": "tracing",
          "type": "string",
          "required": false,
          "description": "Tracing instrumentation: off, node, or python. Applied when a deployment builds the workload.",
          "default": "off"
        },
        {
          "name": "replicas",
          "type": "integer",
          "required": false,
          "description": "Number of replicas, 0–50. Persistent mode only."
        },
        {
          "name": "schedule",
          "type": "string | null",
          "required": false,
          "description": "Five-field UTC cron expression: minute hour day-of-month month day-of-week. Use null for a job that runs only on demand."
        },
        {
          "name": "resources",
          "type": "object",
          "required": false,
          "description": "CPU and memory limits, supplied as strings in limits.cpu and limits.memory."
        },
        {
          "name": "containerPort",
          "type": "integer",
          "required": false,
          "description": "Container port, 1–65535. Persistent mode only."
        },
        {
          "name": "environmentId",
          "type": "string",
          "required": true,
          "description": "UUID of the existing environment. Replace the example UUID with yours."
        },
        {
          "name": "jobTimeoutSec",
          "type": "integer",
          "required": false,
          "description": "Maximum duration of a scheduled run, in seconds, from 60 to 86400. A run exceeding this limit is terminated."
        },
        {
          "name": "jobConcurrency",
          "type": "string",
          "required": false,
          "description": "When a previous run is still active: forbid skips the next run, allow runs both, and replace terminates the previous run."
        }
      ],
      "example": {
        "prompt": "Create a service called api in my staging environment from the main branch of my repo.",
        "args": {
          "environmentId": "11111111-1111-4111-8111-111111111111",
          "name": "api",
          "source": {
            "type": "git",
            "branch": "main"
          }
        }
      }
    },
    {
      "name": "deployment_service_redeploy",
      "summary": "Trigger a fresh deployment for an existing service.",
      "description": "Start a new deployment for a service — rebuilds from its configured source and rolls the new revision out. Returns the new deployment id; poll deployment_deployment_get to track it.",
      "module": "deployment",
      "args": [
        {
          "name": "serviceId",
          "type": "uuid",
          "required": true,
          "description": "Service to redeploy."
        }
      ],
      "example": {
        "prompt": "Redeploy the api service.",
        "args": {
          "serviceId": "svc-uuid"
        }
      }
    },
    {
      "name": "deployment_service_rollback",
      "summary": "Roll a service back to a previous deployment.",
      "description": "Re-deploy a service using the image of an earlier deployment, promoting that revision back to running. Use deployment_deployment_list to find the deployment id to roll back to.",
      "module": "deployment",
      "args": [
        {
          "name": "serviceId",
          "type": "uuid",
          "required": true,
          "description": "Service to roll back."
        },
        {
          "name": "deploymentId",
          "type": "uuid",
          "required": true,
          "description": "Previous deployment to promote back to production."
        }
      ],
      "example": {
        "prompt": "Roll the api service back to the previous good deployment.",
        "args": {
          "serviceId": "svc-uuid",
          "deploymentId": "dep-uuid"
        }
      },
      "sequence": [
        "deployment_deployment_list",
        "deployment_service_rollback"
      ]
    },
    {
      "name": "deployment_service_logs",
      "summary": "Read recent runtime logs for a service.",
      "description": "Snapshot the last N runtime log lines for a service. Use it to inspect application output after a deployment or to diagnose a crash.",
      "module": "deployment",
      "args": [
        {
          "name": "serviceId",
          "type": "uuid",
          "required": true,
          "description": "Service whose logs to read."
        },
        {
          "name": "tail",
          "type": "integer",
          "required": false,
          "description": "How many trailing log lines to return (1–2000)."
        }
      ],
      "example": {
        "prompt": "Show me the last 200 log lines for the api service.",
        "args": {
          "serviceId": "svc-uuid",
          "tail": 200
        }
      }
    },
    {
      "name": "deployment_deployment_get",
      "summary": "Fetch the status of a single deployment.",
      "description": "Get a deployment by its UUID. Requires product-scoped read access. Returns: `{ id, serviceId, status, createdAt, lastErrorMessage, ... }` — a deployment object. The status is one of Initializing, Building, Deploying, Active, Replaced, Crashed, Completed, Failed, Removed, Sleeping, Stopped, or WakeFailed. Use deployment_deployment_list to find the id. Replace the example UUID with the deployment id you want to inspect.",
      "module": "deployment",
      "args": [
        {
          "name": "id",
          "type": "string",
          "required": true,
          "description": "UUID of the deployment to inspect. Replace the example UUID with yours."
        }
      ],
      "example": {
        "prompt": "Check the status of deployment 33333333-3333-4333-8333-333333333333.",
        "args": {
          "id": "33333333-3333-4333-8333-333333333333"
        }
      }
    },
    {
      "name": "deployment_deployment_list",
      "summary": "List a service's deployments, newest first.",
      "description": "List a service's deployments, newest first. Requires product-scoped read access. Returns: `[{ id, serviceId, status, createdAt, ... }]` — an array of deployment objects. Use deployment_deployment_get to inspect one deployment, or pass its id to deployment_service_rollback. Replace the example serviceId with your service's UUID.",
      "module": "deployment",
      "args": [
        {
          "name": "serviceId",
          "type": "string",
          "required": true,
          "description": "UUID of the service whose deployments to list. Replace the example UUID with yours."
        }
      ],
      "example": {
        "prompt": "List recent deployments for the api service.",
        "args": {
          "serviceId": "22222222-2222-4222-8222-222222222222"
        }
      }
    },
    {
      "name": "deployment_domain_add",
      "summary": "Attach a custom domain to an environment.",
      "description": "Register a custom domain for an environment and return the CNAME + TXT DNS records to publish. After publishing the records, verification runs automatically; check status via the domain's record.",
      "module": "deployment",
      "args": [
        {
          "name": "environmentId",
          "type": "uuid",
          "required": true,
          "description": "Environment to attach the domain to."
        },
        {
          "name": "hostname",
          "type": "string",
          "required": true,
          "description": "The custom hostname, e.g. app.example.com (3–253 chars)."
        },
        {
          "name": "defaultServiceId",
          "type": "uuid",
          "required": true,
          "description": "Service that serves traffic for this hostname by default."
        },
        {
          "name": "pathPrefix",
          "type": "string",
          "required": false,
          "description": "Path prefix, starting with /. Use letters, digits, slashes, underscores, or hyphens; at most 200 characters."
        },
        {
          "name": "redirectWww",
          "type": "boolean",
          "required": false,
          "description": "Boolean setting for www redirection."
        }
      ],
      "example": {
        "prompt": "Attach app.example.com to my production environment, routing to the web service.",
        "args": {
          "environmentId": "env-uuid",
          "hostname": "app.example.com",
          "defaultServiceId": "svc-uuid"
        }
      },
      "returns": "The domain record plus the CNAME and TXT DNS entries to publish."
    },
    {
      "name": "deployment_variable_set_env",
      "summary": "Create or update an environment-scoped variable.",
      "description": "Set a shared variable on an environment. Shared variables are available to every service in that environment. Mark secrets with isSecret so their values are hidden in reads.",
      "module": "deployment",
      "args": [
        {
          "name": "environmentId",
          "type": "uuid",
          "required": true,
          "description": "Environment to set the variable on."
        },
        {
          "name": "key",
          "type": "string",
          "required": true,
          "description": "Variable name (UPPER_SNAKE_CASE, 1–128 chars)."
        },
        {
          "name": "value",
          "type": "string",
          "required": true,
          "description": "Variable value."
        },
        {
          "name": "isSecret",
          "type": "boolean",
          "required": false,
          "description": "When true, the value is stored as a secret and masked in reads."
        }
      ],
      "example": {
        "prompt": "Set DATABASE_URL as a secret on my staging environment.",
        "args": {
          "environmentId": "env-uuid",
          "key": "DATABASE_URL",
          "value": "postgres://…",
          "isSecret": true
        }
      }
    },
    {
      "name": "deployment_variable_list_env",
      "summary": "List environment-scoped shared variables.",
      "description": "List the shared variables configured on an environment. Secret values are masked.",
      "module": "deployment",
      "args": [
        {
          "name": "environmentId",
          "type": "uuid",
          "required": true,
          "description": "Environment whose variables to list."
        }
      ],
      "example": {
        "prompt": "List the shared variables on my staging environment.",
        "args": {
          "environmentId": "env-uuid"
        }
      }
    },
    {
      "name": "mail_email_send",
      "summary": "Send a single email.",
      "description": "Send one transactional email — inline (subject + html/text) or by reference to a published template with variables. Supports cc/bcc, reply-to, custom headers, tags, and scheduled sends up to 30 days out. The sending domain must be verified first.",
      "module": "mail",
      "args": [
        {
          "name": "from",
          "type": "string",
          "required": true,
          "description": "Sender, e.g. \"Name <you@your-domain.com>\". The domain must be verified."
        },
        {
          "name": "to",
          "type": "string | array",
          "required": false,
          "description": "Primary recipient(s)."
        },
        {
          "name": "subject",
          "type": "string",
          "required": false,
          "description": "Subject line (required for inline sends)."
        },
        {
          "name": "html",
          "type": "string",
          "required": false,
          "description": "HTML body."
        },
        {
          "name": "template",
          "type": "object",
          "required": false,
          "description": "Send by reference to a published template: { id, variables }."
        },
        {
          "name": "scheduled_at",
          "type": "string",
          "required": false,
          "description": "ISO-8601 instant to send at (future, within 30 days). Omit to send now."
        },
        {
          "name": "cc",
          "type": "string | array",
          "required": false,
          "description": "Cc recipients, as one address or an array of addresses."
        },
        {
          "name": "bcc",
          "type": "string | array",
          "required": false,
          "description": "Bcc recipients, as one address or an array of addresses; omitted from message headers."
        },
        {
          "name": "tags",
          "type": "array",
          "required": false,
          "description": "Metadata tags, each with a string name and value."
        },
        {
          "name": "text",
          "type": "string",
          "required": false,
          "description": "Plain-text email body. Derived from html when omitted."
        },
        {
          "name": "headers",
          "type": "object",
          "required": false,
          "description": "Custom email headers as a map of string values."
        },
        {
          "name": "reply_to",
          "type": "string | array",
          "required": false,
          "description": "Reply-To addresses, as one address or an array of addresses."
        }
      ],
      "example": {
        "prompt": "Send a welcome email from hello@example.com to jane@acme.com.",
        "args": {
          "from": "Hello <hello@example.com>",
          "to": "jane@acme.com",
          "subject": "Welcome",
          "html": "<p>Welcome aboard!</p>"
        }
      },
      "failsWhen": [
        "the sending domain is not verified",
        "neither an inline subject/body nor a template is provided"
      ]
    },
    {
      "name": "mail_domain_create",
      "summary": "Register a sending domain.",
      "description": "Register a sending domain (Easy DKIM) and return the DNS records to publish. Publish them, then re-check with mail_domain_verify. The region sets data residency and is immutable after creation.",
      "module": "mail",
      "args": [
        {
          "name": "name",
          "type": "string",
          "required": true,
          "description": "The sending domain to register, e.g. example.com."
        },
        {
          "name": "region",
          "type": "string",
          "required": false,
          "description": "Region for the sending identity (data residency); immutable after create.",
          "default": "eu-north-1"
        }
      ],
      "example": {
        "prompt": "Register example.com as a sending domain.",
        "args": {
          "name": "example.com"
        }
      },
      "returns": "The domain record plus the DNS records to publish for DKIM.",
      "sequence": [
        "mail_domain_create",
        "publish DNS records",
        "mail_domain_verify"
      ]
    },
    {
      "name": "mail_domain_verify",
      "summary": "Re-check a sending domain's DNS.",
      "description": "Immediately re-check a domain's DNS and verification status instead of waiting for the background poller. Run it after publishing the DKIM records.",
      "module": "mail",
      "args": [
        {
          "name": "id",
          "type": "uuid",
          "required": true,
          "description": "Domain id to re-check now."
        }
      ],
      "example": {
        "prompt": "Re-check verification for my sending domain now.",
        "args": {
          "id": "domain-uuid"
        }
      }
    },
    {
      "name": "mail_broadcast_create",
      "summary": "Create a draft broadcast to an audience.",
      "description": "Create a draft broadcast — inline content or a template reference — targeting an audience. It is created as a draft; queue it separately to send.",
      "module": "mail",
      "args": [
        {
          "name": "name",
          "type": "string",
          "required": true,
          "description": "Broadcast name (1–200 chars)."
        },
        {
          "name": "audienceId",
          "type": "uuid",
          "required": true,
          "description": "Audience to send to."
        },
        {
          "name": "from",
          "type": "string",
          "required": true,
          "description": "Sender address (verified domain)."
        },
        {
          "name": "subject",
          "type": "string",
          "required": false,
          "description": "Subject line."
        },
        {
          "name": "html",
          "type": "string",
          "required": false,
          "description": "HTML body."
        },
        {
          "name": "template",
          "type": "object",
          "required": false,
          "description": "Template reference: { id, variables }."
        },
        {
          "name": "text",
          "type": "string",
          "required": false,
          "description": "Plain-text email body."
        },
        {
          "name": "headers",
          "type": "object",
          "required": false,
          "description": "Custom email headers as a map of string values.",
          "default": "{}"
        },
        {
          "name": "replyTo",
          "type": "array",
          "required": false,
          "description": "Reply-To addresses as an array of strings.",
          "default": "[]"
        }
      ],
      "example": {
        "prompt": "Draft a broadcast called July Update to my newsletter audience from news@example.com.",
        "args": {
          "name": "July Update",
          "audienceId": "aud-uuid",
          "from": "News <news@example.com>",
          "subject": "What shipped in July",
          "html": "<p>…</p>"
        }
      }
    },
    {
      "name": "mail_template_create",
      "summary": "Create a draft email template.",
      "description": "Create a draft email template with typed {{ variable }} placeholders in the subject and body. Declare variables (name, type, optional, fallback) so sends can be validated. Publish the template before sending by reference.",
      "module": "mail",
      "args": [
        {
          "name": "name",
          "type": "string",
          "required": true,
          "description": "Human label for the template."
        },
        {
          "name": "subject",
          "type": "string",
          "required": true,
          "description": "Subject line; may contain {{ variable }} placeholders."
        },
        {
          "name": "html",
          "type": "string",
          "required": true,
          "description": "HTML body; may contain {{ variable }} placeholders."
        },
        {
          "name": "variables",
          "type": "array",
          "required": false,
          "description": "Declared variables ([{ name, type, optional, fallback }], up to 20)."
        },
        {
          "name": "text",
          "type": "string",
          "required": false,
          "description": "Plain-text email body. Derived from html when omitted."
        }
      ],
      "example": {
        "prompt": "Create a template named Welcome with a {{ first_name }} placeholder in the subject.",
        "args": {
          "name": "Welcome",
          "subject": "Welcome, {{ first_name }}",
          "html": "<p>Hi {{ first_name }}</p>",
          "variables": [
            {
              "name": "first_name",
              "type": "string"
            }
          ]
        }
      }
    },
    {
      "name": "consent_providers_create",
      "summary": "Add a consent provider (and its cookies).",
      "description": "Create a consent provider — a third party that sets cookies or storage — under a consent category (necessary, preferences, statistics, or marketing). Declare its cookies and the hosts it loads scripts from (required for non-necessary categories).",
      "module": "consent",
      "args": [
        {
          "name": "name",
          "type": "string",
          "required": true,
          "description": "Provider display name, e.g. \"Google Analytics 4\"."
        },
        {
          "name": "category",
          "type": "string",
          "required": true,
          "description": "Consent category: necessary, preferences, statistics, or marketing."
        },
        {
          "name": "cookies",
          "type": "array",
          "required": false,
          "description": "Cookies/storage entries this provider sets ([{ name, type, purpose, storageDuration }])."
        },
        {
          "name": "hosts",
          "type": "array",
          "required": false,
          "description": "Hostnames the provider loads scripts from. Required (min 1) for non-necessary categories."
        },
        {
          "name": "privacyUrl",
          "type": "string",
          "required": false,
          "description": "Link to the provider's privacy policy."
        },
        {
          "name": "catalogKey",
          "type": "string",
          "required": false,
          "description": "Catalog entry key for a provider created from the picker, 1–100 characters."
        },
        {
          "name": "orderIndex",
          "type": "integer",
          "required": false,
          "description": "Sort order, from 0 to 10000; lower values appear first."
        },
        {
          "name": "description",
          "type": "string",
          "required": false,
          "description": "Description shown in the consent UI, up to 4000 characters. Stored as an empty string when omitted."
        }
      ],
      "example": {
        "prompt": "Add Google Analytics 4 as a statistics provider that sets the _ga cookie.",
        "args": {
          "name": "Google Analytics 4",
          "category": "statistics",
          "hosts": [
            "www.googletagmanager.com"
          ],
          "cookies": [
            {
              "name": "_ga",
              "type": "http_cookie",
              "storageDuration": "2 years"
            }
          ]
        }
      },
      "failsWhen": [
        "a non-necessary category is given with no hosts",
        "two cookies share a name within the provider"
      ]
    },
    {
      "name": "consent_providers_list",
      "summary": "List consent providers and their cookies.",
      "description": "List all consent providers (and their declared cookies) configured for the current product. Read-only.",
      "module": "consent",
      "args": [],
      "example": {
        "prompt": "List the consent providers configured for this product.",
        "args": {}
      }
    },
    {
      "name": "consent_records_export",
      "summary": "Export consent records as CSV.",
      "description": "Export the product's consent decision records as CSV, filtered by date range. Returns rows inline up to a limit and a download_url for larger sets. For an Art. 15 (DSAR) access request, pass record_id (the UUID from the visitor's consent cookie) to return that visitor's full decision chain.",
      "module": "consent",
      "args": [
        {
          "name": "from",
          "type": "string",
          "required": false,
          "description": "Inclusive lower bound for created_at (ISO-8601). Omit for the beginning."
        },
        {
          "name": "to",
          "type": "string",
          "required": false,
          "description": "Inclusive upper bound for created_at (ISO-8601). Omit for now."
        },
        {
          "name": "record_id",
          "type": "uuid",
          "required": false,
          "description": "DSAR lookup: a visitor's record_id to export only their decision chain."
        },
        {
          "name": "limit",
          "type": "integer",
          "required": false,
          "description": "Max rows returned inline (1–10000).",
          "default": "1000"
        }
      ],
      "example": {
        "prompt": "Export all consent records for June 2026 as CSV.",
        "args": {
          "from": "2026-06-01T00:00:00Z",
          "to": "2026-07-01T00:00:00Z"
        }
      },
      "returns": "Inline CSV rows and, when more match, a download_url for the full dataset."
    },
    {
      "name": "consent_dashboard_stats_get",
      "summary": "Get consent dashboard stats.",
      "description": "Return lightweight consent stats for the current product (currently the total consent record count). Read-only.",
      "module": "consent",
      "args": [],
      "example": {
        "prompt": "How many consent records does this product have?",
        "args": {}
      }
    },
    {
      "name": "consent_embed_get",
      "summary": "Get the consent banner embed snippet.",
      "description": "Get the consent banner embed script for the current product. Requires product-scoped read access. Returns script_tag, product_id, and public_edge_url. Insert script_tag unchanged, including its leading HTML comment, as the first script in <head>, before trackers, tag managers, or inline loaders. Do not add async or defer: the banner must run before trackers so it can apply the consent decision.",
      "module": "consent",
      "args": [],
      "example": {
        "prompt": "Give me the consent banner script tag to add to my site.",
        "args": {}
      }
    },
    {
      "name": "waitlist_invites_send",
      "summary": "Send waitlist invites.",
      "description": "Send invite emails to waitlist signups. Provide an explicit email list and/or a filter over signups (by status or email prefix). Set force to resend when a live invite token already exists.",
      "module": "waitlist",
      "args": [
        {
          "name": "emails",
          "type": "array",
          "required": false,
          "description": "Explicit recipient emails. Combined with filter if both are given."
        },
        {
          "name": "filter",
          "type": "object",
          "required": false,
          "description": "Selection filter over signups: { q (email prefix), status }."
        },
        {
          "name": "force",
          "type": "boolean",
          "required": false,
          "description": "Resend even when a live invite token already exists.",
          "default": "false"
        }
      ],
      "example": {
        "prompt": "Invite all pending waitlist signups.",
        "args": {
          "filter": {
            "status": "pending"
          }
        }
      }
    },
    {
      "name": "waitlist_signups_list",
      "summary": "List waitlist signups.",
      "description": "List waitlist signups for the current product with status filtering, keyset pagination, and field selection. email and ip_hash are PII and their access is audited when requested.",
      "module": "waitlist",
      "args": [
        {
          "name": "status",
          "type": "string | array",
          "required": false,
          "description": "Filter by status: pending, invited, or registered. Omit for all."
        },
        {
          "name": "fields",
          "type": "array",
          "required": false,
          "description": "Fields per row. Default [status, created_at]; id is always included."
        },
        {
          "name": "limit",
          "type": "integer",
          "required": false,
          "description": "Page size (1–200).",
          "default": "50"
        },
        {
          "name": "cursor",
          "type": "string",
          "required": false,
          "description": "Keyset cursor from a previous response's next_cursor."
        },
        {
          "name": "q",
          "type": "string",
          "required": false,
          "description": "Case-insensitive email prefix to search for, 1–254 characters. This search is audited as access to personal data."
        },
        {
          "name": "order",
          "type": "string",
          "required": false,
          "description": "Sort by created_at: newest or oldest.",
          "default": "newest"
        }
      ],
      "example": {
        "prompt": "List the first 50 pending waitlist signups.",
        "args": {
          "status": "pending",
          "limit": 50
        }
      }
    },
    {
      "name": "waitlist_signups_funnel",
      "summary": "Waitlist signup → invited → registered funnel.",
      "description": "Return funnel counts (signup, invited, registered) for the current product over a time window. Stages are counted by their own transition timestamp, so a window can be non-monotonic.",
      "module": "waitlist",
      "args": [
        {
          "name": "period",
          "type": "string",
          "required": false,
          "description": "Time window: 7d, 30d, 90d, or all.",
          "default": "30d"
        }
      ],
      "example": {
        "prompt": "Show the waitlist funnel for the last 30 days.",
        "args": {
          "period": "30d"
        }
      }
    },
    {
      "name": "waitlist_config_upsert",
      "summary": "Create or replace the waitlist configuration.",
      "description": "Full-document upsert of the waitlist config for the current product: consent text (with an optional {policy} placeholder), policy link, invite email subject/template, and sender identity. Stored as-is; content correctness is the controller's responsibility.",
      "module": "waitlist",
      "args": [
        {
          "name": "policyVersion",
          "type": "string",
          "required": true,
          "description": "Policy version label (controller-owned free string)."
        },
        {
          "name": "consentText",
          "type": "string",
          "required": true,
          "description": "Plain-text consent statement shown at signup; may contain a {policy} placeholder."
        },
        {
          "name": "policyUrl",
          "type": "string | null",
          "required": false,
          "description": "Policy link URL (http/https/mailto). Null to clear."
        },
        {
          "name": "inviteSubject",
          "type": "string | null",
          "required": false,
          "description": "Invite email subject line. Null to clear."
        },
        {
          "name": "senderName",
          "type": "string | null",
          "required": false,
          "description": "Controller display name used as the invite From name."
        },
        {
          "name": "policyLabel",
          "type": "string | null",
          "required": false,
          "description": "Visible text of the policy link. Falls back to the URL when absent."
        },
        {
          "name": "siteBaseUrl",
          "type": "string | null",
          "required": false,
          "description": "Public base URL of your site, using HTTP or HTTPS. Invite and opt-out links use this URL; a path is allowed and a trailing slash is removed. Null clears it."
        },
        {
          "name": "senderDomain",
          "type": "string | null",
          "required": false,
          "description": "Bare hostname used to send invite emails. Verified when sending; null clears it."
        },
        {
          "name": "inviteTemplate",
          "type": "string | null",
          "required": false,
          "description": "Invite email template with {{vars}} placeholders. Validated and rendered when sending; null clears it."
        }
      ],
      "example": {
        "prompt": "Set the waitlist consent text and point the policy link at example.com/privacy.",
        "args": {
          "policyVersion": "2026-07",
          "consentText": "I agree to the {policy}.",
          "policyUrl": "https://example.com/privacy"
        }
      }
    },
    {
      "name": "waitlist_signups_erase",
      "summary": "Erase a waitlist signup (GDPR Art. 17).",
      "description": "Erase a waitlist signup by email within the current product, per GDPR Art. 17. Hard-deletes the signup and its invite tokens, reduces the consent-ledger rows to a keyed hash, and adds the email to the do-not-contact suppression list. Idempotent.",
      "module": "waitlist",
      "args": [
        {
          "name": "email",
          "type": "string",
          "required": true,
          "description": "Email address to erase. Normalized (trimmed + lowercased) server-side."
        }
      ],
      "example": {
        "prompt": "Erase jane@acme.com from the waitlist (GDPR request).",
        "args": {
          "email": "jane@acme.com"
        }
      },
      "returns": "{ erased, tokens_removed, ledger_rows_reduced } — counts only, never PII.",
      "sequence": [
        "waitlist_signups_list (find the signup)",
        "waitlist_signups_erase"
      ],
      "failsWhen": [
        "the email is empty or malformed",
        "the caller lacks erase permission on the product"
      ],
      "irreversible": "Erased signups and their invite tokens cannot be recovered."
    },
    {
      "name": "organization_product_create",
      "summary": "Create a product.",
      "description": "Create a new product (workspace) with the given name. Products scope every other surface — deployments, mail, consent, and waitlist all operate inside the selected product.",
      "module": "organization",
      "args": [
        {
          "name": "name",
          "type": "string",
          "required": true,
          "description": "Product name (1–100 chars)."
        },
        {
          "name": "region",
          "type": "string",
          "required": false,
          "description": "Product region. The only accepted value is eu."
        },
        {
          "name": "organizationId",
          "type": "string",
          "required": false,
          "description": "UUID of the organization for the product."
        }
      ],
      "example": {
        "prompt": "Create a product called Acme Web.",
        "args": {
          "name": "Acme Web"
        }
      }
    },
    {
      "name": "organization_product_list",
      "summary": "List products you can access.",
      "description": "List all products the current identity has access to. Use it to find a product id before switching into it.",
      "module": "organization",
      "args": [],
      "example": {
        "prompt": "Which products do I have access to?",
        "args": {}
      }
    },
    {
      "name": "organization_auth_me",
      "summary": "Get the current identity.",
      "description": "Return the current authenticated identity (identity id). Use it to confirm the agent's token is authenticated and whose account it is acting as.",
      "module": "organization",
      "args": [],
      "example": {
        "prompt": "Who am I authenticated as?",
        "args": {}
      }
    },
    {
      "name": "brain_memory_search",
      "summary": "Search product memories.",
      "description": "Search the current product's memories by natural-language query. Scope reads to shared, private, or both — a person sees the shared pool only.",
      "module": "brain",
      "args": [
        {
          "name": "query",
          "type": "string",
          "required": true,
          "description": "Natural-language search query."
        },
        {
          "name": "scope",
          "type": "string",
          "required": false,
          "description": "Read scope: shared, private, or both.",
          "default": "both"
        },
        {
          "name": "limit",
          "type": "integer",
          "required": false,
          "description": "Max results per channel (up to 100)."
        }
      ],
      "example": {
        "prompt": "Search the product memory for anything about our pricing decisions.",
        "args": {
          "query": "pricing decisions"
        }
      }
    },
    {
      "name": "brain_memory_add",
      "summary": "Store a product memory.",
      "description": "Store a memory for the current product. Write to the shared pool (default, product-wide) or a private namespace scoped to this agent. Set source_authority (policy > official > team > informal) to record how authoritative the fact is.",
      "module": "brain",
      "args": [
        {
          "name": "content",
          "type": "string",
          "required": true,
          "description": "The memory text to store."
        },
        {
          "name": "scope",
          "type": "string",
          "required": false,
          "description": "shared (product-wide, default) or private (this agent only).",
          "default": "shared"
        },
        {
          "name": "source_authority",
          "type": "string",
          "required": false,
          "description": "policy, official, team, or informal. Defaults to official."
        },
        {
          "name": "metadata",
          "type": "object",
          "required": false,
          "description": "Structured metadata attached to the memory."
        }
      ],
      "example": {
        "prompt": "Remember that our support SLA is next business day.",
        "args": {
          "content": "Support SLA is next business day.",
          "source_authority": "official"
        }
      }
    },
    {
      "name": "brain_knowledge_search",
      "summary": "Search the product knowledge graph.",
      "description": "Search the current product's knowledge-graph entities (Feature, Decision, Risk, and so on). Filter by entity type or name substring and paginate with offset.",
      "module": "brain",
      "args": [
        {
          "name": "entity_type",
          "type": "string",
          "required": false,
          "description": "Filter by ontology entity type (e.g. Feature, Decision)."
        },
        {
          "name": "name",
          "type": "string",
          "required": false,
          "description": "Filter by entity name/alias substring."
        },
        {
          "name": "scope",
          "type": "string",
          "required": false,
          "description": "Read scope: shared, private, or both.",
          "default": "both"
        },
        {
          "name": "limit",
          "type": "integer",
          "required": false,
          "description": "Max entities (up to 100)."
        },
        {
          "name": "offset",
          "type": "integer",
          "required": false,
          "description": "Pagination offset, 0 or greater."
        }
      ],
      "example": {
        "prompt": "Find the Decision entities in our product knowledge graph.",
        "args": {
          "entity_type": "Decision"
        }
      }
    }
  ]
}