BorealHost
REMOTE · BOREALHOST.AI · 2 COMPONENTS · SCANNED AUG 3
Agent-native web hosting — deploy sites, manage DNS, register domains, scale infrastructure
Available components
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score →
Endpoint Security57
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation not fully verified: no authorisation is required to call this server, and 113 tool(s) never declared a destructiveHint. The MCP spec treats an absent hint as destructive by default, so we cannot call this surface safe. See how to fix → View diagnostics → Unverified
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- HSTS check failed: the Strict-Transport-Security header is absent. See how to fix → View diagnostics → Fail
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability82
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 18211 tokens (~154/item across 118 items; 113 tools + 5 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management27
- Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage67
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 0% of tool parameters carry a description.Fail
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Add this component to your MCP client. Where a client-specific snippet is available, pick your client below and copy it straight into your config; otherwise use the connection detail shown.
remote · borealhost.ai
claude mcp add --transport http ai-borealhost-mcp https://borealhost.ai/mcp/
[mcp_servers.ai-borealhost-mcp] url = "https://borealhost.ai/mcp/"
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"ai-borealhost-mcp": {
"type": "remote",
"url": "https://borealhost.ai/mcp/",
"enabled": true
}
}
} openclaw mcp add ai-borealhost-mcp --url https://borealhost.ai/mcp/ --transport streamable-http
mcp_servers:
ai-borealhost-mcp:
url: "https://borealhost.ai/mcp/" {
"mcpServers": {
"ai-borealhost-mcp": {
"type": "http",
"url": "https://borealhost.ai/mcp/"
}
}
} The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 3 Aug 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 23 to 27. That category is still filling its 30-day observation window: 7 days of observed history at the previous scan, 8 at this one. The score rises as the window fills, whether or not the server changes.
- 1 Aug 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 17 to 20. That category is still filling its 30-day observation window: 5 days of observed history at the previous scan, 6 at this one. The score rises as the window fills, whether or not the server changes.
- 31 Jul 26 +1
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 30 Jul 26 +1
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 29 Jul 26 0
- Tool “register_domain” rewrote its description, which is the text the model reads security
- Tool “list_ftp_accounts” rewrote its description, which is the text the model reads security
- Tool “remove_ftp_account” rewrote its description, which is the text the model reads security
- Tool “create_ftp_account” rewrote its description, which is the text the model reads security
- New tool “set_domain_usage” functional
- “register_domain” added an optional parameter “forward_include_path” cosmetic
- “register_domain” added an optional parameter “forward_type” cosmetic
- “register_domain” added an optional parameter “forward_url” cosmetic
- “register_domain” added an optional parameter “nameservers” cosmetic
- “register_domain” added an optional parameter “usage_mode” cosmetic
- 28 Jul 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 3 to 7. That category is still filling its 30-day observation window: 1 days of observed history at the previous scan, 2 at this one. The score rises as the window fills, whether or not the server changes.
- 27 Jul 26 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 26 Jul 26 60
First indexed and scored.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 3 Aug 2026 · Probed https://borealhost.ai/mcp/
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=borealhost.ai | CN=YE1,O=Let's Encrypt,C=US | 6 Jul 2026 | 4 Oct 2026 | ECDSA 256 | ECDSA-SHA384 | 5b5aa76a3e55bfd0307ed30c6fca4f8c909 |
| SANs: *.borealhost.ai, borealhost.ai | ||||||
| CN=YE1,O=Let's Encrypt,C=US (CA) | CN=Root YE,O=ISRG,C=US | 3 Sept 2025 | 2 Sept 2028 | ECDSA 384 | ECDSA-SHA384 | 5ddd70dd31f801c85c186a7a04b80afe |
| CN=Root YE,O=ISRG,C=US (CA) | CN=ISRG Root X2,O=Internet Security Research Group,C=US | 13 May 2026 | 2 Sept 2032 | ECDSA 384 | ECDSA-SHA384 | 872165fc34b6e5fba8add5b3705fb53a |
| CN=ISRG Root X2,O=Internet Security Research Group,C=US (CA) | CN=ISRG Root X1,O=Internet Security Research Group,C=US | 13 May 2026 | 2 Sept 2032 | ECDSA 384 | SHA256-RSA | 6c8f1dc727c7117f7baf853ac980f9cd |
DNSSEC insecure
Validation of borealhost.ai. — Not signed
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| ai. | present | 3799 | 8 | Verified |
| borealhost.ai. | absent | Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation |
Authentication No authorisation required
The endpoint answered without asking for a token. Anyone who knows the URL can reach it.
| Result | No authorisation required |
|---|---|
| HTTP status | 200 |
| Header | Value |
|---|---|
| content-security-policy | default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://esm.sh https://js.stripe.com https://unpkg.com https://cdn.jsdelivr.net https://cdnjs.cloudflare.com https://www.googletagmanager.com https://connect.facebook.net https://static.cloudflareinsights.com https://www.googleadservices.com https://www.google.com https://googleads.g.doubleclick.net; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com https://cdn.jsdelivr.net https://cdnjs.cloudflare.com; font-src 'self' https://fonts.gstatic.com; img-src 'self' data: https://www.facebook.com https://www.googletagmanager.com https://pagead2.googlesyndication.com https://www.google.com https://googleads.g.doubleclick.net https://www.google.ca https://www.google-analytics.com; connect-src 'self' https://esm.sh https://www.google-analytics.com https://analytics.google.com https://www.googletagmanager.com https://googleads.g.doubleclick.net https://td.doubleclick.net https://www.facebook.com https://connect.facebook.net https://pagead2. |
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://borealhost.ai/mcp/ | Verified | 200 | |
| http (plaintext) | http://borealhost.ai/mcp/ | HTTPS enforced | 301 | https://borealhost.ai/mcp/ |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability.
add_cron ~99
Add a cron job to a site. Requires: API key with write scope. Args: slug: Site identifier schedule: Cron schedule (e.g. "*/5 * * * *", "0 2 * * *") command: Command to execute Returns: {"added": true, "result": {...}}
| Name | Type | Req | Description |
|---|---|---|---|
| command | string | yes | — |
| schedule | string | yes | — |
| slug | string | yes | — |
No output schema declared.
No examples provided.
add_domain_dns ~260
Add a DNS record to a domain. Requires: API key with write scope. Args: domain_name: Full domain name (e.g. "example.com") record_type: "A", "AAAA", "CNAME", "MX", "TXT", or "SRV" value: Record value (e.g. "1.2.3.4" for A, "mail.example.com" for MX) subdomain: Subdomain part (e.g. "www", "mail"). Empty for apex domain. ttl: Time to live in seconds (default: 3600) priority: MX priority (required for MX records) Returns: {"success": true, "record": {"id": "...", "type": "A", "subdomain": "www", "value": "1.2.3.4", "ttl": 3600}} Errors: VALIDATION_ERROR: Missing value, invalid record type NOT_FOUND: Domain not found
| Name | Type | Req | Description |
|---|---|---|---|
| domain_name | string | yes | — |
| priority | integer | — | — |
| record_type | string | yes | — |
| subdomain | string | — | — |
| ttl | integer | — | — |
| value | string | yes | — |
No output schema declared.
No examples provided.
add_firewall_rule ~186
Add an IP firewall rule (allow or deny) and reload Nginx. Supports IPv4, IPv6, and CIDR notation. Max 100 rules per site. If a rule already exists for the IP, the action is updated. Requires: API key with write scope. Args: slug: Site identifier ip: IP address or CIDR (e.g. "1.2.3.4", "10.0.0.0/8", "2001:db8::/32") action: "deny" (block) or "allow" (whitelist). Default: "deny" Returns: {"added": true, "ip": "1.2.3.4", "action": "deny"}
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | — | — |
| ip | string | yes | — |
| slug | string | yes | — |
No output schema declared.
No examples provided.
add_ssh_key ~170
Inject your SSH public key into a site's container for direct SSH access. The key is appended to /home/admin/.ssh/authorized_keys. Only available for VPS/dedicated plans. Requires: API key with write scope. Args: slug: Site identifier public_key: SSH public key string. Supported types: ssh-ed25519, ssh-rsa, ecdsa-sha2-nistp256/384/521 Returns: {"success": true, "message": "SSH key added", "ssh_command": "ssh [email protected]"} Errors: VALIDATION_ERROR: Invalid or unsupported key format FORBIDDEN: Plan does not support SSH
| Name | Type | Req | Description |
|---|---|---|---|
| public_key | string | yes | — |
| slug | string | yes | — |
No output schema declared.
No examples provided.
adopt_compute_instance ~252
Turn an instance you are ALREADY running into a persistent volume. Use this when you launched something, set it up, and then decided you want to keep it. Nothing reboots and no data moves — the machine you have becomes the volume, and you can detach it afterwards to stop paying for compute while keeping the machine. Beats creating a volume and rebuilding. Only instances launched with an ssh_public_key qualify. One launched with your own user_data carries only your key, and a key cannot be added to a machine we cannot already log into — check "managed_ssh" on the instance. Requires: API key with write scope, and an active subscription. Args: instance_id: A running lsw.* instance you own name: Label for the volume (defaults to the instance name) Returns: Volume dict with state "attached", wrapping that same instance. No snapshot exists yet — the first one is taken on detach or snapshot. Errors: CONFLICT: Not running, already a volume, BorealHost Metal, or launched without BorealHost management access
| Name | Type | Req | Description |
|---|---|---|---|
| instance_id | string | yes | — |
| name | string | — | — |
No output schema declared.
No examples provided.
attach_compute_volume ~270
Restore a detached volume onto a fresh instance — optionally a new type. Pass a different instance_type to move the same machine to different hardware: this is the closest thing to changing instance type that the provider allows, since it has no resize API at all. The restore runs at first boot and the machine reboots into itself, so the instance answers SSH BEFORE it is ready. Poll get_compute_volume and give it a few minutes (measured: ~6 min for a 10 GB GPU machine end to end). The machine keeps its SSH host keys, so your client will not warn about a changed host identity. Requires: API key with write scope. Args: volume_id: A volume in state "detached" ssh_public_key: Required — installed via cloud-init at boot instance_type: Defaults to the type it last ran on root_disk_size: GB. May grow, never shrink below the volume's size. Returns: Volume dict with state "attached" and a new instance. Errors: CONFLICT: Volume is not detached, or has no snapshot yet
| Name | Type | Req | Description |
|---|---|---|---|
| instance_type | string | — | — |
| root_disk_size | integer | — | — |
| ssh_public_key | string | yes | — |
| volume_id | string | yes | — |
No output schema declared.
No examples provided.
cache_flush ~50
Flush all caches (Redis + WP object cache). Requires: API key with write scope. Args: slug: Site identifier Returns: {"flushed": true}
| Name | Type | Req | Description |
|---|---|---|---|
| slug | string | yes | — |
No output schema declared.
No examples provided.
cache_status ~78
Get cache status (Redis, WP object cache, hit rates). Requires: API key with read scope. Args: slug: Site identifier Returns: {"redis_running": true, "object_cache_enabled": true, "hit_rate": 0.95, "memory_used_mb": 12}
| Name | Type | Req | Description |
|---|---|---|---|
| slug | string | yes | — |
No output schema declared.
No examples provided.
cache_toggle ~66
Enable or disable the WordPress object cache. Requires: API key with write scope. Args: slug: Site identifier enable: true to enable, false to disable Returns: {"enabled": true}
| Name | Type | Req | Description |
|---|---|---|---|
| enable | boolean | yes | — |
| slug | string | yes | — |
No output schema declared.
No examples provided.
cancel_scheduled_snapshot ~87
Cancel a scheduled snapshot. Requires: API key with write scope. Args: slug: Site identifier schedule_id: UUID of the scheduled snapshot to cancel Returns: {"success": true, "message": "Scheduled snapshot cancelled"} Errors: NOT_FOUND: Schedule not found or already executed
| Name | Type | Req | Description |
|---|---|---|---|
| schedule_id | string | yes | — |
| slug | string | yes | — |
No output schema declared.
No examples provided.
claim_api_key ~167
Claim an API key using a claim token from the container. After calling request_api_key(), read the claim token from ~/.borealhost/.claim_token on your container and pass it here. The token is single-use — once claimed, it cannot be used again. The API key is automatically activated for this MCP session. Args: claim_token: The claim token string read from the container file Returns: {"api_key": "bh_...", "key_prefix": "bh_...", "site_slug": "my-site", "scopes": ["read", "write"], "message": "API key created and activated..."} Errors: VALIDATION_ERROR: Invalid, expired, or already-claimed token
| Name | Type | Req | Description |
|---|---|---|---|
| claim_token | string | yes | — |
No output schema declared.
No examples provided.
cloudflare_proxy_status ~112
Get Cloudflare proxy (CDN) status for a site. Shows whether traffic is routed through Cloudflare's CDN (orange cloud) or goes direct to origin (grey cloud / DNS-only). Requires: API key with read scope. Args: slug: Site identifier Returns: {"domain": "my-site.borealhost.ai", "has_record": true, "proxied": true, "ip": "1.2.3.4"}
| Name | Type | Req | Description |
|---|---|---|---|
| slug | string | yes | — |
No output schema declared.
No examples provided.
cloudflare_purge_cache ~137
Purge Cloudflare CDN cache for a site. Without urls: purges all cached content for the site's subdomain. With urls: purges only the specified URLs (max 30 per call). Requires: API key with write scope. Args: slug: Site identifier urls: Optional list of specific URLs to purge (e.g. ["https://my-site.borealhost.ai/style.css"]) Returns: {"purged": true, "scope": "host", "domain": "my-site.borealhost.ai"}
| Name | Type | Req | Description |
|---|---|---|---|
| slug | string | yes | — |
| urls | array | — | — |
No output schema declared.
No examples provided.
cloudflare_set_proxy ~141
Enable or disable Cloudflare CDN proxy for a site. When enabled (orange cloud): traffic goes through Cloudflare's CDN, gets caching, DDoS protection, and SSL termination at the edge. When disabled (grey cloud): traffic goes directly to origin server. Requires: API key with write scope. Args: slug: Site identifier proxied: true to enable CDN proxy, false to disable Returns: {"domain": "my-site.borealhost.ai", "proxied": true, "ip": "1.2.3.4"}
| Name | Type | Req | Description |
|---|---|---|---|
| proxied | boolean | yes | — |
| slug | string | yes | — |
No output schema declared.
No examples provided.
complete_checkout ~416
Complete checkout with payment and start site provisioning. The checkout must be in "ready" status. Two payment methods: - "stripe_checkout" (default): Returns a short, chat-safe payment URL. **Present `payment_url` to the human — NOT `stripe_checkout_url`.** The raw Stripe URL has a required `#fragment` that chat UIs routinely strip when rendering markdown links, which causes Stripe to show "page not found". `payment_url` is a short BorealHost redirect that preserves the fragment via HTTP 302. Then poll get_checkout_status() until status becomes "completed". The API key appears in the first poll after payment (shown once, then cleared). - "stripe_payment_method": Charges a Stripe PaymentMethod directly. Requires payment_method_id. On success, returns the API key immediately. Args: checkout_id: Checkout session ID payment_method: "stripe_checkout" or "stripe_payment_method" payment_method_id: Stripe PaymentMethod ID (pm_...). Required only for "stripe_payment_method". Returns (stripe_checkout): {"id": "uuid", "status": "awaiting_payment", "payment_url": "https://borealhost.ai/pay/<id>/?s=<secret>", "stripe_checkout_url": "https://checkout.stripe.com/c/pay/...", "message": "Present payment_url to the human..."} Returns (stripe_payment_method): {"id": "uuid", "status": "completed", "api_key": "bh_...", "api_key_message": "Store this API key securely...", "subscription_id": "uuid", "provisioning_job_id": "uuid"} Errors: VALIDATION_ERROR: Missing payment_method_id for stripe_payment_method FORBIDDEN: Checkout not in "ready" status
| Name | Type | Req | Description |
|---|---|---|---|
| checkout_id | string | yes | — |
| payment_method | string | — | — |
| payment_method_id | string | — | — |
No output schema declared.
No examples provided.
create_alert_rule ~260
Create an alert rule to monitor CPU, memory, or disk usage. When the metric crosses the threshold, a notification is sent via email and/or webhook. Max 10 rules per site. Requires: API key with write scope. Args: slug: Site identifier metric: "cpu", "memory", or "disk" (percentage-based) threshold: Threshold value 0-100 (e.g. 90 for 90%) operator: "gt" (greater than) or "lt" (less than). Default: "gt" severity: "warning" or "critical". Default: "warning" cooldown_minutes: Min minutes between repeated alerts. Default: 30 notify_email: Send email notification. Default: true notify_webhook: Optional webhook URL for POST notifications Returns: {"id": "uuid", "metric": "disk", "threshold": 90, ...}
| Name | Type | Req | Description |
|---|---|---|---|
| cooldown_minutes | integer | — | — |
| metric | string | yes | — |
| notify_email | boolean | — | — |
| notify_webhook | string | — | — |
| operator | string | — | — |
| severity | string | — | — |
| slug | string | yes | — |
| threshold | number | yes | — |
No output schema declared.
No examples provided.
create_api_key ~236
Create a new API key with specified scopes. Cannot create keys with higher scopes than the current key. Site-scoped keys restrict access to a single site. Requires: API key with write scope. Args: name: Human-readable name for the key (1-100 chars) scopes: Comma-separated scopes. Options: "read", "read,write", "read,write,admin". Default: "read" site_slug: Optional — restrict the key to a single site. Omit for account-wide access. Returns: {"api_key": "bh_...", "key_id": "uuid", "prefix": "bh_...", "name": "My Key", "scopes": ["read", "write"], "message": "Store this API key securely — it will not be shown again."} Errors: VALIDATION_ERROR: Invalid name, scopes, or max 25 active keys FORBIDDEN: Cannot create keys with higher scopes than current key
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | — |
| scopes | string | — | — |
| site_slug | string | — | — |
No output schema declared.
No examples provided.
create_b2_snapshot ~184
Create a B2 cloud-backed snapshot (zero local disk, async). Streams container data directly to Backblaze B2 via restic. No local disk impact — billed separately at cost+5%. Runs in background — returns immediately with status "creating". Poll list_snapshots() to check when status becomes "completed". Only available for VPS plans. Requires: API key with write scope. Args: slug: Site identifier description: Optional description (max 200 chars) Returns: {"id": "uuid", "name": "...", "status": "creating", "storage_type": "b2", "message": "B2 cloud snapshot started. Poll list_snapshots()..."} Errors: VALIDATION_ERROR: Not a VPS plan or max snapshots reached
| Name | Type | Req | Description |
|---|---|---|---|
| description | string | — | — |
| slug | string | yes | — |
No output schema declared.
No examples provided.
create_backup ~88
Create a manual backup (runs asynchronously). The backup starts in the background. Poll list_backups() to check status. Requires: API key with write scope. Args: slug: Site identifier Returns: {"id": "uuid", "status": "pending", "message": "Backup started. Poll list_backups() to check status."}
| Name | Type | Req | Description |
|---|---|---|---|
| slug | string | yes | — |
No output schema declared.
No examples provided.
create_checkout ~217
Start a new checkout session to purchase a hosting plan. No authentication needed. After creating, call update_checkout to set buyer info, then complete_checkout to pay. Args: sku: Plan SKU in format bh_{plan_slug}_{monthly|annual}. Examples: "bh_site_starter_monthly", "bh_site_pro_annual", "bh_site_managed_monthly", "bh_site_business_annual". Call list_plans() to discover all available plan slugs. Returns: {"id": "uuid", "sku": "bh_site_starter_monthly", "plan_slug": "site_starter", "billing_period": "monthly", "status": "not_ready", "buyer_email": "", "requested_slug": "", "created_at": "iso8601", "checkout_secret": "base64-token"} Errors: VALIDATION_ERROR: Invalid SKU format or unknown plan RATE_LIMITED: Max 10 checkouts per IP per hour
| Name | Type | Req | Description |
|---|---|---|---|
| sku | string | yes | — |
No output schema declared.
No examples provided.
create_compute_volume ~342
Create a persistent machine and boot its first instance. Start here, then set the machine up however you like (install packages, drivers, models). Everything you do becomes part of the volume the first time you detach or snapshot it. While attached you pay hourly compute; while detached you pay only for stored bytes (CA$0.03/GB/month). Stopping an instance does NOT save money on this provider — detaching is what stops the compute charge. Requires: API key with write scope, and an active subscription. Args: name: Label for the volume, e.g. "trainer" image_id: From list_compute_images, e.g. "UBUNTU_24_04_64BIT". Cannot change later — restores must land on the same OS. instance_type: From list_compute_types, e.g. "lsw.g6.xlarge". CAN change on every later attach. ssh_public_key: Required. Volume instances always boot via cloud-init, so this is the only way in. root_disk_size: GB. Defaults to the type's minimum (or 25). Returns: Volume dict with state "attached". Poll get_compute_volume until instance.state is "running" (~1-3 min). Errors: PAYMENT_REQUIRED: No active subscription LIMIT_EXCEEDED: Volume cap reached NOT_AVAILABLE: Volumes not enabled on this deployment
| Name | Type | Req | Description |
|---|---|---|---|
| image_id | string | yes | — |
| instance_type | string | yes | — |
| name | string | yes | — |
| root_disk_size | integer | — | — |
| ssh_public_key | string | yes | — |
No output schema declared.
No examples provided.
create_directory ~107
Create a directory in a site's container. Creates parent directories if they don't exist. Requires: API key with write scope. Args: slug: Site identifier path: Relative path of the directory to create Returns: {"success": true, "path": "uploads/2024", "message": "Directory created"} Errors: NOT_FOUND: Unknown slug FORBIDDEN: Protected system path
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | — |
| slug | string | yes | — |
No output schema declared.
No examples provided.
create_ftp_account ~182
Create an SFTP account on a site. The account is chrooted to /var/www and lands in home_dir. Password must be at least 8 characters. Username must be lowercase alphanumeric. Requires: API key with write scope. Args: slug: Site identifier username: SFTP username (lowercase, max 32 chars) password: Password (min 8 chars) home_dir: Landing directory inside /var/www. Leave empty to land at /var/www itself, which lists every site directory. Returns: {"success": true, "username": "sftpuser", "home_dir": "/wordpress", "protocol": "sftp"}
| Name | Type | Req | Description |
|---|---|---|---|
| home_dir | string | — | — |
| password | string | yes | — |
| slug | string | yes | — |
| username | string | yes | — |
No output schema declared.
No examples provided.
create_snapshot ~182
Create a local container snapshot (async). Runs in background — returns immediately with status "creating". Poll list_snapshots() to check when status becomes "completed" or "failed". Available for VPS, dedicated, and cloud plans (any plan with max_snapshots > 0). Local snapshots are stored on the host disk and count against disk quota. Requires: API key with write scope. Args: slug: Site identifier description: Optional description (max 200 chars) Returns: {"id": "uuid", "name": "snap-...", "status": "creating", "storage_type": "local", "message": "Snapshot started. Poll list_snapshots() to check status."} Errors: VALIDATION_ERROR: Max snapshots reached or insufficient disk quota
| Name | Type | Req | Description |
|---|---|---|---|
| description | string | — | — |
| slug | string | yes | — |
No output schema declared.
No examples provided.
database_search_replace ~154
Search and replace in WordPress database (e.g. URL migration). Handles serialized data safely. Use dry_run=true first to preview changes. Requires: API key with write scope. Args: slug: Site identifier old: String to search for (e.g. "http://old-domain.com") new: Replacement string (e.g. "https://new-domain.com") dry_run: Preview only without making changes (default: true) Returns: {"replacements": 42, "tables_affected": 5, "dry_run": true}
| Name | Type | Req | Description |
|---|---|---|---|
| dry_run | boolean | — | — |
| new | string | yes | — |
| old | string | yes | — |
| slug | string | yes | — |
No output schema declared.
No examples provided.
decommission ~116
Delete a site and schedule resource cleanup (7-day grace period). WARNING: This is destructive. The site will be inaccessible immediately but data is retained for 7 days before permanent deletion. Best practice: create a snapshot before decommissioning. Requires: API key with admin scope. Args: slug: Site identifier Returns: {"success": true, "message": "Site scheduled for deletion", "grace_period_days": 7} Errors: NOT_FOUND: Unknown slug
| Name | Type | Req | Description |
|---|---|---|---|
| slug | string | yes | — |
No output schema declared.
No examples provided.
delete_account ~77
Permanently anonymize the account. Cancels subscriptions, deactivates keys. WARNING: This is irreversible. The account will be soft-deleted and all personal data anonymized. All sites will be decommissioned. Requires: API key with admin scope. Returns: {"success": true, "message": "Account anonymized"}
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
delete_alert_rule ~71
Delete an alert rule. Requires: API key with write scope. Args: slug: Site identifier rule_id: UUID of the alert rule to delete Returns: {"deleted": true, "id": "uuid"}
| Name | Type | Req | Description |
|---|---|---|---|
| rule_id | string | yes | — |
| slug | string | yes | — |
No output schema declared.
No examples provided.
delete_compute_volume ~107
Permanently delete a volume and everything stored in it. Irreversible: the instance is released AND the stored data is purged from object storage, so billing genuinely stops. Refuses while an instance is live unless force=True, so a running machine's only copy cannot be destroyed by reflex. Requires: API key with admin scope. Returns: {"id", "state": "deleted"}
| Name | Type | Req | Description |
|---|---|---|---|
| force | boolean | — | — |
| volume_id | string | yes | — |
No output schema declared.
No examples provided.
delete_cron ~78
Delete a cron job by line number. Get line numbers from list_cron(). Requires: API key with write scope. Args: slug: Site identifier line_number: Line number of the cron entry to delete Returns: {"deleted": true}
| Name | Type | Req | Description |
|---|---|---|---|
| line_number | integer | yes | — |
| slug | string | yes | — |
No output schema declared.
No examples provided.
delete_domain_dns ~103
Delete a DNS record from a domain. Requires: API key with write scope. Args: domain_name: Full domain name (e.g. "example.com") record_id: ID of the DNS record to delete (from list_domain_dns) Returns: {"success": true, "message": "DNS record deleted"} Errors: NOT_FOUND: Domain or record not found
| Name | Type | Req | Description |
|---|---|---|---|
| domain_name | string | yes | — |
| record_id | string | yes | — |
No output schema declared.
No examples provided.
delete_file ~116
Delete a file or directory from a site's container. Directories are deleted recursively. Protected system paths (e.g. /etc, /usr) cannot be deleted. Requires: API key with write scope. Args: slug: Site identifier path: Relative path to delete Returns: {"success": true, "path": "...", "message": "Deleted"} Errors: NOT_FOUND: Path doesn't exist FORBIDDEN: Protected system path
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | — |
| slug | string | yes | — |
No output schema declared.
No examples provided.
delete_snapshot ~84
Delete a snapshot (local or B2). Requires: API key with write scope. Args: slug: Site identifier snapshot_id: UUID of the snapshot to delete Returns: {"success": true, "message": "Snapshot deleted"} Errors: NOT_FOUND: Snapshot not found
| Name | Type | Req | Description |
|---|---|---|---|
| slug | string | yes | — |
| snapshot_id | string | yes | — |
No output schema declared.
No examples provided.
deploy ~70
Trigger a deployment for a site. Requires: API key with write scope. This may take up to 60 seconds. Args: slug: Site identifier Returns: {"success": true, "message": "Deployment triggered"} Errors: NOT_FOUND: Unknown slug
| Name | Type | Req | Description |
|---|---|---|---|
| slug | string | yes | — |
No output schema declared.
No examples provided.
detach_compute_volume ~188
Queue: snapshot the machine, verify it, then destroy the instance. This is how you stop paying for compute while keeping your work. ASYNCHRONOUS. Returns immediately with state "detaching" — it does NOT mean the detach finished. The capture takes minutes (roughly 1 min per 10 GB plus verification), so it runs in a background worker. Poll get_compute_volume until state is "detached" (done) or "error" (failed). Safety: if the snapshot or its verification fails, the instance is left RUNNING and the volume goes to state "error". Your data is never traded for a tidy state machine. Retry the detach once you have fixed the cause. Requires: API key with write scope. Returns: Volume dict with state "detaching". Poll for the outcome.
| Name | Type | Req | Description |
|---|---|---|---|
| volume_id | string | yes | — |
No output schema declared.
No examples provided.
domain_detail ~135
Get full domain details including DNS and infrastructure status. Requires: API key with read scope. Args: domain_name: Full domain name (e.g. "example.com") Returns: {"domain": "example.com", "status": "active", "expires_at": "iso8601", "auto_renew": true, "nameservers": ["ns1.borealhost.ai", "ns2.borealhost.ai"], "dns_records": [...], "linked_site": "my-site"} Errors: NOT_FOUND: Domain not owned by this account
| Name | Type | Req | Description |
|---|---|---|---|
| domain_name | string | yes | — |
No output schema declared.
No examples provided.
domain_settings ~183
Update domain settings (auto-renew, WHOIS privacy, registrar lock). Only provided (non-None) fields are updated. Requires: API key with write scope. Args: domain_name: Full domain name (e.g. "example.com") auto_renew: Enable/disable automatic renewal whois_privacy: Enable/disable WHOIS privacy protection locked: Enable/disable registrar lock (prevents unauthorized transfers) Returns: {"success": true, "domain": "example.com", "auto_renew": true, "whois_privacy": true, "locked": true} Errors: NOT_FOUND: Domain not found or not owned by account
| Name | Type | Req | Description |
|---|---|---|---|
| auto_renew | boolean | — | — |
| domain_name | string | yes | — |
| locked | boolean | — | — |
| whois_privacy | boolean | — | — |
No output schema declared.
No examples provided.
execute_query ~132
Execute a SQL query on a site's database. Supports SELECT, INSERT, UPDATE, DELETE, and DDL statements. Results are limited to 1000 rows for SELECT queries. Requires: API key with write scope. Args: slug: Site identifier database: Database name query: SQL query string Returns: {"columns": ["id", "title"], "rows": [[1, "Hello"], ...], "affected_rows": 0, "query_time_ms": 12}
| Name | Type | Req | Description |
|---|---|---|---|
| database | string | yes | — |
| query | string | yes | — |
| slug | string | yes | — |
No output schema declared.
No examples provided.
get_app_status ~127
Get app installation status and log. Poll this after install_app() to track progress. Requires: API key with read scope. Args: slug: Site identifier app_id: App ID from install_app() response Returns: {"id": "uuid", "app_name": "myapp", "status": "running"|"installing"|"failed", "install_log": "..."} Statuses: "installing", "running", "stopped", "failed", "uninstalled"
| Name | Type | Req | Description |
|---|---|---|---|
| app_id | string | yes | — |
| slug | string | yes | — |
No output schema declared.
No examples provided.
get_billing_portal ~100
Get a Stripe billing portal URL for managing payment methods and invoices. Returns a URL (not a redirect) that the human can open in a browser. Requires: API key with read scope. Args: flow: Optional. Set to "payment_method_update" to go directly to the payment method update page. Returns: {"url": "https://billing.stripe.com/p/session/..."}
| Name | Type | Req | Description |
|---|---|---|---|
| flow | string | — | — |
No output schema declared.
No examples provided.
get_checkout_status ~266
Poll a checkout session for status updates. Call this after complete_checkout to track payment and provisioning. Polling strategy: - First 60 seconds: every 5 seconds - After 60 seconds: every 15 seconds - Stop after 10 minutes if not completed Checkout statuses (in order): - "not_ready": Missing required fields (slug) - "ready": All fields set, awaiting payment - "awaiting_payment": Stripe checkout page opened, waiting for human - "in_progress": Payment received, site being provisioned - "completed": Site ready — API key included (shown once, then cleared) - "canceled": Checkout was abandoned - "failed": Payment or provisioning failed Terminal statuses: "completed", "canceled", "failed". Args: checkout_id: Checkout session ID Returns (when completed): {"id": "uuid", "status": "completed", "api_key": "bh_...", "api_key_message": "Store this API key securely...", "subscription_id": "uuid", "completed_at": "iso8601"} Note: The api_key field appears ONCE in the first poll after completion, then is permanently cleared. Store it immediately.
| Name | Type | Req | Description |
|---|---|---|---|
| checkout_id | string | yes | — |
No output schema declared.
No examples provided.
get_compute_instance ~117
Get live details for a compute instance (state, public IP, accrued cost). State is synced from the cloud provider on each call. SSH as root once state is "running" and public_ip is set. Requires: API key with read scope. Args: instance_id: Instance UUID from launch_compute_instance / list Returns: {"id", "state", "public_ip", "hourly_price_cad", "accrued_cad", "terminate_after", ...}
| Name | Type | Req | Description |
|---|---|---|---|
| instance_id | string | yes | — |
No output schema declared.
No examples provided.
get_compute_volume ~89
Get a volume's live state, its instance, and its monthly storage cost. Requires: API key with read scope. Returns: Volume dict plus "monthly_storage_cad". After attach, poll this until instance.state is "running" — then allow a few more minutes for the restore to finish and the machine to reboot into itself.
| Name | Type | Req | Description |
|---|---|---|---|
| volume_id | string | yes | — |
No output schema declared.
No examples provided.
get_database_info ~86
Get WordPress database information (size, tables, row counts). Requires: API key with read scope. WordPress sites only. Args: slug: Site identifier Returns: {"database": "wp_mysite", "size_mb": 45.2, "tables": 12, "total_rows": 15432}
| Name | Type | Req | Description |
|---|---|---|---|
| slug | string | yes | — |
No output schema declared.
No examples provided.
get_logs ~196
Retrieve container logs (error, access, or PHP). Requires: API key with read scope. Args: slug: Site identifier log_type: "error" (Nginx/Apache errors), "access" (HTTP request log), or "php" (PHP-FPM errors, WordPress sites only) lines: Number of lines to retrieve (1–500, default: 100) search: Optional keyword filter — only lines containing this string Returns: {"log_type": "error", "lines": ["2024-01-15 ... error ...", ...], "count": 42, "truncated": false} Errors: NOT_FOUND: Unknown slug VALIDATION_ERROR: Invalid log_type or lines out of range
| Name | Type | Req | Description |
|---|---|---|---|
| lines | integer | — | — |
| log_type | string | — | — |
| search | string | — | — |
| slug | string | yes | — |
No output schema declared.
No examples provided.
get_metrics ~124
Get traffic and performance metrics for a site. Requires: API key with read scope. Args: slug: Site identifier days: Number of days of history (1–90, default: 7) Returns: {"requests": [...], "bandwidth": [...], "errors": [...], "period": {"start": "iso8601", "end": "iso8601"}} Errors: NOT_FOUND: Unknown slug VALIDATION_ERROR: days out of range
| Name | Type | Req | Description |
|---|---|---|---|
| days | integer | — | — |
| slug | string | yes | — |
No output schema declared.
No examples provided.
get_resource_snapshot ~128
Get current resource usage (CPU, memory, disk, load average). Requires: API key with read scope. Args: slug: Site identifier Returns: {"cpu_percent": 12.5, "memory_mb": 384, "memory_total_mb": 512, "disk_used_gb": 3.2, "disk_total_gb": 10, "load_1m": 0.5, "load_5m": 0.3, "load_15m": 0.2}
| Name | Type | Req | Description |
|---|---|---|---|
| slug | string | yes | — |
No output schema declared.
No examples provided.
get_site_status ~147
Get detailed status of a hosted site including resources, domains, and modules. Requires: API key with read scope. Args: slug: Site identifier (the slug chosen during checkout) Returns: {"slug": "my-site", "plan": "site_starter", "status": "active", "domains": ["my-site.borealhost.ai"], "modules": {...}, "resources": {"memory_mb": 512, "cpu_cores": 1, "disk_gb": 10}, "created_at": "iso8601"} Errors: NOT_FOUND: Unknown slug or not owned by this account
| Name | Type | Req | Description |
|---|---|---|---|
| slug | string | yes | — |
No output schema declared.
No examples provided.
get_snapshot_usage ~98
Get snapshot disk usage and quota info for a site. Requires: API key with read scope. Args: slug: Site identifier Returns: {"disk_quota_gb": 200, "max_snapshots": 5, "snapshot_count": 2, "local_snapshot_bytes": 1234, "b2_snapshot_bytes": 5678, "can_create": true}
| Name | Type | Req | Description |
|---|---|---|---|
| slug | string | yes | — |
No output schema declared.
No examples provided.
get_ssh_info ~121
Get SSH connection info for a VPS/dedicated site. Only available for VPS/dedicated plans (not shared hosting). Requires: API key with read scope. Args: slug: Site identifier Returns: {"host": "184.107.x.x", "port": 22, "username": "admin", "ssh_command": "ssh [email protected]"} Errors: NOT_FOUND: Unknown slug FORBIDDEN: Plan does not support SSH (shared plans)
| Name | Type | Req | Description |
|---|---|---|---|
| slug | string | yes | — |
No output schema declared.
No examples provided.