{"serverId":"mcp-registry/ai.borealhost/mcp","tools":[{"name":"add_cron","fixed":{"name":"add_cron","description":"Add a cron job to a site.\n\nRequires: API key with write scope.\n\nArgs:\n    slug: Site identifier\n    schedule: Cron schedule (e.g. \"*/5 * * * *\", \"0 2 * * *\")\n    command: Command to execute\n\nReturns:\n    {\"added\": true, \"result\": {...}}\n","inputSchema":{"type":"object","title":"add_cronArguments","required":["slug","schedule","command"],"properties":{"slug":{"type":"string","title":"Slug"},"command":{"type":"string","title":"Command"},"schedule":{"type":"string","title":"Schedule"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":151,"tokensAfter":151},{"name":"add_domain_dns","fixed":{"name":"add_domain_dns","description":"Add a DNS record to a domain.\n\nRequires: API key with write scope.\n\nArgs:\n    domain_name: Full domain name (e.g. \"example.com\")\n    record_type: \"A\", \"AAAA\", \"CNAME\", \"MX\", \"TXT\", or \"SRV\"\n    value: Record value (e.g. \"1.2.3.4\" for A, \"mail.example.com\" for MX)\n    subdomain: Subdomain part (e.g. \"www\", \"mail\"). Empty for apex domain.\n    priority: MX priority (required for MX records)\n\n    The DNS provider manages the effective TTL and does not expose a\n    per-record value through this servi","inputSchema":{"type":"object","title":"add_domain_dnsArguments","required":["domain_name","record_type","value"],"properties":{"value":{"type":"string","title":"Value"},"priority":{"type":"integer","title":"Priority","default":null},"subdomain":{"type":"string","title":"Subdomain","default":""},"domain_name":{"type":"string","title":"Domain Name"},"record_type":{"type":"string","title":"Record Type"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":274,"tokensAfter":274},{"name":"add_firewall_rule","fixed":{"name":"add_firewall_rule","description":"Add an IP firewall rule (allow or deny) and reload Nginx.\n\nSupports IPv4, IPv6, and CIDR notation. Max 100 rules per site.\nIf a rule already exists for the IP, the action is updated.\n\nRequires: API key with write scope.\n\nArgs:\n    slug: Site identifier\n    ip: IP address or CIDR (e.g. \"1.2.3.4\", \"10.0.0.0/8\", \"2001:db8::/32\")\n    action: \"deny\" (block) or \"allow\" (whitelist). Default: \"deny\"\n\nReturns:\n    {\"added\": true, \"ip\": \"1.2.3.4\", \"action\": \"deny\"}\n","inputSchema":{"type":"object","title":"add_firewall_ruleArguments","required":["slug","ip"],"properties":{"ip":{"type":"string","title":"Ip"},"slug":{"type":"string","title":"Slug"},"action":{"type":"string","title":"Action","default":"deny"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":219,"tokensAfter":219},{"name":"add_mailbox_alias","fixed":{"name":"add_mailbox_alias","description":"Add an alias on the same domain, preserving existing aliases.","inputSchema":{"type":"object","title":"add_mailbox_aliasArguments","required":["email","alias"],"properties":{"actor":{"type":"string","title":"Actor","default":""},"alias":{"type":"string","title":"Alias"},"email":{"type":"string","title":"Email"},"reason":{"type":"string","title":"Reason","default":""}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":116,"tokensAfter":116},{"name":"add_port_forward","fixed":{"name":"add_port_forward","description":"Publish a container port on the node's public IP (TCP or UDP).\n\nThis is how inbound UDP reaches a container. There is no other way: the\ncontainer's own address is private, and the IP allow/deny rules of\nadd_firewall_rule cannot route anything.\n\nPORT PRESERVATION MATTERS. Leave external_port at 0 and a port is allocated\nfrom 10000-19999 — your service becomes reachable, but on a DIFFERENT\nnumber. That is fine for HTTP or ssh and broken for every protocol that\ncarries its own port inside the paylo","inputSchema":{"type":"object","title":"add_port_forwardArguments","required":["slug","internal_port"],"properties":{"slug":{"type":"string","title":"Slug"},"label":{"type":"string","title":"Label","default":""},"protocol":{"type":"string","title":"Protocol","default":"tcp"},"external_port":{"type":"integer","title":"External Port","default":0},"internal_port":{"type":"integer","title":"Internal Port"},"internal_port_end":{"type":"integer","title":"Internal Port End","default":0}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":289,"tokensAfter":289},{"name":"add_redirect","fixed":{"name":"add_redirect","description":"Add an HTTP redirect rule to a site.\n\nRequires: API key with write scope.\n\nArgs:\n    slug: Site identifier\n    source_path: Path to redirect, must start with \"/\" (e.g. \"/old-page\")\n    target_url: Destination URL\n    redirect_type: 301 (permanent, default) or 302 (temporary)\n\nReturns:\n    {\"id\", \"source_path\", \"target_url\", \"redirect_type\"}\n","inputSchema":{"type":"object","title":"add_redirectArguments","required":["slug","source_path","target_url"],"properties":{"slug":{"type":"string","title":"Slug"},"target_url":{"type":"string","title":"Target Url"},"source_path":{"type":"string","title":"Source Path"},"redirect_type":{"type":"integer","title":"Redirect Type","default":301}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":209,"tokensAfter":209},{"name":"add_site","fixed":{"name":"add_site","description":"Provision a site into a slot a plan you ALREADY PAY FOR includes.\n\nTwo different things can be meant by \"create a site\". Buying one is the\ncheckout flow (create_checkout → update → complete). This is the other: most\nplans include several sites, and this uses one of them at no extra cost.\nsite_starter includes 5, site_plus 8, site_pro 12, and the agency plans\nmore. `whoami` and `list_sites` show what the account already holds.\n\n⚠ Prefer this over buying a second subscription when a slot is free. ","inputSchema":{"type":"object","title":"add_siteArguments","required":["slug","subscription_id"],"properties":{"slug":{"type":"string","title":"Slug"},"domain":{"type":"string","title":"Domain","default":""},"site_type":{"type":"string","title":"Site Type","default":""},"client_name":{"type":"string","title":"Client Name","default":""},"subscription_id":{"type":"string","title":"Subscription Id"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":264,"tokensAfter":264},{"name":"add_ssh_key","fixed":{"name":"add_ssh_key","description":"Inject your SSH public key into a site's container for direct SSH access.\n\nThe key is appended to /home/admin/.ssh/authorized_keys.\nOnly available for VPS/dedicated plans.\n\nRequires: API key with write scope.\n\nArgs:\n    slug: Site identifier\n    public_key: SSH public key string. Supported types:\n                ssh-ed25519, ssh-rsa, ecdsa-sha2-nistp256/384/521\n\nReturns:\n    {\"success\": true, \"message\": \"SSH key added\",\n     \"ssh_command\": \"ssh admin@184.107.x.x\"}\n\nErrors:\n    VALIDATION_ERROR: ","inputSchema":{"type":"object","title":"add_ssh_keyArguments","required":["slug","public_key"],"properties":{"slug":{"type":"string","title":"Slug"},"public_key":{"type":"string","title":"Public Key"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":214,"tokensAfter":214},{"name":"add_subdomain","fixed":{"name":"add_subdomain","description":"Create and route a subdomain of a site-linked domain.\n\nCreates the DNS A record (if absent) pointing at the site's server,\nthen configures the nginx vhost and SSL certificate on that server.\nThe domain must already be linked to a site (see link_domain).\n\nIdempotent: if the DNS record already exists and points at the site's\nserver, the nginx/SSL steps are (re)applied — safe to re-call, e.g. to\nretry SSL after DNS propagation. May take up to 3 minutes when a\ncertificate is issued.\n\nRequires: API k","inputSchema":{"type":"object","title":"add_subdomainArguments","required":["domain_name","subdomain"],"properties":{"subdomain":{"type":"string","title":"Subdomain"},"domain_name":{"type":"string","title":"Domain Name"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":216,"tokensAfter":216},{"name":"browse_backup","fixed":{"name":"browse_backup","description":"List one bounded page of immediate children in a backup directory.\n\nThis returns names and metadata only, never file contents. Use\n``next_cursor`` from the response as ``cursor`` to request the next page.\n\nRequires: API key with read scope.\n\nArgs:\n    slug: Site identifier\n    backup_id: UUID of a completed backup\n    path: Absolute directory path as it existed in the backup\n    cursor: Resume after this entry name (optional)\n    limit: Maximum entries, from 1 through 100\n\nErrors:\n    SNAPSHOT_S","inputSchema":{"type":"object","title":"browse_backupArguments","required":["slug","backup_id","path"],"properties":{"path":{"type":"string","title":"Path"},"slug":{"type":"string","title":"Slug"},"limit":{"type":"integer","title":"Limit","default":100},"cursor":{"type":"string","title":"Cursor","default":""},"backup_id":{"type":"string","title":"Backup Id"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":256,"tokensAfter":256},{"name":"cache_status","fixed":{"name":"cache_status","description":"Get cache status (Redis, WP object cache, hit rates).\n\nRequires: API key with read scope.\n\nArgs:\n    slug: Site identifier\n\nReturns:\n    {\"redis_running\": true, \"object_cache_enabled\": true,\n     \"hit_rate\": 0.95, \"memory_used_mb\": 12}\n","inputSchema":{"type":"object","title":"cache_statusArguments","required":["slug"],"properties":{"slug":{"type":"string","title":"Slug"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":121,"tokensAfter":121},{"name":"cancel_checkout","fixed":{"name":"cancel_checkout","description":"Abandon an unpaid checkout and expire its Stripe payment link.\n\nUse this to clean up abandoned attempts rather than leaving them to sit.\nA completed checkout is never cancelled here — that would be a refund, and\nit is refused.\n\nArgs:\n    checkout_id: Checkout session ID\n\nReturns:\n    The checkout, with status \"canceled\".\n\nErrors:\n    VALIDATION_ERROR: Checkout was already paid — cancel the subscription\n                      from the panel instead\n    FORBIDDEN: Missing checkout_secret and no own","inputSchema":{"type":"object","title":"cancel_checkoutArguments","required":["checkout_id"],"properties":{"checkout_id":{"type":"string","title":"Checkout Id"}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":201,"tokensAfter":201},{"name":"cancel_scheduled_snapshot","fixed":{"name":"cancel_scheduled_snapshot","description":"Cancel a scheduled snapshot.\n\nRequires: API key with write scope.\n\nArgs:\n    slug: Site identifier\n    schedule_id: UUID of the scheduled snapshot to cancel\n\nReturns:\n    {\"success\": true, \"message\": \"Scheduled snapshot cancelled\"}\n\nErrors:\n    NOT_FOUND: Schedule not found or already executed\n","inputSchema":{"type":"object","title":"cancel_scheduled_snapshotArguments","required":["slug","schedule_id"],"properties":{"slug":{"type":"string","title":"Slug"},"schedule_id":{"type":"string","title":"Schedule Id"}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":164,"tokensAfter":164},{"name":"cloudflare_proxy_status","fixed":{"name":"cloudflare_proxy_status","description":"Get Cloudflare proxy (CDN) status for a site.\n\nShows whether traffic is routed through Cloudflare's CDN (orange cloud)\nor goes direct to origin (grey cloud / DNS-only).\n\nRequires: API key with read scope.\n\nArgs:\n    slug: Site identifier\n\nReturns:\n    {\"domain\": \"my-site.borealhost.ai\", \"has_record\": true,\n     \"proxied\": true, \"ip\": \"1.2.3.4\"}\n","inputSchema":{"type":"object","title":"cloudflare_proxy_statusArguments","required":["slug"],"properties":{"slug":{"type":"string","title":"Slug"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":160,"tokensAfter":160},{"name":"cloudflare_purge_cache","fixed":{"name":"cloudflare_purge_cache","description":"Purge Cloudflare CDN cache for a site.\n\nWithout urls: purges all cached content for the site's subdomain.\nWith urls: purges only the specified URLs (max 30 per call).\n\nRequires: API key with write scope.\n\nArgs:\n    slug: Site identifier\n    urls: Optional list of specific URLs to purge\n          (e.g. [\"https://my-site.borealhost.ai/style.css\"])\n\nReturns:\n    {\"purged\": true, \"scope\": \"host\", \"domain\": \"my-site.borealhost.ai\"}\n","inputSchema":{"type":"object","title":"cloudflare_purge_cacheArguments","required":["slug"],"properties":{"slug":{"type":"string","title":"Slug"},"urls":{"type":"array","items":{},"title":"Urls","default":null}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":201,"tokensAfter":201},{"name":"cloudflare_set_proxy","fixed":{"name":"cloudflare_set_proxy","description":"Enable or disable Cloudflare CDN proxy for a site.\n\nWhen enabled (orange cloud): traffic goes through Cloudflare's CDN,\ngets caching, DDoS protection, and SSL termination at the edge.\nWhen disabled (grey cloud): traffic goes directly to origin server.\n\nRequires: API key with write scope.\n\nArgs:\n    slug: Site identifier\n    proxied: true to enable CDN proxy, false to disable\n\nReturns:\n    {\"domain\": \"my-site.borealhost.ai\", \"proxied\": true, \"ip\": \"1.2.3.4\"}\n","inputSchema":{"type":"object","title":"cloudflare_set_proxyArguments","required":["slug","proxied"],"properties":{"slug":{"type":"string","title":"Slug"},"proxied":{"type":"boolean","title":"Proxied"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":205,"tokensAfter":205},{"name":"complete_checkout","fixed":{"name":"complete_checkout","description":"Complete checkout with payment and start site provisioning.\n\nThe checkout must be in \"ready\" status.\n\nTwo payment methods:\n- \"stripe_checkout\" (default): Returns a short, chat-safe payment URL.\n  **Present `payment_url` to the human — NOT `stripe_checkout_url`.**\n  The raw Stripe URL has a required `#fragment` that chat UIs routinely\n  strip when rendering markdown links, which causes Stripe to show\n  \"page not found\". `payment_url` is a short BorealHost redirect that\n  preserves the fragment vi","inputSchema":{"type":"object","title":"complete_checkoutArguments","required":["checkout_id"],"properties":{"checkout_id":{"type":"string","title":"Checkout Id"},"payment_method":{"type":"string","title":"Payment Method","default":"stripe_checkout"},"payment_method_id":{"type":"string","title":"Payment Method Id","default":""}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":249,"tokensAfter":249},{"name":"create_alert_rule","fixed":{"name":"create_alert_rule","description":"Create an alert rule to monitor CPU, memory, or disk usage.\n\nWhen the metric crosses the threshold, a notification is sent via\nemail and/or webhook. Max 10 rules per site.\n\nRequires: API key with write scope.\n\nArgs:\n    slug: Site identifier\n    metric: \"cpu\", \"memory\", or \"disk\" (percentage-based)\n    threshold: Threshold value 0-100 (e.g. 90 for 90%)\n    operator: \"gt\" (greater than) or \"lt\" (less than). Default: \"gt\"\n    severity: \"warning\" or \"critical\". Default: \"warning\"\n    cooldown_minut","inputSchema":{"type":"object","title":"create_alert_ruleArguments","required":["slug","metric","threshold"],"properties":{"slug":{"type":"string","title":"Slug"},"metric":{"type":"string","title":"Metric"},"operator":{"type":"string","title":"Operator","default":"gt"},"severity":{"type":"string","title":"Severity","default":"warning"},"threshold":{"type":"number","title":"Threshold"},"notify_email":{"type":"boolean","title":"Notify Email","default":true},"notify_webhook":{"type":"string","title":"Notify Webhook","default":""},"cooldown_minutes":{"type":"integer","title":"Cooldown Minutes","default":30}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":331,"tokensAfter":331},{"name":"create_api_key","fixed":{"name":"create_api_key","description":"Create a new API key with specified scopes.\n\nCannot create keys with higher scopes than the current key.\nSite-scoped keys restrict access to a single site.\nemail_domains restricts the key to email tools on the named domains; use\nemail:read, email:write and optionally email:signon scopes. expires_at is\nan ISO timestamp; ip_allowlist accepts IP addresses and CIDR networks.\n\nRequires: API key with write scope.\n\nArgs:\n    name: Human-readable name for the key (1-100 chars)\n    scopes: Comma-separate","inputSchema":{"type":"object","title":"create_api_keyArguments","required":["name"],"properties":{"name":{"type":"string","title":"Name"},"scopes":{"type":"string","title":"Scopes","default":"read"},"site_slug":{"type":"string","title":"Site Slug","default":""},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expires At","default":null},"ip_allowlist":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Ip Allowlist","default":null},"email_domains":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Email Domains","default":null}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":324,"tokensAfter":324},{"name":"create_b2_snapshot","fixed":{"name":"create_b2_snapshot","description":"Create a B2 cloud-backed snapshot (zero local disk, async).\n\nStreams container data directly to Backblaze B2 via restic.\nNo local disk impact — billed separately at cost+5%.\nRuns in background — returns immediately with status \"creating\".\nPoll list_snapshots() to check when status becomes \"completed\".\nOnly available for VPS plans.\n\nRequires: API key with write scope.\n\nArgs:\n    slug: Site identifier\n    description: Optional description (max 200 chars)\n\nReturns:\n    {\"id\": \"uuid\", \"name\": \"...\",","inputSchema":{"type":"object","title":"create_b2_snapshotArguments","required":["slug"],"properties":{"slug":{"type":"string","title":"Slug"},"description":{"type":"string","title":"Description","default":""}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":219,"tokensAfter":219},{"name":"create_backup","fixed":{"name":"create_backup","description":"Create a manual backup (runs asynchronously).\n\nThe backup starts in the background. Poll list_backups() to check status.\n\nRequires: API key with write scope.\n\nArgs:\n    slug: Site identifier\n\nReturns:\n    {\"id\": \"uuid\", \"status\": \"pending\",\n     \"message\": \"Backup started. Poll list_backups() to check status.\"}\n","inputSchema":{"type":"object","title":"create_backupArguments","required":["slug"],"properties":{"slug":{"type":"string","title":"Slug"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":144,"tokensAfter":144},{"name":"create_checkout","fixed":{"name":"create_checkout","description":"Start a new checkout session to purchase a hosting plan.\n\nNo authentication needed. After creating, call update_checkout to set\nbuyer info, then complete_checkout to pay.\n\nThe response carries a `checkout_secret`, returned ONCE, that every later\nstep of this checkout requires. It is held in memory for this MCP session\nand sent automatically — but it is gone if the server restarts. If a session\nkey is set, the checkout is owned by that account and the API key authorizes\nthe later steps on its own","inputSchema":{"type":"object","title":"create_checkoutArguments","required":["sku"],"properties":{"sku":{"type":"string","title":"Sku"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":192,"tokensAfter":192},{"name":"create_compute_volume","fixed":{"name":"create_compute_volume","description":"Create a persistent machine and boot its first instance.\n\nStart here, then set the machine up however you like (install packages,\ndrivers, models). Everything you do becomes part of the volume the first\ntime you detach or snapshot it.\n\nWhile attached you pay hourly compute; while detached you pay only for\nstored bytes (CA$0.03/GB/month). Stopping an instance does NOT save money\non this provider — detaching is what stops the compute charge.\n\nRequires: API key with write scope, and an active subsc","inputSchema":{"type":"object","title":"create_compute_volumeArguments","required":["name","image_id","instance_type","ssh_public_key"],"properties":{"name":{"type":"string","title":"Name"},"image_id":{"type":"string","title":"Image Id"},"instance_type":{"type":"string","title":"Instance Type"},"root_disk_size":{"type":"integer","title":"Root Disk Size","default":0},"ssh_public_key":{"type":"string","title":"Ssh Public Key"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":275,"tokensAfter":275},{"name":"create_directory","fixed":{"name":"create_directory","description":"Create a directory in a site's container.\n\nCreates parent directories if they don't exist.\n\nRequires: API key with write scope.\n\nArgs:\n    slug: Site identifier\n    path: Relative path of the directory to create\n\nReturns:\n    {\"success\": true, \"path\": \"uploads/2024\", \"message\": \"Directory created\"}\n\nErrors:\n    NOT_FOUND: Unknown slug\n    FORBIDDEN: Protected system path\n","inputSchema":{"type":"object","title":"create_directoryArguments","required":["slug","path"],"properties":{"path":{"type":"string","title":"Path"},"slug":{"type":"string","title":"Slug"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":177,"tokensAfter":177},{"name":"create_email_mailbox","fixed":{"name":"create_email_mailbox","description":"Create a domain-addressed billable mailbox. Password returned once; retries omit it.","inputSchema":{"type":"object","title":"create_email_mailboxArguments","required":["domain","local_part"],"properties":{"actor":{"type":"string","title":"Actor","default":""},"label":{"type":"string","title":"Label","default":""},"domain":{"type":"string","title":"Domain"},"reason":{"type":"string","title":"Reason","default":""},"password":{"type":"string","title":"Password","default":""},"quota_gb":{"type":"integer","title":"Quota Gb","default":5},"local_part":{"type":"string","title":"Local Part"},"display_name":{"type":"string","title":"Display Name","default":""},"idempotency_key":{"type":"string","title":"Idempotency Key","default":""},"smtp_sent_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Smtp Sent Limit","default":null}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":247,"tokensAfter":247},{"name":"create_ftp_account","fixed":{"name":"create_ftp_account","description":"Create an SFTP account on a site.\n\nThe account is chrooted to /var/www and lands in home_dir. Password must be\nat least 8 characters. Username must be lowercase alphanumeric.\n\nRequires: API key with write scope.\n\nArgs:\n    slug: Site identifier\n    username: SFTP username (lowercase, max 32 chars)\n    password: Password (min 8 chars)\n    home_dir: Landing directory inside /var/www. Leave empty to land at\n        /var/www itself, which lists every site directory.\n\nReturns:\n    {\"success\": true, \"","inputSchema":{"type":"object","title":"create_ftp_accountArguments","required":["slug","username","password"],"properties":{"slug":{"type":"string","title":"Slug"},"home_dir":{"type":"string","title":"Home Dir","default":""},"password":{"type":"string","title":"Password"},"username":{"type":"string","title":"Username"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":247,"tokensAfter":247},{"name":"create_mailbox","fixed":{"name":"create_mailbox","description":"Create a mailbox on the site's email domain.\n\nPassword is generated when omitted and returned ONCE — store it.\nEach mailbox adds to the subscription's email billing.\n\nRequires: API key with write scope.\n\nArgs:\n    slug: Site identifier\n    local_part: Part before the @ (e.g. \"info\")\n    display_name: Optional display name\n    password: Optional password (generated if empty)\n\nReturns:\n    {\"email\", \"password\", \"message\"}\n","inputSchema":{"type":"object","title":"create_mailboxArguments","required":["slug","local_part"],"properties":{"slug":{"type":"string","title":"Slug"},"password":{"type":"string","title":"Password","default":""},"local_part":{"type":"string","title":"Local Part"},"display_name":{"type":"string","title":"Display Name","default":""}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":230,"tokensAfter":230},{"name":"create_mailbox_token","fixed":{"name":"create_mailbox_token","description":"Issue a temporary mail-services token with no OMA access. Requires email:signon.\n\nUse 60, 120, ... 1440 minutes. OpenSRS rejects fractional hours; no rounding up.\n","inputSchema":{"type":"object","title":"create_mailbox_tokenArguments","required":["email"],"properties":{"actor":{"type":"string","title":"Actor","default":""},"email":{"type":"string","title":"Email"},"reason":{"type":"string","title":"Reason","default":""},"duration_minutes":{"type":"integer","title":"Duration Minutes","default":60}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":154,"tokensAfter":154},{"name":"create_snapshot","fixed":{"name":"create_snapshot","description":"Create a local container snapshot (async).\n\nRuns in background — returns immediately with status \"creating\".\nPoll list_snapshots() to check when status becomes \"completed\" or \"failed\".\n\nAvailable for VPS, dedicated, and cloud plans (any plan with max_snapshots > 0).\nLocal snapshots are stored on the host disk and count against disk quota.\n\nRequires: API key with write scope.\n\nArgs:\n    slug: Site identifier\n    description: Optional description (max 200 chars)\n\nReturns:\n    {\"id\": \"uuid\", \"name\"","inputSchema":{"type":"object","title":"create_snapshotArguments","required":["slug"],"properties":{"slug":{"type":"string","title":"Slug"},"description":{"type":"string","title":"Description","default":""}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":217,"tokensAfter":217},{"name":"create_support_ticket","fixed":{"name":"create_support_ticket","description":"Open a support ticket with the BorealHost team.\n\nUse this to escalate platform-side problems you cannot fix with the\navailable tools (billing issues, infrastructure faults, API bugs).\nA human answers every ticket — poll get_support_ticket for updates.\n\nRequires: API key with write scope.\n\nArgs:\n    subject: Short summary (max 200 chars)\n    message: Full description (max 20000 chars)\n    category: Optional (e.g. \"technical\", \"billing\")\n    site: Optional site slug the ticket concerns\n\nReturns:\n ","inputSchema":{"type":"object","title":"create_support_ticketArguments","required":["subject","message"],"properties":{"site":{"type":"string","title":"Site","default":""},"message":{"type":"string","title":"Message"},"subject":{"type":"string","title":"Subject"},"category":{"type":"string","title":"Category","default":""}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":249,"tokensAfter":249},{"name":"create_webhook","fixed":{"name":"create_webhook","description":"Register a webhook endpoint for platform events.\n\nEvents (backup failures, security notices, hosting incidents, billing)\nare POSTed as JSON, signed with X-BH-Signature (HMAC-SHA256 of the raw\nbody). The signing secret is returned ONCE. Categories: billing,\nsecurity, hosting, decommission, general — empty list means all.\nEndpoints auto-disable after 20 consecutive failures.\n\nRequires: API key with write scope.\n\nReturns:\n    {\"id\", \"url\", \"events\", \"secret\", \"message\"}\n","inputSchema":{"type":"object","title":"create_webhookArguments","required":["url"],"properties":{"url":{"type":"string","title":"Url"},"events":{"type":"array","items":{},"title":"Events","default":null}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":207,"tokensAfter":207},{"name":"database_search_replace","fixed":{"name":"database_search_replace","description":"Search and replace in WordPress database (e.g. URL migration).\n\nHandles serialized data safely. Use dry_run=true first to preview changes.\n\nRequires: API key with write scope.\n\nArgs:\n    slug: Site identifier\n    old: String to search for (e.g. \"http://old-domain.com\")\n    new: Replacement string (e.g. \"https://new-domain.com\")\n    dry_run: Preview only without making changes (default: true)\n\nReturns:\n    {\"replacements\": 42, \"tables_affected\": 5, \"dry_run\": true}\n","inputSchema":{"type":"object","title":"database_search_replaceArguments","required":["slug","old","new"],"properties":{"new":{"type":"string","title":"New"},"old":{"type":"string","title":"Old"},"slug":{"type":"string","title":"Slug"},"dry_run":{"type":"boolean","title":"Dry Run","default":true}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":235,"tokensAfter":235},{"name":"delete_account","fixed":{"name":"delete_account","description":"Permanently anonymize the account. Cancels subscriptions, deactivates keys.\n\nWARNING: This is irreversible. The account will be soft-deleted and all\npersonal data anonymized. All sites will be decommissioned.\n\nRequires: API key with admin scope.\n\nReturns:\n    {\"success\": true, \"message\": \"Account anonymized\"}\n","inputSchema":{"type":"object","title":"delete_accountArguments","properties":{}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":125,"tokensAfter":125},{"name":"delete_alert_rule","fixed":{"name":"delete_alert_rule","description":"Delete an alert rule.\n\nRequires: API key with write scope.\n\nArgs:\n    slug: Site identifier\n    rule_id: UUID of the alert rule to delete\n\nReturns:\n    {\"deleted\": true, \"id\": \"uuid\"}\n","inputSchema":{"type":"object","title":"delete_alert_ruleArguments","required":["slug","rule_id"],"properties":{"slug":{"type":"string","title":"Slug"},"rule_id":{"type":"string","title":"Rule Id"}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":124,"tokensAfter":124},{"name":"delete_backup","fixed":{"name":"delete_backup","description":"Permanently delete a single backup (metadata + stored snapshot).\n\nIrreversible. Requires: API key with admin scope.\n\nReturns:\n    {\"site\", \"backup_id\", \"deleted\": true}\n","inputSchema":{"type":"object","title":"delete_backupArguments","required":["slug","backup_id"],"properties":{"slug":{"type":"string","title":"Slug"},"backup_id":{"type":"string","title":"Backup Id"}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":118,"tokensAfter":118},{"name":"delete_compute_volume","fixed":{"name":"delete_compute_volume","description":"Permanently delete a volume and everything stored in it.\n\nIrreversible: the instance is released AND the stored data is purged from\nobject storage, so billing genuinely stops. Refuses while an instance is\nlive unless force=True, so a running machine's only copy cannot be\ndestroyed by reflex.\n\nRequires: API key with admin scope.\n\nReturns:\n    {\"id\", \"state\": \"deleted\"}\n","inputSchema":{"type":"object","title":"delete_compute_volumeArguments","required":["volume_id"],"properties":{"force":{"type":"boolean","title":"Force","default":false},"volume_id":{"type":"string","title":"Volume Id"}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":184,"tokensAfter":184},{"name":"delete_cron","fixed":{"name":"delete_cron","description":"Delete a cron job by line number.\n\nGet line numbers from list_cron().\n\nRequires: API key with write scope.\n\nArgs:\n    slug: Site identifier\n    line_number: Line number of the cron entry to delete\n\nReturns:\n    {\"deleted\": true}\n","inputSchema":{"type":"object","title":"delete_cronArguments","required":["slug","line_number"],"properties":{"slug":{"type":"string","title":"Slug"},"line_number":{"type":"integer","title":"Line Number"}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":136,"tokensAfter":136},{"name":"delete_domain_dns","fixed":{"name":"delete_domain_dns","description":"Delete a DNS record from a domain.\n\nRequires: API key with write scope.\n\nArgs:\n    domain_name: Full domain name (e.g. \"example.com\")\n    record_id: ID of the DNS record to delete (from list_domain_dns)\n\nReturns:\n    {\"success\": true, \"message\": \"DNS record deleted\"}\n\nErrors:\n    NOT_FOUND: Domain or record not found\n","inputSchema":{"type":"object","title":"delete_domain_dnsArguments","required":["domain_name","record_id"],"properties":{"record_id":{"type":"string","title":"Record Id"},"domain_name":{"type":"string","title":"Domain Name"}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":170,"tokensAfter":170},{"name":"delete_email_mailbox","fixed":{"name":"delete_email_mailbox","description":"Soft-delete a mailbox. confirm must equal email. Provider recovery window: 30 days.","inputSchema":{"type":"object","title":"delete_email_mailboxArguments","required":["email","confirm"],"properties":{"actor":{"type":"string","title":"Actor","default":""},"email":{"type":"string","title":"Email"},"reason":{"type":"string","title":"Reason","default":""},"confirm":{"type":"string","title":"Confirm"}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":125,"tokensAfter":125},{"name":"delete_file","fixed":{"name":"delete_file","description":"Delete a file or directory from a site's container.\n\nDirectories are deleted recursively. Protected system paths\n(e.g. /etc, /usr) cannot be deleted.\n\nRequires: API key with write scope.\n\nArgs:\n    slug: Site identifier\n    path: Relative path to delete\n\nReturns:\n    {\"success\": true, \"path\": \"...\", \"message\": \"Deleted\"}\n\nErrors:\n    NOT_FOUND: Path doesn't exist\n    FORBIDDEN: Protected system path\n","inputSchema":{"type":"object","title":"delete_fileArguments","required":["slug","path"],"properties":{"path":{"type":"string","title":"Path"},"slug":{"type":"string","title":"Slug"}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":182,"tokensAfter":182},{"name":"delete_mailbox","fixed":{"name":"delete_mailbox","description":"Delete a mailbox (its mail is destroyed).\n\nRequires: API key with write scope.\n\nReturns:\n    {\"email\", \"deleted\": true}\n","inputSchema":{"type":"object","title":"delete_mailboxArguments","required":["slug","email"],"properties":{"slug":{"type":"string","title":"Slug"},"email":{"type":"string","title":"Email"}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":101,"tokensAfter":101},{"name":"delete_redirect","fixed":{"name":"delete_redirect","description":"Delete a redirect rule by source path or id.\n\nRequires: API key with write scope.\n\nReturns:\n    {\"site\", \"deleted\": true}\n","inputSchema":{"type":"object","title":"delete_redirectArguments","required":["slug"],"properties":{"slug":{"type":"string","title":"Slug"},"redirect_id":{"type":"string","title":"Redirect Id","default":""},"source_path":{"type":"string","title":"Source Path","default":""}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":126,"tokensAfter":126},{"name":"delete_snapshot","fixed":{"name":"delete_snapshot","description":"Delete a snapshot (local or B2).\n\nRequires: API key with write scope.\n\nArgs:\n    slug: Site identifier\n    snapshot_id: UUID of the snapshot to delete\n\nReturns:\n    {\"success\": true, \"message\": \"Snapshot deleted\"}\n\nErrors:\n    NOT_FOUND: Snapshot not found\n","inputSchema":{"type":"object","title":"delete_snapshotArguments","required":["slug","snapshot_id"],"properties":{"slug":{"type":"string","title":"Slug"},"snapshot_id":{"type":"string","title":"Snapshot Id"}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":147,"tokensAfter":147},{"name":"delete_subdomain","fixed":{"name":"delete_subdomain","description":"Remove a subdomain: its DNS record, nginx vhost and certificate.\n\nThe inverse of add_subdomain. Removes the DNS record AND the server-side\nvhost and cert, so the name stops resolving and stops being served. Nothing\nelse on the domain is touched.\n\nRequires: API key with write scope.\n\nArgs:\n    domain_name: Registrable domain linked to a site (e.g. \"example.com\")\n    subdomain: Subdomain label only, no dots (e.g. \"blog\")\n\nReturns:\n    {\"fqdn\": \"blog.example.com\", \"domain\": \"example.com\",\n     \"rem","inputSchema":{"type":"object","title":"delete_subdomainArguments","required":["domain_name","subdomain"],"properties":{"subdomain":{"type":"string","title":"Subdomain"},"domain_name":{"type":"string","title":"Domain Name"}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":222,"tokensAfter":222},{"name":"delete_webhook","fixed":{"name":"delete_webhook","description":"Remove a webhook endpoint.\n\nRequires: API key with write scope.\n\nReturns:\n    {\"id\", \"deleted\": true}\n","inputSchema":{"type":"object","title":"delete_webhookArguments","required":["endpoint_id"],"properties":{"endpoint_id":{"type":"string","title":"Endpoint Id"}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":88,"tokensAfter":88},{"name":"disable_email_domain","fixed":{"name":"disable_email_domain","description":"Disable an empty email domain; refuses active or recoverable accounts.","inputSchema":{"type":"object","title":"disable_email_domainArguments","required":["domain"],"properties":{"actor":{"type":"string","title":"Actor","default":""},"domain":{"type":"string","title":"Domain"},"reason":{"type":"string","title":"Reason","default":""}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":107,"tokensAfter":107},{"name":"domain_settings","fixed":{"name":"domain_settings","description":"Update domain settings (auto-renew, WHOIS privacy, registrar lock).\n\nOnly provided (non-None) fields are updated.\n\nRequires: API key with write scope.\n\nArgs:\n    domain_name: Full domain name (e.g. \"example.com\")\n    auto_renew: Optional bool enabling/disabling automatic renewal\n    whois_privacy: Optional bool. False disables saved proxy service. Paid activation via True is refused; request an activation quote through Support.\n    locked: Optional bool enabling/disabling registrar lock (prevent","inputSchema":{"type":"object","title":"domain_settingsArguments","required":["domain_name"],"properties":{"locked":{"type":"boolean","title":"Locked","default":null},"auto_renew":{"type":"boolean","title":"Auto Renew","default":null},"domain_name":{"type":"string","title":"Domain Name"},"whois_privacy":{"type":"boolean","title":"Whois Privacy","default":null}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":256,"tokensAfter":256},{"name":"enable_email_domain","fixed":{"name":"enable_email_domain","description":"Enable an independent email domain; preserve all other email domains.\n\nRequires a verified owned domain and email:write scope. site_slug selects\nbilling when ambiguous. Defaults request 2,000 users and 50,000 aliases.\n","inputSchema":{"type":"object","title":"enable_email_domainArguments","required":["domain"],"properties":{"actor":{"type":"string","title":"Actor","default":""},"domain":{"type":"string","title":"Domain"},"reason":{"type":"string","title":"Reason","default":""},"site_slug":{"type":"string","title":"Site Slug","default":""},"alias_limit":{"type":"integer","title":"Alias Limit","default":50000},"configure_dns":{"type":"boolean","title":"Configure Dns","default":true},"mailbox_limit":{"type":"integer","title":"Mailbox Limit","default":2000},"dmarc_reporting_address":{"type":"string","title":"Dmarc Reporting Address","default":""}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":252,"tokensAfter":252},{"name":"enable_smtp_relay","fixed":{"name":"enable_smtp_relay","description":"Enable an SMTP relay for a site's outbound transactional mail.\n\nProvisions a mail-send-only credential on the platform relay and\nconfigures SPF/DKIM DNS when the domain zone is hosted here. The SMTP\npassword is returned ONCE. Use TLS on port 587, username \"apikey\".\n\nRequires: API key with write scope.\n\nReturns:\n    {\"relay_id\", \"domain\", \"smtp_host\", \"smtp_ports\", \"smtp_username\",\n     \"smtp_password\", \"dns_auto_configured\", \"message\"}\n","inputSchema":{"type":"object","title":"enable_smtp_relayArguments","required":["slug","domain"],"properties":{"slug":{"type":"string","title":"Slug"},"domain":{"type":"string","title":"Domain"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":198,"tokensAfter":198},{"name":"enable_wildcard","fixed":{"name":"enable_wildcard","description":"Route *.domain (every subdomain) to the domain's linked site.\n\nCreates a wildcard DNS record and issues a wildcard certificate via\nACME DNS-01. SLOW — DNS propagation is part of the challenge, expect\n2-5 minutes. Requires the domain to be linked to a site and its DNS\nhosted by BorealHost.\n\nRequires: API key with write scope.\n\nReturns:\n    {\"domain\", \"wildcard\", \"site\", \"ssl_active\", \"not_after\"}\n","inputSchema":{"type":"object","title":"enable_wildcardArguments","required":["domain_name"],"properties":{"domain_name":{"type":"string","title":"Domain Name"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":174,"tokensAfter":174},{"name":"execute_query","fixed":{"name":"execute_query","description":"Run ONE bounded read against a site's database.\n\nOne statement, beginning with SELECT, SHOW, DESCRIBE or EXPLAIN, with no\nsecond statement and no data-modifying clause anywhere in it. The container\nproves the statement is a read before running it and caps the result: 200\nrows by default, 1000 maximum, 2 MB of cell data. `truncated` in the\nresponse says whether a cap was reached.\n\n⚠ THIS TOOL CANNOT CHANGE ANYTHING, AND RETRYING WITH DIFFERENT WORDING WILL\nNOT MAKE IT. Anything that is not a sing","inputSchema":{"type":"object","title":"execute_queryArguments","required":["slug","database","query"],"properties":{"slug":{"type":"string","title":"Slug"},"query":{"type":"string","title":"Query"},"database":{"type":"string","title":"Database"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":222,"tokensAfter":222},{"name":"find_address","fixed":{"name":"find_address","description":"Look up mailbox/alias/forward/free in an authorized email domain.","inputSchema":{"type":"object","title":"find_addressArguments","required":["address"],"properties":{"address":{"type":"string","title":"Address"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":71,"tokensAfter":71},{"name":"get_app_status","fixed":{"name":"get_app_status","description":"Get app installation status and log.\n\nPoll this after install_app() to track progress.\n\nRequires: API key with read scope.\n\nArgs:\n    slug: Site identifier\n    app_id: App ID from install_app() response\n\nReturns:\n    {\"id\": \"uuid\", \"app_name\": \"myapp\", \"status\": \"running\"|\"installing\"|\"failed\",\n     \"install_log\": \"...\"}\n\nStatuses: \"installing\", \"running\", \"stopped\", \"failed\", \"uninstalled\"\n","inputSchema":{"type":"object","title":"get_app_statusArguments","required":["slug","app_id"],"properties":{"slug":{"type":"string","title":"Slug"},"app_id":{"type":"string","title":"App Id"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":188,"tokensAfter":188},{"name":"get_backup_retention","fixed":{"name":"get_backup_retention","description":"Get the backup retention policy for a VPS site.\n\nRequires: API key with read scope.\n\nReturns:\n    {\"site\", \"retention\": {\"keep_daily\", \"keep_weekly\", \"keep_monthly\"}}\n","inputSchema":{"type":"object","title":"get_backup_retentionArguments","required":["slug"],"properties":{"slug":{"type":"string","title":"Slug"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":105,"tokensAfter":105},{"name":"get_billing_portal","fixed":{"name":"get_billing_portal","description":"Get a Stripe billing portal URL for managing payment methods and invoices.\n\nReturns a URL (not a redirect) that the human can open in a browser.\n\nRequires: API key with read scope.\n\nArgs:\n    flow: Optional. Set to \"payment_method_update\" to go directly\n          to the payment method update page.\n\nReturns:\n    {\"url\": \"https://billing.stripe.com/p/session/...\"}\n","inputSchema":{"type":"object","title":"get_billing_portalArguments","properties":{"flow":{"type":"string","title":"Flow","default":""}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":158,"tokensAfter":158},{"name":"get_checkout_status","fixed":{"name":"get_checkout_status","description":"Poll a checkout session for status updates.\n\nCall this after complete_checkout to track payment and provisioning.\n\nPolling strategy:\n- First 60 seconds: every 5 seconds\n- After 60 seconds: every 15 seconds\n- Stop after 10 minutes if not completed\n\nCheckout statuses (in order):\n- \"not_ready\": Missing required fields (slug)\n- \"ready\": All fields set, awaiting payment\n- \"awaiting_payment\": Stripe checkout page opened, waiting for human\n- \"in_progress\": Payment received, site being provisioned\n- \"co","inputSchema":{"type":"object","title":"get_checkout_statusArguments","required":["checkout_id"],"properties":{"checkout_id":{"type":"string","title":"Checkout Id"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":205,"tokensAfter":205},{"name":"get_compute_instance","fixed":{"name":"get_compute_instance","description":"Get live details for a compute instance (state, public IP, accrued cost).\n\nState is synced from the cloud provider on each call. SSH as root once\nstate is \"running\" and public_ip is set.\n\nRequires: API key with read scope.\n\nArgs:\n    instance_id: Instance UUID from launch_compute_instance / list\n\nReturns:\n    {\"id\", \"state\", \"public_ip\", \"hourly_price_cad\", \"accrued_cad\",\n     \"terminate_after\", ...}\n","inputSchema":{"type":"object","title":"get_compute_instanceArguments","required":["instance_id"],"properties":{"instance_id":{"type":"string","title":"Instance Id"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":180,"tokensAfter":180},{"name":"get_compute_volume","fixed":{"name":"get_compute_volume","description":"Get a volume's live state, its instance, and its monthly storage cost.\n\nRequires: API key with read scope.\n\nReturns:\n    Volume dict plus \"monthly_storage_cad\". After attach, poll this until\n    instance.state is \"running\" — then allow a few more minutes for the\n    restore to finish and the machine to reboot into itself.\n","inputSchema":{"type":"object","title":"get_compute_volumeArguments","required":["volume_id"],"properties":{"volume_id":{"type":"string","title":"Volume Id"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":151,"tokensAfter":151},{"name":"get_database_info","fixed":{"name":"get_database_info","description":"Get WordPress database information (size, tables, row counts).\n\nRequires: API key with read scope. WordPress sites only.\n\nArgs:\n    slug: Site identifier\n\nReturns:\n    {\"database\": \"wp_mysite\", \"size_mb\": 45.2,\n     \"tables\": 12, \"total_rows\": 15432}\n","inputSchema":{"type":"object","title":"get_database_infoArguments","required":["slug"],"properties":{"slug":{"type":"string","title":"Slug"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":128,"tokensAfter":128},{"name":"get_database_recovery","fixed":{"name":"get_database_recovery","description":"Poll one database recovery without waiting for completion.\n\nRequires: API key with read scope.\n\nArgs:\n    slug: Site identifier\n    backup_id: UUID of the source backup\n    recovery_id: UUID returned by ``recover_backup_database``\n","inputSchema":{"type":"object","title":"get_database_recoveryArguments","required":["slug","backup_id","recovery_id"],"properties":{"slug":{"type":"string","title":"Slug"},"backup_id":{"type":"string","title":"Backup Id"},"recovery_id":{"type":"string","title":"Recovery Id"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":158,"tokensAfter":158},{"name":"get_email_domain","fixed":{"name":"get_email_domain","description":"Read effective OpenSRS limits, counts, connections and public DNS health.","inputSchema":{"type":"object","title":"get_email_domainArguments","required":["domain"],"properties":{"domain":{"type":"string","title":"Domain"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":74,"tokensAfter":74},{"name":"get_email_status","fixed":{"name":"get_email_status","description":"Email addon status and mailboxes for a site.\n\nRequires: API key with read scope.\n\nReturns:\n    {\"configured\": bool, \"domain\", \"mailboxes\", \"mailbox_list\": [...]}\n","inputSchema":{"type":"object","title":"get_email_statusArguments","required":["slug"],"properties":{"slug":{"type":"string","title":"Slug"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":101,"tokensAfter":101},{"name":"get_email_webmail_url","fixed":{"name":"get_email_webmail_url","description":"Issue a one-use BorealHost link expiring in 60 seconds. Redemption mints provider SSO. Requires email:signon.","inputSchema":{"type":"object","title":"get_email_webmail_urlArguments","required":["email"],"properties":{"actor":{"type":"string","title":"Actor","default":""},"email":{"type":"string","title":"Email"},"reason":{"type":"string","title":"Reason","default":""},"language":{"type":"string","title":"Language","default":"fr"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":135,"tokensAfter":135},{"name":"get_file_recovery","fixed":{"name":"get_file_recovery","description":"Poll one selected-file recovery without waiting for it to finish.\n\nRequires: API key with read scope.\n\nArgs:\n    slug: Site identifier\n    backup_id: UUID of the source backup\n    recovery_id: UUID returned by ``recover_backup_files``\n\nReturns:\n    {\"id\": \"uuid\", \"backup_id\": \"uuid\",\n     \"status\": \"running\"|\"completed\"|\"failed\", \"paths\": [...],\n     \"error\": \"\", ...}\n","inputSchema":{"type":"object","title":"get_file_recoveryArguments","required":["slug","backup_id","recovery_id"],"properties":{"slug":{"type":"string","title":"Slug"},"backup_id":{"type":"string","title":"Backup Id"},"recovery_id":{"type":"string","title":"Recovery Id"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":202,"tokensAfter":202},{"name":"get_logs","fixed":{"name":"get_logs","description":"Retrieve container logs (error, access, or PHP).\n\nRequires: API key with read scope.\n\nArgs:\n    slug: Site identifier\n    log_type: \"error\" (Nginx/Apache errors), \"access\" (HTTP request log),\n              or \"php\" (PHP-FPM errors, WordPress sites only)\n    lines: Number of lines to retrieve (1–500, default: 100)\n    search: Optional keyword filter — only lines containing this string\n\nReturns:\n    {\"log_type\": \"error\", \"lines\": [\"2024-01-15 ... error ...\", ...],\n     \"count\": 42, \"truncated\": fa","inputSchema":{"type":"object","title":"get_logsArguments","required":["slug"],"properties":{"slug":{"type":"string","title":"Slug"},"lines":{"type":"integer","title":"Lines","default":100},"search":{"type":"string","title":"Search","default":""},"log_type":{"type":"string","title":"Log Type","default":"error"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":245,"tokensAfter":245},{"name":"get_mailbox","fixed":{"name":"get_mailbox","description":"Inspect usage, services, aliases count, forwarding/Sieve, autoresponder and label.","inputSchema":{"type":"object","title":"get_mailboxArguments","required":["email"],"properties":{"email":{"type":"string","title":"Email"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":73,"tokensAfter":73},{"name":"get_metrics","fixed":{"name":"get_metrics","description":"Get traffic and performance metrics for a site.\n\nRequires: API key with read scope.\n\nArgs:\n    slug: Site identifier\n    days: Number of days of history (1–90, default: 7)\n\nReturns:\n    {\"requests\": [...], \"bandwidth\": [...], \"errors\": [...],\n     \"period\": {\"start\": \"iso8601\", \"end\": \"iso8601\"}}\n\nErrors:\n    NOT_FOUND: Unknown slug\n    VALIDATION_ERROR: days out of range\n","inputSchema":{"type":"object","title":"get_metricsArguments","required":["slug"],"properties":{"days":{"type":"integer","title":"Days","default":7},"slug":{"type":"string","title":"Slug"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":177,"tokensAfter":177},{"name":"get_resource_snapshot","fixed":{"name":"get_resource_snapshot","description":"Get current resource usage (CPU, memory, disk, load average).\n\nRequires: API key with read scope.\n\nArgs:\n    slug: Site identifier\n\nReturns:\n    {\"cpu_percent\": 12.5, \"memory_mb\": 384, \"memory_total_mb\": 512,\n     \"disk_used_gb\": 3.2, \"disk_total_gb\": 10,\n     \"load_1m\": 0.5, \"load_5m\": 0.3, \"load_15m\": 0.2}\n","inputSchema":{"type":"object","title":"get_resource_snapshotArguments","required":["slug"],"properties":{"slug":{"type":"string","title":"Slug"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":149,"tokensAfter":149},{"name":"get_site_nginx_snippet","fixed":{"name":"get_site_nginx_snippet","description":"Read the custom nginx config for a domain on the BorealHost host proxy.\n\nYour site sits behind a BorealHost reverse proxy that terminates TLS and\nforwards to your container. This returns the custom nginx block applied to\nthat proxy for this domain (empty if you have not set one).\n\nRequires: API key with read scope.\n\nArgs:\n    domain_name: Full domain name (e.g. \"example.com\")\n\nReturns:\n    {\"domain\": \"example.com\", \"content\": \"location ...\", \"exists\": true}\n\nErrors:\n    NOT_FOUND: Domain not fou","inputSchema":{"type":"object","title":"get_site_nginx_snippetArguments","required":["domain_name"],"properties":{"domain_name":{"type":"string","title":"Domain Name"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":208,"tokensAfter":208},{"name":"get_site_status","fixed":{"name":"get_site_status","description":"Get detailed status of a hosted site including resources, domains, and modules.\n\nRequires: API key with read scope.\n\nArgs:\n    slug: Site identifier (the slug chosen during checkout)\n\nReturns:\n    {\"slug\": \"my-site\", \"plan\": \"site_starter\", \"status\": \"active\",\n     \"domains\": [\"my-site.borealhost.ai\"], \"modules\": {...},\n     \"resources\": {\"memory_mb\": 512, \"cpu_cores\": 1, \"disk_gb\": 10},\n     \"created_at\": \"iso8601\"}\n\nErrors:\n    NOT_FOUND: Unknown slug or not owned by this account\n","inputSchema":{"type":"object","title":"get_site_statusArguments","required":["slug"],"properties":{"slug":{"type":"string","title":"Slug"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":200,"tokensAfter":200},{"name":"get_smtp_relay","fixed":{"name":"get_smtp_relay","description":"List SMTP relay credentials for a site, with domain-auth status.\n\nRequires: API key with read scope.\n\nReturns:\n    {\"relays\": [{\"relay_id\", \"domain\", \"status\",\n                 \"domain_authenticated\"}, ...]}\n","inputSchema":{"type":"object","title":"get_smtp_relayArguments","required":["slug"],"properties":{"slug":{"type":"string","title":"Slug"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":114,"tokensAfter":114},{"name":"get_snapshot_usage","fixed":{"name":"get_snapshot_usage","description":"Get snapshot disk usage and quota info for a site.\n\nRequires: API key with read scope.\n\nArgs:\n    slug: Site identifier\n\nReturns:\n    {\"disk_quota_gb\": 200, \"max_snapshots\": 5, \"snapshot_count\": 2,\n     \"local_snapshot_bytes\": 1234, \"b2_snapshot_bytes\": 5678,\n     \"can_create\": true}\n","inputSchema":{"type":"object","title":"get_snapshot_usageArguments","required":["slug"],"properties":{"slug":{"type":"string","title":"Slug"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":139,"tokensAfter":139},{"name":"get_ssh_info","fixed":{"name":"get_ssh_info","description":"Get SSH connection info for a VPS/dedicated site.\n\nOnly available for VPS/dedicated plans (not shared hosting).\n\nRequires: API key with read scope.\n\nArgs:\n    slug: Site identifier\n\nReturns:\n    {\"host\": \"184.107.x.x\", \"port\": 22, \"username\": \"admin\",\n     \"ssh_command\": \"ssh admin@184.107.x.x\"}\n\nErrors:\n    NOT_FOUND: Unknown slug\n    FORBIDDEN: Plan does not support SSH (shared plans)\n","inputSchema":{"type":"object","title":"get_ssh_infoArguments","required":["slug"],"properties":{"slug":{"type":"string","title":"Slug"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":167,"tokensAfter":167},{"name":"get_stack_info","fixed":{"name":"get_stack_info","description":"Get detailed system stack information (OS, PHP, DB, web server versions).\n\nRequires: API key with read scope.\n\nArgs:\n    slug: Site identifier\n\nReturns:\n    {\"os\": \"Debian 12\", \"kernel\": \"6.1.0\",\n     \"php\": \"8.3.4\", \"mysql\": \"10.11.6-MariaDB\",\n     \"nginx\": \"1.24.0\", \"wordpress\": \"6.5\"}\n","inputSchema":{"type":"object","title":"get_stack_infoArguments","required":["slug"],"properties":{"slug":{"type":"string","title":"Slug"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":141,"tokensAfter":141},{"name":"get_support_ticket","fixed":{"name":"get_support_ticket","description":"Get a support ticket with its full message thread.\n\nRequires: API key with read scope.\n\nArgs:\n    ticket_id: Ticket UUID from list_support_tickets\n\nReturns:\n    {\"id\", \"subject\", \"status\", \"messages\": [...]}\n","inputSchema":{"type":"object","title":"get_support_ticketArguments","required":["ticket_id"],"properties":{"ticket_id":{"type":"string","title":"Ticket Id"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":120,"tokensAfter":120},{"name":"get_wallet","fixed":{"name":"get_wallet","description":"The account's prepaid balance, and what THIS key may spend from it.\n\nTwo ceilings, and both apply: the balance bounds the ACCOUNT, the allowance\nbounds this KEY within it. Plan against `spendable_cents`, which is the\nlower of the two — a $50 balance behind a $5 allowance means $5, and\nplanning against the balance is planning a purchase that gets refused.\n\n`can_spend: false` with a non-zero balance is normal and means this key has\nno budget allocated. That is not a bug: a key with no allowance ma","inputSchema":{"type":"object","title":"get_walletArguments","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":174,"tokensAfter":174},{"name":"get_webmail_url","fixed":{"name":"get_webmail_url","description":"One-time webmail single-sign-on URL for a mailbox.\n\nRequires: API key with write scope.\n\nReturns:\n    {\"email\", \"url\"}\n","inputSchema":{"type":"object","title":"get_webmail_urlArguments","required":["slug","email"],"properties":{"slug":{"type":"string","title":"Slug"},"email":{"type":"string","title":"Email"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":102,"tokensAfter":102},{"name":"list_alert_rules","fixed":{"name":"list_alert_rules","description":"List user-configurable alert rules for a site.\n\nRequires: API key with read scope.\n\nArgs:\n    slug: Site identifier\n\nReturns:\n    [{\"id\": \"uuid\", \"metric\": \"disk\", \"operator\": \"gt\",\n      \"threshold\": 90, \"severity\": \"warning\", \"enabled\": true,\n      \"cooldown_minutes\": 30, \"notify_email\": true}]\n","inputSchema":{"type":"object","title":"list_alert_rulesArguments","required":["slug"],"properties":{"slug":{"type":"string","title":"Slug"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":145,"tokensAfter":145},{"name":"list_api_keys","fixed":{"name":"list_api_keys","description":"List all API keys for the account.\n\nShows key metadata (name, prefix, scopes, last used) but never the\nfull key value.\n\nRequires: API key with read scope.\n\nReturns:\n    [{\"id\": \"uuid\", \"name\": \"My Key\", \"prefix\": \"bh_a2...\",\n      \"scopes\": [\"read\", \"write\"], \"is_active\": true,\n      \"created_at\": \"iso8601\", \"last_used_at\": \"iso8601\"|null,\n      \"site_slug\": null|\"my-site\"}]\n","inputSchema":{"type":"object","title":"list_api_keysArguments","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":152,"tokensAfter":152},{"name":"list_apps","fixed":{"name":"list_apps","description":"List installed apps on a site.\n\nRequires: API key with read scope.\n\nArgs:\n    slug: Site identifier\n\nReturns:\n    {\"apps\": [{\"id\": \"uuid\", \"app_name\": \"myapp\", \"template_slug\": \"django\",\n     \"status\": \"running\", \"domain\": \"myapp.mysite.borealhost.ai\"}]}\n","inputSchema":{"type":"object","title":"list_appsArguments","required":["slug"],"properties":{"slug":{"type":"string","title":"Slug"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":128,"tokensAfter":128},{"name":"list_backups","fixed":{"name":"list_backups","description":"List all backups for a site (automatic and manual).\n\nRequires: API key with read scope.\n\nArgs:\n    slug: Site identifier\n\nReturns:\n    [{\"id\": \"uuid\", \"backup_type\": \"auto\"|\"manual\", \"status\": \"completed\",\n     \"size_bytes\": 1234, \"size_display\": \"1.2 Mo\",\n     \"timestamp\": \"iso8601\", \"notes\": \"...\"}]\n","inputSchema":{"type":"object","title":"list_backupsArguments","required":["slug"],"properties":{"slug":{"type":"string","title":"Slug"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":145,"tokensAfter":145},{"name":"list_checkouts","fixed":{"name":"list_checkouts","description":"List checkouts belonging to the authenticated account.\n\nRequires: API key. Only checkouts with a recorded owner appear — every\ncheckout created while authenticated, plus every checkout that reached\npayment. An anonymous checkout whose one-shot secret was lost cannot be\nlisted; create checkouts authenticated to keep them addressable.\n\nArgs:\n    status: Optional filter — \"not_ready\", \"ready\", \"awaiting_payment\",\n            \"completed\", \"canceled\", \"failed\".\n\nReturns:\n    {\"checkouts\": [{...same s","inputSchema":{"type":"object","title":"list_checkoutsArguments","properties":{"status":{"type":"string","title":"Status","default":""}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":197,"tokensAfter":197},{"name":"list_compute_images","fixed":{"name":"list_compute_images","description":"List OS images available for on-demand compute instances.\n\nRequires: API key with read scope.\n\nReturns:\n    {\"images\": [{\"id\": \"UBUNTU_24_04_64BIT\", \"name\": \"Ubuntu 24.04 LTS (x86_64)\",\n                 \"family\": \"linux\", \"flavour\": \"ubuntu\"}, ...]}\n","inputSchema":{"type":"object","title":"list_compute_imagesArguments","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":114,"tokensAfter":114},{"name":"list_compute_instances","fixed":{"name":"list_compute_instances","description":"List your on-demand compute instances with month-to-date spend.\n\nRequires: API key with read scope.\n\nReturns:\n    {\"instances\": [...], \"month_to_date_spend_cad\": 12.34,\n     \"monthly_spend_cap_cad\": 500.0}\n","inputSchema":{"type":"object","title":"list_compute_instancesArguments","properties":{"include_terminated":{"type":"boolean","title":"Include Terminated","default":false}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":124,"tokensAfter":124},{"name":"list_compute_types","fixed":{"name":"list_compute_types","description":"List on-demand compute instance types with hourly CAD prices.\n\nOn-demand instances are real cloud VMs in Canada (Montreal region),\nbilled per minute (1-hour minimum) post-paid onto your existing\nBorealHost subscription. Use them for short-lived extra compute\n(builds, batch jobs, experiments).\n\nRequires: API key with read scope.\n\nReturns:\n    {\"region\": \"ca-central-1\", \"currency\": \"CAD\",\n     \"billing\": \"hourly, post-paid; billing runs until the instance is terminated\",\n     \"types\": [{\"type\": \"l","inputSchema":{"type":"object","title":"list_compute_typesArguments","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":184,"tokensAfter":184},{"name":"list_compute_volumes","fixed":{"name":"list_compute_volumes","description":"List your compute volumes — machines that survive instance termination.\n\nA volume is a whole machine (packages, drivers, services, users, data)\nstored in Canada. Detaching destroys the instance but keeps the machine;\nattaching restores it onto a fresh instance, optionally of a DIFFERENT\ntype. That is how you move a workload from a small CPU box to a big GPU\nbox without rebuilding it.\n\nRequires: API key with read scope.\n\nReturns:\n    {\"volumes\": [{\"id\", \"name\", \"state\", \"instance_type\", \"stored_g","inputSchema":{"type":"object","title":"list_compute_volumesArguments","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":183,"tokensAfter":183},{"name":"list_cron","fixed":{"name":"list_cron","description":"List cron jobs on a site.\n\nRequires: API key with read scope.\n\nArgs:\n    slug: Site identifier\n\nReturns:\n    {\"jobs\": [{\"line\": 1, \"schedule\": \"*/5 * * * *\",\n     \"command\": \"/usr/bin/php /var/www/html/wp-cron.php\"}, ...]}\n","inputSchema":{"type":"object","title":"list_cronArguments","required":["slug"],"properties":{"slug":{"type":"string","title":"Slug"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":117,"tokensAfter":117},{"name":"list_databases","fixed":{"name":"list_databases","description":"List all databases on a site's container.\n\nRequires: API key with read scope.\n\nArgs:\n    slug: Site identifier\n\nReturns:\n    {\"databases\": [\"wordpress\", \"app_db\", ...]}\n","inputSchema":{"type":"object","title":"list_databasesArguments","required":["slug"],"properties":{"slug":{"type":"string","title":"Slug"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":102,"tokensAfter":102},{"name":"list_db_users","fixed":{"name":"list_db_users","description":"List database users for a site.\n\nRequires: API key with read scope.\n\nReturns:\n    {\"engine\", \"users\": [{\"user\", \"host\", ...}, ...]}\n","inputSchema":{"type":"object","title":"list_db_usersArguments","required":["slug"],"properties":{"slug":{"type":"string","title":"Slug"},"engine":{"type":"string","title":"Engine","default":"mysql"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":109,"tokensAfter":109},{"name":"list_domain_dns","fixed":{"name":"list_domain_dns","description":"List all DNS records for a domain.\n\nReturns DNS records at the domain level (independent of site-level\nmanage_dns). Use this for domains that may not be linked to a site.\n\nRequires: API key with read scope.\n\nArgs:\n    domain_name: Full domain name (e.g. \"example.com\")\n\nReturns:\n    [{\"id\": \"record-id\", \"type\": \"A\", \"subdomain\": \"www\",\n      \"value\": \"1.2.3.4\"}]\n\nThe DNS provider manages the effective TTL and does not expose a\nper-record value through this service.\n\nErrors:\n    NOT_FOUND: Domain ","inputSchema":{"type":"object","title":"list_domain_dnsArguments","required":["domain_name"],"properties":{"domain_name":{"type":"string","title":"Domain Name"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":207,"tokensAfter":207},{"name":"list_domains","fixed":{"name":"list_domains","description":"List all domains owned by the authenticated user.\n\nRequires: API key with read scope.\n\nReturns:\n    [{\"domain\": \"example.com\", \"status\": \"active\",\n      \"expires_at\": \"iso8601\", \"auto_renew\": true,\n      \"linked_site\": \"my-site\"}]\n","inputSchema":{"type":"object","title":"list_domainsArguments","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":105,"tokensAfter":105},{"name":"list_email_audit","fixed":{"name":"list_email_audit","description":"List email API mutation/credential issuance attempts, actor, reason and outcome.","inputSchema":{"type":"object","title":"list_email_auditArguments","required":["domain"],"properties":{"email":{"type":"string","title":"Email","default":""},"limit":{"type":"integer","title":"Limit","default":100},"since":{"type":"string","title":"Since","default":""},"cursor":{"type":"string","title":"Cursor","default":""},"domain":{"type":"string","title":"Domain"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":139,"tokensAfter":139},{"name":"list_email_domains","fixed":{"name":"list_email_domains","description":"List email domains visible to this key, with cluster connection settings.","inputSchema":{"type":"object","title":"list_email_domainsArguments","properties":{"limit":{"type":"integer","title":"Limit","default":100},"cursor":{"type":"string","title":"Cursor","default":""}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":89,"tokensAfter":89},{"name":"list_files","fixed":{"name":"list_files","description":"List files and directories in a site's container.\n\nPath scoping depends on the plan:\n- Shared plans: rooted at wp-content/ (WordPress content directory)\n- VPS/dedicated plans: full filesystem access\n\nRequires: API key with read scope.\n\nArgs:\n    slug: Site identifier\n    path: Relative path to list (empty for root of accessible area)\n\nReturns:\n    {\"path\": \"/\", \"entries\": [{\"name\": \"index.php\", \"type\": \"file\",\n     \"size\": 1234, \"modified\": \"iso8601\"}, {\"name\": \"uploads\",\n     \"type\": \"directory","inputSchema":{"type":"object","title":"list_filesArguments","required":["slug"],"properties":{"path":{"type":"string","title":"Path","default":""},"slug":{"type":"string","title":"Slug"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":214,"tokensAfter":214},{"name":"list_firewall_rules","fixed":{"name":"list_firewall_rules","description":"List IP allow/deny firewall rules for a site.\n\nRules are implemented as Nginx allow/deny directives per container.\n\nRequires: API key with read scope.\n\nArgs:\n    slug: Site identifier\n\nReturns:\n    {\"rules\": [{\"ip\": \"1.2.3.4\", \"action\": \"deny\"},\n     {\"ip\": \"10.0.0.0/8\", \"action\": \"allow\"}]}\n","inputSchema":{"type":"object","title":"list_firewall_rulesArguments","required":["slug"],"properties":{"slug":{"type":"string","title":"Slug"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":144,"tokensAfter":144},{"name":"list_ftp_accounts","fixed":{"name":"list_ftp_accounts","description":"List SFTP accounts on a site.\n\nAlso returns the host and port to connect to. Do not use the site's domain\nfor SFTP: it is Cloudflare-proxied and only carries HTTP(S).\n\nRequires: API key with read scope.\n\nArgs:\n    slug: Site identifier\n\nReturns:\n    {\"accounts\": [{\"username\": \"sftpuser\", \"home\": \"/wordpress\", \"uid\": 1001}],\n     \"configured\": true,\n     \"connection\": {\"host\": \"1.2.3.4\", \"port\": 9312, \"protocol\": \"SFTP\"}}\n","inputSchema":{"type":"object","title":"list_ftp_accountsArguments","required":["slug"],"properties":{"slug":{"type":"string","title":"Slug"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":182,"tokensAfter":182},{"name":"list_mailbox_aliases","fixed":{"name":"list_mailbox_aliases","description":"List a mailbox's aliases with pagination.","inputSchema":{"type":"object","title":"list_mailbox_aliasesArguments","required":["email"],"properties":{"email":{"type":"string","title":"Email"},"limit":{"type":"integer","title":"Limit","default":100},"cursor":{"type":"string","title":"Cursor","default":""}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":99,"tokensAfter":99},{"name":"list_mailboxes","fixed":{"name":"list_mailboxes","description":"Page through a domain's mailboxes, optionally filtering by organisation label.","inputSchema":{"type":"object","title":"list_mailboxesArguments","required":["domain"],"properties":{"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label","default":null},"limit":{"type":"integer","title":"Limit","default":100},"cursor":{"type":"string","title":"Cursor","default":""},"domain":{"type":"string","title":"Domain"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":130,"tokensAfter":130},{"name":"list_modules","fixed":{"name":"list_modules","description":"List AI modules and their enabled/disabled state for a site.\n\nAlso returns the list of modules available for the site's plan.\n\nRequires: API key with read scope.\n\nArgs:\n    slug: Site identifier\n\nReturns:\n    {\"modules\": {\"chatbot\": true, \"seo\": false, \"translation\": false,\n     \"content\": false}, \"available\": [\"chatbot\", \"seo\", \"translation\", \"content\"]}\n\nErrors:\n    NOT_FOUND: Unknown slug\n","inputSchema":{"type":"object","title":"list_modulesArguments","required":["slug"],"properties":{"slug":{"type":"string","title":"Slug"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":170,"tokensAfter":170},{"name":"list_php_versions","fixed":{"name":"list_php_versions","description":"List available PHP versions and the currently active one.\n\nRequires: API key with read scope.\n\nArgs:\n    slug: Site identifier\n\nReturns:\n    {\"versions\": [{\"version\": \"8.1\", \"active\": false},\n     {\"version\": \"8.2\", \"active\": false},\n     {\"version\": \"8.3\", \"active\": true}]}\n","inputSchema":{"type":"object","title":"list_php_versionsArguments","required":["slug"],"properties":{"slug":{"type":"string","title":"Slug"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":138,"tokensAfter":138},{"name":"list_plans","fixed":{"name":"list_plans","description":"List available hosting plans with pricing and resources.\n\nNo authentication needed.\n\nArgs:\n    track: Filter by plan track. Valid values: \"single_site\", \"agency\".\n        ⚠ The track is not the site count — most plans on BOTH tracks\n        include several sites (site_starter 5, site_plus 8, site_pro 12).\n        Read `max_sites` on the plan, and use add_site() to fill a slot.\n           Leave empty to list all tracks.\n    include_deprecated: Include deprecated plans (default: false)\n\nReturns:\n ","inputSchema":{"type":"object","title":"list_plansArguments","properties":{"track":{"type":"string","title":"Track","default":""},"include_deprecated":{"type":"boolean","title":"Include Deprecated","default":false}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":215,"tokensAfter":215},{"name":"list_plugins","fixed":{"name":"list_plugins","description":"List installed WordPress plugins with status.\n\nRequires: API key with read scope. WordPress sites only.\n\nArgs:\n    slug: Site identifier\n\nReturns:\n    {\"plugins\": [{\"name\": \"akismet\", \"status\": \"active\", \"version\": \"5.3\",\n     \"update_available\": false}, ...]}\n","inputSchema":{"type":"object","title":"list_pluginsArguments","required":["slug"],"properties":{"slug":{"type":"string","title":"Slug"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":130,"tokensAfter":130},{"name":"list_port_forwards","fixed":{"name":"list_port_forwards","description":"List ports published from this site's container to the public internet.\n\nThese are iptables DNAT rules on the node, NOT the IP allow/deny rules that\nadd_firewall_rule manages — those two tools do unrelated things and neither\nsubstitutes for the other.\n\nRequires: API key with read scope.\n\nArgs:\n    slug: Site identifier\n\nReturns:\n    {\"port_forwards\": [{\"id\": \"...\", \"external_port\": 3478,\n      \"internal_port\": 3478, \"protocol\": \"udp\", \"status\": \"active\",\n      \"public_address\": \"203.0.113.5:3478","inputSchema":{"type":"object","title":"list_port_forwardsArguments","required":["slug"],"properties":{"slug":{"type":"string","title":"Slug"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":202,"tokensAfter":202},{"name":"list_redirects","fixed":{"name":"list_redirects","description":"List HTTP redirect rules for a site.\n\nRequires: API key with read scope.\n\nReturns:\n    [{\"id\", \"source_path\", \"target_url\", \"redirect_type\"}, ...]\n","inputSchema":{"type":"object","title":"list_redirectsArguments","required":["slug"],"properties":{"slug":{"type":"string","title":"Slug"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":96,"tokensAfter":96},{"name":"list_snapshots","fixed":{"name":"list_snapshots","description":"List all snapshots and scheduled snapshots for a site.\n\nRequires: API key with read scope.\n\nArgs:\n    slug: Site identifier\n\nReturns:\n    {\"snapshots\": [{\"id\": \"uuid\", \"name\": \"snap-...\", \"status\": \"completed\",\n     \"storage_type\": \"local\"|\"b2\", \"size_bytes\": 1234, \"size_display\": \"1.2 Mo\",\n     \"created_at\": \"iso8601\"}], \"scheduled\": [...]}\n","inputSchema":{"type":"object","title":"list_snapshotsArguments","required":["slug"],"properties":{"slug":{"type":"string","title":"Slug"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":159,"tokensAfter":159},{"name":"list_subdomains","fixed":{"name":"list_subdomains","description":"List subdomain DNS records for a domain you own.\n\nRequires: API key with read scope.\n\nArgs:\n    domain_name: Registrable domain (e.g. \"example.com\")\n\nReturns:\n    [{\"fqdn\": \"blog.example.com\", \"subdomain\": \"blog\",\n      \"record_type\": \"A\", \"value\": \"1.2.3.4\", \"is_auto\": true}, ...]\n\nErrors:\n    NOT_FOUND: Domain not found\n","inputSchema":{"type":"object","title":"list_subdomainsArguments","required":["domain_name"],"properties":{"domain_name":{"type":"string","title":"Domain Name"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":157,"tokensAfter":157},{"name":"list_subscriptions","fixed":{"name":"list_subscriptions","description":"List all subscriptions with plan details, pricing, status, and site slug.\n\nRequires: API key with read scope.\n\nReturns:\n    [{\"id\": \"uuid\", \"plan_slug\": \"site_starter\", \"plan_name\": \"Starter\",\n      \"status\": \"active\", \"billing_period\": \"monthly\",\n      \"price\": {\"amount\": 500, \"currency\": \"cad\"},\n      \"site_slug\": \"my-site\", \"created_at\": \"iso8601\"}]\n","inputSchema":{"type":"object","title":"list_subscriptionsArguments","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":148,"tokensAfter":148},{"name":"list_support_tickets","fixed":{"name":"list_support_tickets","description":"List the account's support tickets.\n\nRequires: API key with read scope.\n\nArgs:\n    status: Optional filter (e.g. \"open\", \"closed\")\n\nReturns:\n    [{\"id\", \"subject\", \"status\", \"category\", \"created_at\", ...}, ...]\n","inputSchema":{"type":"object","title":"list_support_ticketsArguments","properties":{"status":{"type":"string","title":"Status","default":""}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":119,"tokensAfter":119},{"name":"list_tables","fixed":{"name":"list_tables","description":"List tables in a database.\n\nRequires: API key with read scope.\n\nArgs:\n    slug: Site identifier\n    database: Database name\n\nReturns:\n    {\"tables\": [{\"name\": \"wp_posts\", \"rows\": 1234, \"size_mb\": 5.2}, ...]}\n","inputSchema":{"type":"object","title":"list_tablesArguments","required":["slug","database"],"properties":{"slug":{"type":"string","title":"Slug"},"database":{"type":"string","title":"Database"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":129,"tokensAfter":129},{"name":"list_themes","fixed":{"name":"list_themes","description":"List installed WordPress themes with status.\n\nRequires: API key with read scope. WordPress sites only.\n\nArgs:\n    slug: Site identifier\n\nReturns:\n    {\"themes\": [{\"name\": \"twentytwentyfour\", \"status\": \"active\",\n     \"version\": \"1.0\", \"update_available\": false}, ...]}\n","inputSchema":{"type":"object","title":"list_themesArguments","required":["slug"],"properties":{"slug":{"type":"string","title":"Slug"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":131,"tokensAfter":131},{"name":"list_webhooks","fixed":{"name":"list_webhooks","description":"List webhook endpoints registered on the account.\n\nRequires: API key with read scope.\n\nReturns:\n    [{\"id\", \"url\", \"events\", \"is_active\", \"last_status\",\n      \"failure_count\"}, ...]\n","inputSchema":{"type":"object","title":"list_webhooksArguments","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":90,"tokensAfter":90},{"name":"read_file","fixed":{"name":"read_file","description":"Read the contents of a file from a site's container.\n\nMax file size: 512KB. Binary files are rejected — use the site's\nfile manager or SSH for binary files.\n\nRequires: API key with read scope.\n\nArgs:\n    slug: Site identifier\n    path: Relative path to the file\n\nReturns:\n    {\"path\": \"wp-config.php\", \"content\": \"<?php ...\",\n     \"size\": 1234, \"encoding\": \"utf-8\"}\n\nErrors:\n    NOT_FOUND: File doesn't exist\n    VALIDATION_ERROR: File is binary or exceeds 512KB\n","inputSchema":{"type":"object","title":"read_fileArguments","required":["slug","path"],"properties":{"path":{"type":"string","title":"Path"},"slug":{"type":"string","title":"Slug"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":199,"tokensAfter":199},{"name":"remove_firewall_rule","fixed":{"name":"remove_firewall_rule","description":"Remove an IP firewall rule and reload Nginx.\n\nRequires: API key with write scope.\n\nArgs:\n    slug: Site identifier\n    ip: IP address or CIDR to remove (must match exactly)\n\nReturns:\n    {\"removed\": true, \"ip\": \"1.2.3.4\"}\n","inputSchema":{"type":"object","title":"remove_firewall_ruleArguments","required":["slug","ip"],"properties":{"ip":{"type":"string","title":"Ip"},"slug":{"type":"string","title":"Slug"}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":132,"tokensAfter":132},{"name":"remove_ftp_account","fixed":{"name":"remove_ftp_account","description":"Remove an SFTP account from a site.\n\nRequires: API key with write scope.\n\nArgs:\n    slug: Site identifier\n    username: SFTP username to remove\n\nReturns:\n    {\"removed\": true, \"username\": \"sftpuser\"}\n","inputSchema":{"type":"object","title":"remove_ftp_accountArguments","required":["slug","username"],"properties":{"slug":{"type":"string","title":"Slug"},"username":{"type":"string","title":"Username"}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":130,"tokensAfter":130},{"name":"remove_mailbox_alias","fixed":{"name":"remove_mailbox_alias","description":"Remove one alias, preserving the mailbox and other aliases.","inputSchema":{"type":"object","title":"remove_mailbox_aliasArguments","required":["email","alias"],"properties":{"actor":{"type":"string","title":"Actor","default":""},"alias":{"type":"string","title":"Alias"},"email":{"type":"string","title":"Email"},"reason":{"type":"string","title":"Reason","default":""}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":117,"tokensAfter":117},{"name":"remove_port_forward","fixed":{"name":"remove_port_forward","description":"Stop publishing a port, by the rule id from list_port_forwards.\n\nRequires: API key with write scope.\n\nArgs:\n    slug: Site identifier\n    forward_id: Rule id (uuid) from list_port_forwards\n\nReturns:\n    {\"removed\": true, \"forward_id\": \"...\"}\n","inputSchema":{"type":"object","title":"remove_port_forwardArguments","required":["slug","forward_id"],"properties":{"slug":{"type":"string","title":"Slug"},"forward_id":{"type":"string","title":"Forward Id"}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":144,"tokensAfter":144},{"name":"reset_email_mailbox_password","fixed":{"name":"reset_email_mailbox_password","description":"Reset password and terminate IMAP/POP sessions. Requires email:signon.","inputSchema":{"type":"object","title":"reset_email_mailbox_passwordArguments","required":["email"],"properties":{"actor":{"type":"string","title":"Actor","default":""},"email":{"type":"string","title":"Email"},"reason":{"type":"string","title":"Reason","default":""},"new_password":{"type":"string","title":"New Password","default":""}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":130,"tokensAfter":130},{"name":"reset_mailbox_password","fixed":{"name":"reset_mailbox_password","description":"Reset a mailbox password (generated when omitted, returned ONCE).\n\nRequires: API key with write scope.\n\nReturns:\n    {\"email\", \"password\", \"message\"}\n","inputSchema":{"type":"object","title":"reset_mailbox_passwordArguments","required":["slug","email"],"properties":{"slug":{"type":"string","title":"Slug"},"email":{"type":"string","title":"Email"},"new_password":{"type":"string","title":"New Password","default":""}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":134,"tokensAfter":134},{"name":"revoke_api_key","fixed":{"name":"revoke_api_key","description":"Revoke (deactivate) an API key. The key stops working immediately.\n\nRequires: API key with write scope.\n\nArgs:\n    key_id: UUID of the key to revoke (from list_api_keys or whoami)\n\nReturns:\n    {\"success\": true, \"message\": \"API key revoked\"}\n\nErrors:\n    NOT_FOUND: Key not found or already revoked\n","inputSchema":{"type":"object","title":"revoke_api_keyArguments","required":["key_id"],"properties":{"key_id":{"type":"string","title":"Key Id"}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":141,"tokensAfter":141},{"name":"revoke_smtp_relay","fixed":{"name":"revoke_smtp_relay","description":"Revoke an SMTP relay credential (immediate at the relay).\n\nRequires: API key with write scope.\n\nReturns:\n    {\"relay_id\", \"revoked\": true}\n","inputSchema":{"type":"object","title":"revoke_smtp_relayArguments","required":["slug","relay_id"],"properties":{"slug":{"type":"string","title":"Slug"},"relay_id":{"type":"string","title":"Relay Id"}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":111,"tokensAfter":111},{"name":"run_malware_scan","fixed":{"name":"run_malware_scan","description":"Run a ClamAV malware scan on a site's container.\n\nScans the web root (or specified path) for malware, viruses, and trojans.\nClamAV is installed automatically if not present. Excludes node_modules,\nvendor, .git, and cache directories.\n\nMay take up to 5 minutes for large sites.\n\nRequires: API key with write scope.\n\nArgs:\n    slug: Site identifier\n    path: Directory to scan (default: /var/www/html)\n\nReturns:\n    {\"infected_files\": [{\"path\": \"/var/www/html/shell.php\", \"threat\": \"Php.Malware.Agent\"}","inputSchema":{"type":"object","title":"run_malware_scanArguments","required":["slug"],"properties":{"path":{"type":"string","title":"Path","default":""},"slug":{"type":"string","title":"Slug"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":213,"tokensAfter":213},{"name":"schedule_snapshot","fixed":{"name":"schedule_snapshot","description":"Schedule a snapshot for future execution.\n\nRequires: API key with write scope. Max 3 pending schedules per site.\n\nArgs:\n    slug: Site identifier\n    scheduled_at: ISO 8601 datetime (must be in the future)\n    description: Optional description (max 200 chars)\n\nReturns:\n    {\"id\": \"uuid\", \"scheduled_at\": \"iso8601\", \"status\": \"scheduled\"}\n\nErrors:\n    VALIDATION_ERROR: Invalid datetime, not in future, or too many pending\n","inputSchema":{"type":"object","title":"schedule_snapshotArguments","required":["slug","scheduled_at"],"properties":{"slug":{"type":"string","title":"Slug"},"description":{"type":"string","title":"Description","default":""},"scheduled_at":{"type":"string","title":"Scheduled At"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":216,"tokensAfter":216},{"name":"search_domain","fixed":{"name":"search_domain","description":"Check domain availability and get pricing.\n\nRequires: API key with read scope.\n\nArgs:\n    domain: Full domain name (e.g. \"example.com\", \"mybiz.ca\")\n\nReturns:\n    {\"domain\": \"example.com\", \"available\": true,\n     \"registration_estimate_cad\": \"15.99\", \"currency\": \"CAD\",\n     \"price_cad_includes_privacy\": false, \"total_cad\": null,\n     \"quote_required\": true}\n\nNote: .ca domains require ca_legal_type when registering.\n","inputSchema":{"type":"object","title":"search_domainArguments","required":["domain"],"properties":{"domain":{"type":"string","title":"Domain"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":179,"tokensAfter":179},{"name":"set_api_key","fixed":{"name":"set_api_key","description":"Set your BorealHost API key for this session.\n\nCall this if you already have an API key (from checkout completion,\nthe BorealHost panel, or a container claim). All subsequent tool calls\nwill use this key for authentication.\n\nArgs:\n    api_key: Your BorealHost API key (format: bh_<48 hex chars>)\n\nReturns:\n    {\"success\": true, \"message\": \"API key set for this session\",\n     \"key_prefix\": \"bh_...\"}\n","inputSchema":{"type":"object","title":"set_api_keyArguments","required":["api_key"],"properties":{"api_key":{"type":"string","title":"Api Key"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":169,"tokensAfter":169},{"name":"set_backup_retention","fixed":{"name":"set_backup_retention","description":"Set the backup retention policy for a VPS site.\n\nStorage is billed on real stored bytes, so deeper history costs the\ncustomer, not the platform. Values are clamped to platform bounds; the\nresponse reports what was actually stored. Pass -1 to leave a knob\nunchanged, or reset=true to restore defaults.\n\nRequires: API key with write scope.\n\nReturns:\n    {\"site\", \"retention\": {...}}\n","inputSchema":{"type":"object","title":"set_backup_retentionArguments","required":["slug"],"properties":{"slug":{"type":"string","title":"Slug"},"reset":{"type":"boolean","title":"Reset","default":false},"keep_daily":{"type":"integer","title":"Keep Daily","default":-1},"keep_weekly":{"type":"integer","title":"Keep Weekly","default":-1},"keep_monthly":{"type":"integer","title":"Keep Monthly","default":-1}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":238,"tokensAfter":238},{"name":"set_domain_usage","fixed":{"name":"set_domain_usage","description":"Set what a registered domain points at — a site, someone else's\nnameservers, our DNS with no site, or a redirect to another URL.\n\nUse this to park a domain, hand it to an external host, or forward it.\nSwitching modes tears down the previous one (a forwarded domain that\nbecomes a site domain loses its redirect, and vice versa).\n\nRequires: API key with write scope.\n\nArgs:\n    domain_name: Full domain name (e.g. \"example.com\")\n    usage_mode: \"site\" — link it to a hosted site (needs site_slug);\n   ","inputSchema":{"type":"object","title":"set_domain_usageArguments","required":["domain_name","usage_mode"],"properties":{"site_slug":{"type":"string","title":"Site Slug","default":""},"usage_mode":{"type":"string","title":"Usage Mode"},"domain_name":{"type":"string","title":"Domain Name"},"forward_url":{"type":"string","title":"Forward Url","default":""},"nameservers":{"type":"array","items":{},"title":"Nameservers","default":null},"forward_type":{"type":"string","title":"Forward Type","default":"301"},"forward_include_path":{"type":"boolean","title":"Forward Include Path","default":true}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":322,"tokensAfter":322},{"name":"set_force_https","fixed":{"name":"set_force_https","description":"Enable or disable the HTTP→HTTPS redirect for a site.\n\nRequires: API key with write scope.\n\nReturns:\n    {\"site\", \"force_https\": true|false, \"message\"}\n","inputSchema":{"type":"object","title":"set_force_httpsArguments","required":["slug","enabled"],"properties":{"slug":{"type":"string","title":"Slug"},"enabled":{"type":"boolean","title":"Enabled"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":113,"tokensAfter":113},{"name":"set_mailbox_aliases","fixed":{"name":"set_mailbox_aliases","description":"Replace the complete alias list idempotently (maximum 2,000).","inputSchema":{"type":"object","title":"set_mailbox_aliasesArguments","required":["email","aliases"],"properties":{"actor":{"type":"string","title":"Actor","default":""},"email":{"type":"string","title":"Email"},"reason":{"type":"string","title":"Reason","default":""},"aliases":{"type":"array","items":{"type":"string"},"title":"Aliases"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":125,"tokensAfter":125},{"name":"set_site_nginx_snippet","fixed":{"name":"set_site_nginx_snippet","description":"Set custom nginx config on the BorealHost host proxy — WebSocket, timeouts, headers.\n\nUse this when configuring your container's own nginx is not enough because\nsomething in front of it is interfering. The host proxy sits between the\ninternet and your container, and by default its catch-all `location /` does\nnot do anything special per-site.\n\nWEBSOCKETS: if your WebSocket endpoint returns 400 through your domain but\nupgrades correctly (101) when tested inside your container, the Upgrade\nheader i","inputSchema":{"type":"object","title":"set_site_nginx_snippetArguments","required":["domain_name","content"],"properties":{"content":{"type":"string","title":"Content"},"domain_name":{"type":"string","title":"Domain Name"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":219,"tokensAfter":219},{"name":"set_site_type","fixed":{"name":"set_site_type","description":"Change what a site's docroot IS, without deleting anything.\n\nTypes:\n  wordpress    WordPress, PHP and a database (the default)\n  php          PHP and a database, no WordPress\n  php-nodb     PHP, no database\n  static-site  HTML/CSS/JS only, no PHP and no database\n\n⚠ NON-DESTRUCTIVE. Existing files stay on disk and existing databases are\nnot dropped. They remain the customer's data and keep counting against\ntheir plan's quota — this changes how the site is SERVED, not what it\nholds. Converting bac","inputSchema":{"type":"object","title":"set_site_typeArguments","required":["slug","site_type"],"properties":{"slug":{"type":"string","title":"Slug"},"site_type":{"type":"string","title":"Site Type"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":210,"tokensAfter":210},{"name":"setup_email","fixed":{"name":"setup_email","description":"Enable business email (hosted mailboxes + webmail) on a domain.\n\nCreates the hosted-email domain, sets up outbound authentication\n(DKIM/SPF), and auto-configures MX/SPF DNS when the zone is hosted by\nBorealHost. Mailboxes are billed per-mailbox on the site subscription.\n\nRequires: API key with write scope.\n\nReturns:\n    {\"configured\": true, \"domain\", \"dns_auto_configured\", \"message\"}\n","inputSchema":{"type":"object","title":"setup_emailArguments","required":["slug","domain"],"properties":{"slug":{"type":"string","title":"Slug"},"domain":{"type":"string","title":"Domain"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":177,"tokensAfter":177},{"name":"ssl_info","fixed":{"name":"ssl_info","description":"Get SSL certificate information for a site.\n\nReturns certificate details, expiry date, and issuer.\n\nRequires: API key with read scope.\n\nArgs:\n    slug: Site identifier\n\nReturns:\n    {\"issuer\": \"Let's Encrypt\", \"domain\": \"example.com\",\n     \"expires_at\": \"iso8601\", \"days_remaining\": 60,\n     \"force_https\": true}\n","inputSchema":{"type":"object","title":"ssl_infoArguments","required":["slug"],"properties":{"slug":{"type":"string","title":"Slug"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":143,"tokensAfter":143},{"name":"start_compute_instance","fixed":{"name":"start_compute_instance","description":"Start a stopped compute instance.\n\nRequires: API key with write scope.\n","inputSchema":{"type":"object","title":"start_compute_instanceArguments","required":["instance_id"],"properties":{"instance_id":{"type":"string","title":"Instance Id"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":82,"tokensAfter":82},{"name":"stop_compute_instance","fixed":{"name":"stop_compute_instance","description":"Stop a compute instance. WARNING: hourly billing continues while stopped.\n\nUse terminate_compute_instance to stop the charges permanently.\n\nRequires: API key with write scope.\n","inputSchema":{"type":"object","title":"stop_compute_instanceArguments","required":["instance_id"],"properties":{"instance_id":{"type":"string","title":"Instance Id"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":111,"tokensAfter":111},{"name":"terminate_compute_instance","fixed":{"name":"terminate_compute_instance","description":"Permanently terminate a compute instance — this stops hourly billing.\n\nThe instance and its disk are destroyed and cannot be recovered. Copy any\nresults off the instance before terminating.\n\nRequires: API key with write scope.\n\nReturns:\n    Final instance dict with state \"terminated\" and total accrued_cad.\n","inputSchema":{"type":"object","title":"terminate_compute_instanceArguments","required":["instance_id"],"properties":{"instance_id":{"type":"string","title":"Instance Id"}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":152,"tokensAfter":152},{"name":"transfer_out_domain","fixed":{"name":"transfer_out_domain","description":"Prepare a domain to transfer to another registrar.\n\nUnlocks the domain and emails the EPP/auth code to the registrant\ncontact on file (BorealHost never sees the code). The domain keeps\nworking here until the transfer completes.\n\nRequires: API key with write scope.\n\nReturns:\n    {\"domain\", \"unlocked\": true, \"auth_code_emailed\": true, \"message\"}\n","inputSchema":{"type":"object","title":"transfer_out_domainArguments","required":["domain_name"],"properties":{"domain_name":{"type":"string","title":"Domain Name"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":161,"tokensAfter":161},{"name":"update_account","fixed":{"name":"update_account","description":"Update account profile fields (email, language, name).\n\nRequires: API key with write scope.\nOnly provided (non-empty) fields are updated.\n\nArgs:\n    email: New email address\n    language: Language preference — \"fr\" (French) or \"en\" (English)\n    first_name: First name\n    last_name: Last name\n\nReturns:\n    {\"success\": true, \"account\": {\"email\": \"...\", \"language\": \"fr\",\n     \"first_name\": \"...\", \"last_name\": \"...\"}}\n\nErrors:\n    VALIDATION_ERROR: Invalid email format or language code\n","inputSchema":{"type":"object","title":"update_accountArguments","properties":{"email":{"type":"string","title":"Email","default":""},"language":{"type":"string","title":"Language","default":""},"last_name":{"type":"string","title":"Last Name","default":""},"first_name":{"type":"string","title":"First Name","default":""}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":249,"tokensAfter":249},{"name":"update_checkout","fixed":{"name":"update_checkout","description":"Set buyer email and desired site slug on a checkout session.\n\nThe checkout must be in \"not_ready\" status. Setting requested_slug\ntransitions status to \"ready\" (required before completing).\n\nArgs:\n    checkout_id: Checkout session ID from create_checkout\n    buyer_email: Optional email — if omitted, a synthetic agent identity\n                 (agent-{uuid}@api.borealhost.ai) is created at completion\n    requested_slug: Desired site identifier. Must be 3-50 chars, lowercase\n                    alp","inputSchema":{"type":"object","title":"update_checkoutArguments","required":["checkout_id"],"properties":{"site_type":{"type":"string","title":"Site Type","default":""},"buyer_email":{"type":"string","title":"Buyer Email","default":""},"checkout_id":{"type":"string","title":"Checkout Id"},"requested_slug":{"type":"string","title":"Requested Slug","default":""}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":257,"tokensAfter":257},{"name":"update_email_domain","fixed":{"name":"update_email_domain","description":"Set mailbox_limit, alias_limit, quota_gb, smtp_sent_limit, services or language.","inputSchema":{"type":"object","title":"update_email_domainArguments","required":["domain","settings"],"properties":{"actor":{"type":"string","title":"Actor","default":""},"domain":{"type":"string","title":"Domain"},"reason":{"type":"string","title":"Reason","default":""},"settings":{"type":"object","title":"Settings","additionalProperties":true}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":133,"tokensAfter":133},{"name":"update_mailbox","fixed":{"name":"update_mailbox","description":"Set display_name, quota_gb, smtp_sent_limit, label, services or suspended.\n\nSuspension disables client access and outbound SMTP while preserving receipt.\n","inputSchema":{"type":"object","title":"update_mailboxArguments","required":["email","settings"],"properties":{"actor":{"type":"string","title":"Actor","default":""},"email":{"type":"string","title":"Email"},"reason":{"type":"string","title":"Reason","default":""},"settings":{"type":"object","title":"Settings","additionalProperties":true}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":151,"tokensAfter":151},{"name":"upload_file","fixed":{"name":"upload_file","description":"Upload a base64-encoded file to a site's container.\n\nUse this for binary files (images, archives, fonts, etc.).\nFor text files, prefer write_file().\n\nRequires: API key with write scope.\n\nArgs:\n    slug: Site identifier\n    path: Relative path including filename (e.g. \"images/logo.png\")\n    content_b64: Base64-encoded file content\n\nReturns:\n    {\"success\": true, \"path\": \"images/logo.png\", \"size\": 45678}\n\nErrors:\n    VALIDATION_ERROR: Invalid base64 encoding\n    FORBIDDEN: Protected system path\n","inputSchema":{"type":"object","title":"upload_fileArguments","required":["slug","path","content_b64"],"properties":{"path":{"type":"string","title":"Path"},"slug":{"type":"string","title":"Slug"},"content_b64":{"type":"string","title":"Content B64"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":228,"tokensAfter":228},{"name":"upload_ssl_cert","fixed":{"name":"upload_ssl_cert","description":"Install your own SSL certificate for a site's domain.\n\nThe certificate must be a PEM fullchain (leaf + intermediates) and the\nkey unencrypted PEM. Validated (parse, key match, domain coverage,\nexpiry) before nginx is touched; nginx config is tested before reload.\n\nRequires: API key with write scope.\n\nReturns:\n    {\"site\", \"domain\", \"server_names\", \"installed\": true,\n     \"ssl_active\": true, \"not_after\"}\n","inputSchema":{"type":"object","title":"upload_ssl_certArguments","required":["slug","domain","fullchain_pem","privkey_pem"],"properties":{"slug":{"type":"string","title":"Slug"},"domain":{"type":"string","title":"Domain"},"privkey_pem":{"type":"string","title":"Privkey Pem"},"fullchain_pem":{"type":"string","title":"Fullchain Pem"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":225,"tokensAfter":225},{"name":"wp_check_updates","fixed":{"name":"wp_check_updates","description":"Check for available WordPress core, plugin, and theme updates.\n\nRequires: API key with read scope.\n\nArgs:\n    slug: Site identifier\n\nReturns:\n    {\"core\": {\"current\": \"6.5\", \"update\": \"6.6\"},\n     \"plugins\": [{\"name\": \"...\", \"current\": \"1.0\", \"new\": \"1.1\"}],\n     \"themes\": [...]}\n","inputSchema":{"type":"object","title":"wp_check_updatesArguments","required":["slug"],"properties":{"slug":{"type":"string","title":"Slug"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":141,"tokensAfter":141},{"name":"wp_update_all","fixed":{"name":"wp_update_all","description":"Update WordPress core, all plugins, and all themes.\n\nRuns all updates in sequence. May take up to 2 minutes.\n\nRequires: API key with write scope.\n\nArgs:\n    slug: Site identifier\n\nReturns:\n    {\"core\": {...}, \"plugins\": [...], \"themes\": [...]}\n","inputSchema":{"type":"object","title":"wp_update_allArguments","required":["slug"],"properties":{"slug":{"type":"string","title":"Slug"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":123,"tokensAfter":123},{"name":"write_file","fixed":{"name":"write_file","description":"Write or overwrite a text file in a site's container.\n\nCreates parent directories if they don't exist.\n\nRequires: API key with write scope.\n\nArgs:\n    slug: Site identifier\n    path: Relative path to the file\n    content: File content as a UTF-8 string\n\nReturns:\n    {\"success\": true, \"path\": \"...\", \"size\": 1234}\n\nErrors:\n    NOT_FOUND: Unknown slug\n    FORBIDDEN: Protected system path\n","inputSchema":{"type":"object","title":"write_fileArguments","required":["slug","path","content"],"properties":{"path":{"type":"string","title":"Path"},"slug":{"type":"string","title":"Slug"},"content":{"type":"string","title":"Content"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":192,"tokensAfter":192}],"toolsChanged":145,"tokensSaved":0,"todo":[{"tool":"add_cron","params":["slug","command","schedule"]},{"tool":"add_domain_dns","params":["value","priority","subdomain","domain_name","record_type"]},{"tool":"add_firewall_rule","params":["ip","slug","action"]},{"tool":"add_mailbox_alias","params":["actor","alias","email","reason"]},{"tool":"add_port_forward","params":["slug","label","protocol","external_port","internal_port","internal_port_end"]},{"tool":"add_redirect","params":["slug","target_url","source_path","redirect_type"]},{"tool":"add_site","params":["slug","domain","site_type","client_name","subscription_id"]},{"tool":"add_ssh_key","params":["slug","public_key"]},{"tool":"add_subdomain","params":["subdomain","domain_name"]},{"tool":"adopt_compute_instance","params":["name","instance_id"]},{"tool":"attach_compute_volume","params":["volume_id","instance_type","root_disk_size","ssh_public_key"]},{"tool":"browse_backup","params":["path","slug","limit","cursor","backup_id"]},{"tool":"cache_flush","params":["slug"]},{"tool":"cache_status","params":["slug"]},{"tool":"cache_toggle","params":["slug","enable"]},{"tool":"cancel_checkout","params":["checkout_id"]},{"tool":"cancel_scheduled_snapshot","params":["slug","schedule_id"]},{"tool":"claim_api_key","params":["claim_token"]},{"tool":"clear_mailbox_forwarding","params":["actor","email","reason","clear_all_filters"]},{"tool":"cloudflare_proxy_status","params":["slug"]},{"tool":"cloudflare_purge_cache","params":["slug","urls"]},{"tool":"cloudflare_set_proxy","params":["slug","proxied"]},{"tool":"complete_checkout","params":["checkout_id","payment_method","payment_method_id"]},{"tool":"configure_email_dns","params":["actor","domain","reason","dmarc_reporting_address"]},{"tool":"container_action","params":["slug","action"]},{"tool":"create_alert_rule","params":["slug","metric","operator","severity","threshold","notify_email","notify_webhook","cooldown_minutes"]},{"tool":"create_api_key","params":["name","scopes","site_slug","expires_at","ip_allowlist","email_domains"]},{"tool":"create_b2_snapshot","params":["slug","description"]},{"tool":"create_backup","params":["slug"]},{"tool":"create_checkout","params":["sku"]},{"tool":"create_compute_volume","params":["name","image_id","instance_type","root_disk_size","ssh_public_key"]},{"tool":"create_directory","params":["path","slug"]},{"tool":"create_email_mailbox","params":["actor","label","domain","reason","password","quota_gb","local_part","display_name","idempotency_key","smtp_sent_limit"]},{"tool":"create_ftp_account","params":["slug","home_dir","password","username"]},{"tool":"create_mailbox","params":["slug","password","local_part","display_name"]},{"tool":"create_mailbox_token","params":["actor","email","reason","duration_minutes"]},{"tool":"create_snapshot","params":["slug","description"]},{"tool":"create_support_ticket","params":["site","message","subject","category"]},{"tool":"create_webhook","params":["url","events"]},{"tool":"database_search_replace","params":["new","old","slug","dry_run"]},{"tool":"decommission","params":["slug"]},{"tool":"delete_alert_rule","params":["slug","rule_id"]},{"tool":"delete_backup","params":["slug","backup_id"]},{"tool":"delete_compute_volume","params":["force","volume_id"]},{"tool":"delete_cron","params":["slug","line_number"]},{"tool":"delete_domain_dns","params":["record_id","domain_name"]},{"tool":"delete_email_mailbox","params":["actor","email","reason","confirm"]},{"tool":"delete_file","params":["path","slug"]},{"tool":"delete_mailbox","params":["slug","email"]},{"tool":"delete_redirect","params":["slug","redirect_id","source_path"]},{"tool":"delete_snapshot","params":["slug","snapshot_id"]},{"tool":"delete_subdomain","params":["subdomain","domain_name"]},{"tool":"delete_webhook","params":["endpoint_id"]},{"tool":"detach_compute_volume","params":["volume_id"]},{"tool":"disable_email_domain","params":["actor","domain","reason"]},{"tool":"domain_detail","params":["domain_name"]},{"tool":"domain_settings","params":["locked","auto_renew","domain_name","whois_privacy"]},{"tool":"enable_email_domain","params":["actor","domain","reason","site_slug","alias_limit","configure_dns","mailbox_limit","dmarc_reporting_address"]},{"tool":"enable_smtp_relay","params":["slug","domain"]},{"tool":"enable_wildcard","params":["domain_name"]},{"tool":"execute_query","params":["slug","query","database"]},{"tool":"find_address","params":["address"]},{"tool":"get_app_status","params":["slug","app_id"]},{"tool":"get_backup_retention","params":["slug"]},{"tool":"get_billing_portal","params":["flow"]},{"tool":"get_checkout_status","params":["checkout_id"]},{"tool":"get_compute_instance","params":["instance_id"]},{"tool":"get_compute_volume","params":["volume_id"]},{"tool":"get_database_info","params":["slug"]},{"tool":"get_database_recovery","params":["slug","backup_id","recovery_id"]},{"tool":"get_email_domain","params":["domain"]},{"tool":"get_email_status","params":["slug"]},{"tool":"get_email_webmail_url","params":["actor","email","reason","language"]},{"tool":"get_file_recovery","params":["slug","backup_id","recovery_id"]},{"tool":"get_logs","params":["slug","lines","search","log_type"]},{"tool":"get_mailbox","params":["email"]},{"tool":"get_metrics","params":["days","slug"]},{"tool":"get_resource_snapshot","params":["slug"]},{"tool":"get_site_nginx_snippet","params":["domain_name"]},{"tool":"get_site_status","params":["slug"]},{"tool":"get_smtp_relay","params":["slug"]},{"tool":"get_snapshot_usage","params":["slug"]},{"tool":"get_ssh_info","params":["slug"]},{"tool":"get_stack_info","params":["slug"]},{"tool":"get_support_ticket","params":["ticket_id"]},{"tool":"get_webmail_url","params":["slug","email"]},{"tool":"install_app","params":["slug","domain","db_type","app_name","template","display_name"]},{"tool":"launch_compute_instance","params":["name","image_id","user_data","storage_type","instance_type","root_disk_size","ssh_public_key","max_lifetime_hours"]},{"tool":"link_domain","params":["site_slug","domain_name"]},{"tool":"list_alert_rules","params":["slug"]},{"tool":"list_apps","params":["slug"]},{"tool":"list_backups","params":["slug"]},{"tool":"list_checkouts","params":["status"]},{"tool":"list_compute_instances","params":["include_terminated"]},{"tool":"list_cron","params":["slug"]},{"tool":"list_databases","params":["slug"]},{"tool":"list_db_users","params":["slug","engine"]},{"tool":"list_domain_dns","params":["domain_name"]},{"tool":"list_email_audit","params":["email","limit","since","cursor","domain"]},{"tool":"list_email_domains","params":["limit","cursor"]},{"tool":"list_files","params":["path","slug"]},{"tool":"list_firewall_rules","params":["slug"]},{"tool":"list_ftp_accounts","params":["slug"]},{"tool":"list_mailbox_aliases","params":["email","limit","cursor"]},{"tool":"list_mailboxes","params":["label","limit","cursor","domain"]},{"tool":"list_modules","params":["slug"]},{"tool":"list_php_versions","params":["slug"]},{"tool":"list_plans","params":["track","include_deprecated"]},{"tool":"list_plugins","params":["slug"]},{"tool":"list_port_forwards","params":["slug"]},{"tool":"list_redirects","params":["slug"]},{"tool":"list_snapshots","params":["slug"]},{"tool":"list_subdomains","params":["domain_name"]},{"tool":"list_support_tickets","params":["status"]},{"tool":"list_tables","params":["slug","database"]},{"tool":"list_themes","params":["slug"]},{"tool":"logout_mailbox_sessions","params":["actor","email","reason"]},{"tool":"manage_db_user","params":["host","slug","user","action","engine","database","password","privileges"]},{"tool":"manage_dns","params":["slug","value","action","subdomain","record_type"]},{"tool":"manage_plugin","params":["slug","action","plugin"]},{"tool":"manage_theme","params":["slug","theme","action"]},{"tool":"optimize_database","params":["slug"]},{"tool":"read_file","params":["path","slug"]},{"tool":"reboot_compute_instance","params":["instance_id"]},{"tool":"recover_backup_database","params":["slug","database","backup_id"]},{"tool":"recover_backup_files","params":["slug","paths","backup_id"]},{"tool":"register_domain","params":["city","email","phone","state","domain","period","country","address1","last_name","first_name","quote_only","usage_mode","forward_url","nameservers","postal_code","quote_token","forward_type","ca_legal_type","whois_privacy","forward_include_path"]},{"tool":"remove_firewall_rule","params":["ip","slug"]},{"tool":"remove_ftp_account","params":["slug","username"]},{"tool":"remove_mailbox_alias","params":["actor","alias","email","reason"]},{"tool":"remove_port_forward","params":["slug","forward_id"]},{"tool":"reply_support_ticket","params":["message","ticket_id"]},{"tool":"request_api_key","params":["site_slug"]},{"tool":"resend_registrant_verification","params":["domain_name"]},{"tool":"reset_email_mailbox_password","params":["actor","email","reason","new_password"]},{"tool":"reset_mailbox_password","params":["slug","email","new_password"]},{"tool":"restore_backup","params":["slug","backup_id"]},{"tool":"restore_mailbox","params":["actor","email","reason"]},{"tool":"revoke_api_key","params":["key_id"]},{"tool":"revoke_smtp_relay","params":["slug","relay_id"]},{"tool":"rollback_snapshot","params":["slug","snapshot_id"]},{"tool":"rotate_email_key","params":["grace_minutes"]},{"tool":"rotate_key","params":["key_id","grace_minutes"]},{"tool":"run_malware_scan","params":["path","slug"]},{"tool":"scale","params":["slug","new_plan"]},{"tool":"schedule_snapshot","params":["slug","description","scheduled_at"]},{"tool":"search_domain","params":["domain"]},{"tool":"set_api_key","params":["api_key"]},{"tool":"set_backup_retention","params":["slug","reset","keep_daily","keep_weekly","keep_monthly"]},{"tool":"set_domain_usage","params":["site_slug","usage_mode","domain_name","forward_url","nameservers","forward_type","forward_include_path"]},{"tool":"set_force_https","params":["slug","enabled"]},{"tool":"set_mailbox_aliases","params":["actor","email","reason","aliases"]},{"tool":"set_site_nginx_snippet","params":["content","domain_name"]},{"tool":"set_site_type","params":["slug","site_type"]},{"tool":"setup_email","params":["slug","domain"]},{"tool":"snapshot_compute_volume","params":["volume_id","quiesce_units"]},{"tool":"ssl_info","params":["slug"]},{"tool":"ssl_renew","params":["slug"]},{"tool":"start_compute_instance","params":["instance_id"]},{"tool":"stop_compute_instance","params":["instance_id"]},{"tool":"switch_php","params":["slug","version"]},{"tool":"terminate_compute_instance","params":["instance_id"]},{"tool":"test_webhook","params":["endpoint_id"]},{"tool":"toggle_module","params":["slug","module_name"]},{"tool":"transfer_out_domain","params":["domain_name"]},{"tool":"update_account","params":["email","language","last_name","first_name"]},{"tool":"update_checkout","params":["site_type","buyer_email","checkout_id","requested_slug"]},{"tool":"update_email_domain","params":["actor","domain","reason","settings"]},{"tool":"update_mailbox","params":["actor","email","reason","settings"]},{"tool":"upload_file","params":["path","slug","content_b64"]},{"tool":"upload_ssl_cert","params":["slug","domain","privkey_pem","fullchain_pem"]},{"tool":"wp_check_updates","params":["slug"]},{"tool":"wp_update_all","params":["slug"]},{"tool":"write_file","params":["path","slug","content"]}],"note":"Deterministic fixes. Changes marked verify need a human look before shipping (renames, inferred annotations, inferred types, removed text). Parameter descriptions in `todo` need to be written by someone who knows the API."}