Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, email [email protected] and we’ll put it right.

BorealHost

REMOTE · BOREALHOST.AI · 2 COMPONENTS · SCANNED AUG 3

Agent-native web hosting — deploy sites, manage DNS, register domains, scale infrastructure

+5 this week 65 Trust /100
Trust breakdown (6 categories)

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
Transport & Reachability100
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
Install

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

# add to Claude Code
claude mcp add --transport http ai-borealhost-mcp https://borealhost.ai/mcp/
# ~/.codex/config.toml
[mcp_servers.ai-borealhost-mcp]
url = "https://borealhost.ai/mcp/"
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "ai-borealhost-mcp": {
      "type": "remote",
      "url": "https://borealhost.ai/mcp/",
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add ai-borealhost-mcp --url https://borealhost.ai/mcp/ --transport streamable-http
# ~/.hermes/config.yaml
mcp_servers:
  ai-borealhost-mcp:
    url: "https://borealhost.ai/mcp/"
// mcp.json
{
  "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.

Changelog

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.

Diagnostics

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/
MCP tools — 113 exposed · ~16,544 tokens

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.

Tool Tokens
get_stack_info ~114

Get detailed system stack information (OS, PHP, DB, web server versions). Requires: API key with read scope. Args: slug: Site identifier Returns: {"os": "Debian 12", "kernel": "6.1.0", "php": "8.3.4", "mysql": "10.11.6-MariaDB", "nginx": "1.24.0", "wordpress": "6.5"}

NameTypeReqDescription
slugstringyes

No output schema declared.

No examples provided.

install_app ~286

Install an app template on a VPS/Cloud site. Starts a background installation. Poll get_app_status() for progress. Requires: API key with write scope. VPS or Cloud plan only. Args: slug: Site identifier template: App template slug. Available: django, laravel, nextjs, nodejs, nuxtjs, rails, static app_name: Short name for the app (2-50 chars, lowercase alphanumeric + hyphens). Used as subdomain: {app_name}.{site_domain} db_type: Database type. "none", "mysql", or "postgresql" (depends on template) domain: Custom domain override (default: {app_name}.{site_domain}) display_name: Human-friendly name (default: derived from app_name) Returns: {"id": "uuid", "app_name": "myapp", "status": "installing", "message": "Installation started. Poll for progress."} Errors: FORBIDDEN: Plan does not support apps (shared plans) VALIDATION_ERROR: Invalid template, app_name, or duplicate name

NameTypeReqDescription
app_namestringyes
db_typestring
display_namestring
domainstring
slugstringyes
templatestringyes

No output schema declared.

No examples provided.

launch_compute_instance ~466

Launch an on-demand hourly compute instance (Canada, CAD). Billing starts at launch (per minute, 1-hour minimum) and runs until terminate_compute_instance — stopping does NOT stop the charge. Every instance has a hard TTL (max_lifetime_hours, default 72h) after which it is auto-terminated. Usage is metered onto your existing BorealHost subscription; an active subscription is required. Requires: API key with write scope. Args: instance_type: From list_compute_types, e.g. "lsw.c3.large" image_id: From list_compute_images, e.g. "UBUNTU_24_04_64BIT" name: Optional label for the instance ssh_public_key: Public key installed as root access. Mutually exclusive with user_data (provider limitation) — provide exactly one. user_data: cloud-init config (plain text #cloud-config). Use ssh_authorized_keys inside it if you need a key AND user data. root_disk_size: GB (default max(min_disk, 25)) storage_type: "CENTRAL" (redundant) or "LOCAL" (faster I/O) max_lifetime_hours: Hard TTL, 1-336 (default 72) Returns: Instance dict: {"id", "state": "launching", "public_ip", "instance_type", "hourly_price_cad", "terminate_after", ...}. Poll get_compute_instance until state is "running" and public_ip is set (~1-3 min). Errors: PAYMENT_REQUIRED: No active subscription to bill against LIMIT_EXCEEDED: Concurrent instance cap reached SPEND_CAP_EXCEEDED: Monthly compute spend cap reached VALIDATION_ERROR: Bad type/image/disk/TTL, or both/neither of ssh_public_key and user_data

NameTypeReqDescription
image_idstringyes
instance_typestringyes
max_lifetime_hoursinteger
namestring
root_disk_sizeinteger
ssh_public_keystring
storage_typestring
user_datastring

No output schema declared.

No examples provided.

link_domain ~142

Link a domain to a hosted site. Attaches the domain to the specified site and triggers automatic DNS configuration and SSL provisioning. Requires: API key with write scope. Args: domain_name: Full domain name (e.g. "example.com") site_slug: Site identifier to link the domain to Returns: {"success": true, "domain": "example.com", "linked_site": "my-site", "message": "Domain linked"} Errors: NOT_FOUND: Domain or site not found VALIDATION_ERROR: Domain already linked to another site

NameTypeReqDescription
domain_namestringyes
site_slugstringyes

No output schema declared.

No examples provided.

list_alert_rules ~97

List user-configurable alert rules for a site. Requires: API key with read scope. Args: slug: Site identifier Returns: [{"id": "uuid", "metric": "disk", "operator": "gt", "threshold": 90, "severity": "warning", "enabled": true, "cooldown_minutes": 30, "notify_email": true}]

NameTypeReqDescription
slugstringyes

No output schema declared.

No examples provided.

list_api_keys ~120

List all API keys for the account. Shows key metadata (name, prefix, scopes, last used) but never the full key value. Requires: API key with read scope. Returns: [{"id": "uuid", "name": "My Key", "prefix": "bh_a2...", "scopes": ["read", "write"], "is_active": true, "created_at": "iso8601", "last_used_at": "iso8601"|null, "site_slug": null|"my-site"}]

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

list_apps ~89

List installed apps on a site. Requires: API key with read scope. Args: slug: Site identifier Returns: {"apps": [{"id": "uuid", "app_name": "myapp", "template_slug": "django", "status": "running", "domain": "myapp.mysite.borealhost.ai"}]}

NameTypeReqDescription
slugstringyes

No output schema declared.

No examples provided.

list_backups ~102

List all backups for a site (automatic and manual). Requires: API key with read scope. Args: slug: Site identifier Returns: [{"id": "uuid", "backup_type": "auto"|"manual", "status": "completed", "size_bytes": 1234, "size_display": "1.2 Mo", "timestamp": "iso8601", "notes": "..."}]

NameTypeReqDescription
slugstringyes

No output schema declared.

No examples provided.

list_compute_images ~82

List OS images available for on-demand compute instances. Requires: API key with read scope. Returns: {"images": [{"id": "UBUNTU_24_04_64BIT", "name": "Ubuntu 24.04 LTS (x86_64)", "family": "linux", "flavour": "ubuntu"}, ...]}

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

list_compute_instances ~74

List your on-demand compute instances with month-to-date spend. Requires: API key with read scope. Returns: {"instances": [...], "month_to_date_spend_cad": 12.34, "monthly_spend_cap_cad": 500.0}

NameTypeReqDescription
include_terminatedboolean

No output schema declared.

No examples provided.

list_compute_types ~184

List on-demand compute instance types with hourly CAD prices. On-demand instances are real cloud VMs in Canada (Montreal region), billed per minute (1-hour minimum) post-paid onto your existing BorealHost subscription. Use them for short-lived extra compute (builds, batch jobs, experiments). Requires: API key with read scope. Returns: {"region": "ca-central-1", "currency": "CAD", "billing": "hourly, post-paid; billing runs until the instance is terminated", "types": [{"type": "lsw.c3.large", "vcpu": 2, "memory_gb": 3, "hourly_price_cad": 0.08, "min_disk_gb": 5, "storage_types": ["CENTRAL", "LOCAL"]}, ...]}

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

list_compute_volumes ~187

List your compute volumes — machines that survive instance termination. A volume is a whole machine (packages, drivers, services, users, data) stored in Canada. Detaching destroys the instance but keeps the machine; attaching restores it onto a fresh instance, optionally of a DIFFERENT type. That is how you move a workload from a small CPU box to a big GPU box without rebuilding it. Requires: API key with read scope. Returns: {"volumes": [{"id", "name", "state", "instance_type", "stored_gb", "has_snapshot", "instance": {...} or null}, ...], "price_cad_per_gb_month": 0.03} state is one of: creating, attached, detaching, detached, attaching, error. Only "attached" has a running instance you can log into.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

list_cron ~82

List cron jobs on a site. Requires: API key with read scope. Args: slug: Site identifier Returns: {"jobs": [{"line": 1, "schedule": "*/5 * * * *", "command": "/usr/bin/php /var/www/html/wp-cron.php"}, ...]}

NameTypeReqDescription
slugstringyes

No output schema declared.

No examples provided.

list_databases ~57

List all databases on a site's container. Requires: API key with read scope. Args: slug: Site identifier Returns: {"databases": ["wordpress", "app_db", ...]}

NameTypeReqDescription
slugstringyes

No output schema declared.

No examples provided.

list_domain_dns ~139

List all DNS records for a domain. Returns DNS records at the domain level (independent of site-level manage_dns). Use this for domains that may not be linked to a site. Requires: API key with read scope. Args: domain_name: Full domain name (e.g. "example.com") Returns: [{"id": "record-id", "type": "A", "subdomain": "www", "value": "1.2.3.4", "ttl": 3600}] Errors: NOT_FOUND: Domain not found or not owned by account

NameTypeReqDescription
domain_namestringyes

No output schema declared.

No examples provided.

list_domains ~68

List all domains owned by the authenticated user. Requires: API key with read scope. Returns: [{"domain": "example.com", "status": "active", "expires_at": "iso8601", "auto_renew": true, "linked_site": "my-site"}]

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

list_files ~171

List files and directories in a site's container. Path scoping depends on the plan: - Shared plans: rooted at wp-content/ (WordPress content directory) - VPS/dedicated plans: full filesystem access Requires: API key with read scope. Args: slug: Site identifier path: Relative path to list (empty for root of accessible area) Returns: {"path": "/", "entries": [{"name": "index.php", "type": "file", "size": 1234, "modified": "iso8601"}, {"name": "uploads", "type": "directory", "modified": "iso8601"}]} Errors: NOT_FOUND: Unknown slug or path doesn't exist

NameTypeReqDescription
pathstring
slugstringyes

No output schema declared.

No examples provided.

list_firewall_rules ~105

List IP allow/deny firewall rules for a site. Rules are implemented as Nginx allow/deny directives per container. Requires: API key with read scope. Args: slug: Site identifier Returns: {"rules": [{"ip": "1.2.3.4", "action": "deny"}, {"ip": "10.0.0.0/8", "action": "allow"}]}

NameTypeReqDescription
slugstringyes

No output schema declared.

No examples provided.

list_ftp_accounts ~139

List SFTP accounts on a site. Also returns the host and port to connect to. Do not use the site's domain for SFTP: it is Cloudflare-proxied and only carries HTTP(S). Requires: API key with read scope. Args: slug: Site identifier Returns: {"accounts": [{"username": "sftpuser", "home": "/wordpress", "uid": 1001}], "configured": true, "connection": {"host": "1.2.3.4", "port": 9312, "protocol": "SFTP"}}

NameTypeReqDescription
slugstringyes

No output schema declared.

No examples provided.

list_modules ~110

List AI modules and their enabled/disabled state for a site. Also returns the list of modules available for the site's plan. Requires: API key with read scope. Args: slug: Site identifier Returns: {"modules": {"chatbot": true, "seo": false, "translation": false, "content": false}, "available": ["chatbot", "seo", "translation", "content"]} Errors: NOT_FOUND: Unknown slug

NameTypeReqDescription
slugstringyes

No output schema declared.

No examples provided.

list_php_versions ~90

List available PHP versions and the currently active one. Requires: API key with read scope. Args: slug: Site identifier Returns: {"versions": [{"version": "8.1", "active": false}, {"version": "8.2", "active": false}, {"version": "8.3", "active": true}]}

NameTypeReqDescription
slugstringyes

No output schema declared.

No examples provided.

list_plans ~169

List available hosting plans with pricing and resources. No authentication needed. Args: track: Filter by plan track. Valid values: "single_site", "agency". Leave empty to list all tracks. include_deprecated: Include deprecated plans (default: false) Returns: [{"slug": "site_starter", "name": "Starter", "track": "single_site", "hosting_type": "shared", "price": {"monthly": 5, "annual": 2, "currency": "CAD"}, "resources": null, "features": {"max_sites": 1, "ai_modules": [...], "ai_agents": [], "free_domain_annual": false}}, ...]

NameTypeReqDescription
include_deprecatedboolean
trackstring

No output schema declared.

No examples provided.

list_plugins ~81

List installed WordPress plugins with status. Requires: API key with read scope. WordPress sites only. Args: slug: Site identifier Returns: {"plugins": [{"name": "akismet", "status": "active", "version": "5.3", "update_available": false}, ...]}

NameTypeReqDescription
slugstringyes

No output schema declared.

No examples provided.

list_snapshots ~114

List all snapshots and scheduled snapshots for a site. Requires: API key with read scope. Args: slug: Site identifier Returns: {"snapshots": [{"id": "uuid", "name": "snap-...", "status": "completed", "storage_type": "local"|"b2", "size_bytes": 1234, "size_display": "1.2 Mo", "created_at": "iso8601"}], "scheduled": [...]}

NameTypeReqDescription
slugstringyes

No output schema declared.

No examples provided.

list_subscriptions ~106

List all subscriptions with plan details, pricing, status, and site slug. Requires: API key with read scope. Returns: [{"id": "uuid", "plan_slug": "site_starter", "plan_name": "Starter", "status": "active", "billing_period": "monthly", "price": {"amount": 500, "currency": "cad"}, "site_slug": "my-site", "created_at": "iso8601"}]

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

list_tables ~82

List tables in a database. Requires: API key with read scope. Args: slug: Site identifier database: Database name Returns: {"tables": [{"name": "wp_posts", "rows": 1234, "size_mb": 5.2}, ...]}

NameTypeReqDescription
databasestringyes
slugstringyes

No output schema declared.

No examples provided.

list_themes ~86

List installed WordPress themes with status. Requires: API key with read scope. WordPress sites only. Args: slug: Site identifier Returns: {"themes": [{"name": "twentytwentyfour", "status": "active", "version": "1.0", "update_available": false}, ...]}

NameTypeReqDescription
slugstringyes

No output schema declared.

No examples provided.

manage_dns ~276

Create or delete DNS records for a site. Requires: API key with write scope. Args: slug: Site identifier action: "create" or "delete" record_type: "A", "AAAA", "CNAME", "MX", "TXT", or "SRV" subdomain: Subdomain part (e.g. "www", "mail"). Leave empty for the apex/root domain. value: Record value. Required for "create". Examples: A: "1.2.3.4", CNAME: "example.com", MX: "mail.example.com", TXT: "v=spf1 include:_spf.google.com ~all" ttl: Time to live in seconds (default: 3600) Returns: {"success": true, "record": {"type": "A", "subdomain": "www", "value": "1.2.3.4", "ttl": 3600}} Errors: VALIDATION_ERROR: Missing value for create, invalid record type NOT_FOUND: Unknown slug

NameTypeReqDescription
actionstringyes
record_typestringyes
slugstringyes
subdomainstring
ttlinteger
valuestring

No output schema declared.

No examples provided.

manage_plugin ~116

Install, activate, deactivate, or delete a WordPress plugin. Requires: API key with write scope. Args: slug: Site identifier action: "install", "activate", "deactivate", or "delete" plugin: Plugin slug (e.g. "akismet", "jetpack", "woocommerce") Returns: {"action": "install", "plugin": "jetpack", "result": {...}}

NameTypeReqDescription
actionstringyes
pluginstringyes
slugstringyes

No output schema declared.

No examples provided.

manage_theme ~109

Install, activate, or delete a WordPress theme. Requires: API key with write scope. Args: slug: Site identifier action: "install", "activate", or "delete" theme: Theme slug (e.g. "twentytwentyfour", "astra") Returns: {"action": "install", "theme": "astra", "result": {...}}

NameTypeReqDescription
actionstringyes
slugstringyes
themestringyes

No output schema declared.

No examples provided.

optimize_database ~58

Optimize WordPress database tables (reduces bloat). Requires: API key with write scope. Args: slug: Site identifier Returns: {"optimized": true, "tables_optimized": 12}

NameTypeReqDescription
slugstringyes

No output schema declared.

No examples provided.

read_file ~141

Read the contents of a file from a site's container. Max file size: 512KB. Binary files are rejected — use the site's file manager or SSH for binary files. Requires: API key with read scope. Args: slug: Site identifier path: Relative path to the file Returns: {"path": "wp-config.php", "content": "<?php ...", "size": 1234, "encoding": "utf-8"} Errors: NOT_FOUND: File doesn't exist VALIDATION_ERROR: File is binary or exceeds 512KB

NameTypeReqDescription
pathstringyes
slugstringyes

No output schema declared.

No examples provided.

reboot_compute_instance ~32

Reboot a running compute instance. Requires: API key with write scope.

NameTypeReqDescription
instance_idstringyes

No output schema declared.

No examples provided.

register ~241

Register a new agent account and get an API key. No authentication needed. The returned API key grants read+write access to all BorealHost API endpoints. Store it securely — it cannot be retrieved again. The key is automatically activated for this session — all subsequent tool calls will use it. No extra configuration needed. If no email is provided, a synthetic agent identity is created (agent-{uuid}@api.borealhost.ai). If an email is provided, it links to an existing or new human account. Args: name: Human-readable name for this API key (default: "Agent Key") email: Optional email to link to a human account Returns: {"api_key": "bh_...", "key_id": "uuid", "prefix": "bh_...", "scopes": ["read", "write"], "account_id": "uuid", "message": "Store this API key securely..."} Errors: RATE_LIMITED: Max 5 registrations per IP per hour VALIDATION_ERROR: Invalid email format

NameTypeReqDescription
emailstring
namestring

No output schema declared.

No examples provided.

register_domain ~778

Register a new domain with WHOIS contact info and Stripe billing. The domain cost is charged to the user's active subscription. Free domain if plan includes free_domain_annual + annual billing + first domain. Requires: API key with write scope. Args: domain: Full domain name (e.g. "example.ca", "mybusiness.com") first_name: Registrant first name last_name: Registrant last name email: Registrant email address phone: Phone number in E.164 format: "+1.5145551234" address1: Street address (e.g. "123 Rue Principale") city: City (e.g. "Montreal") state: Province/state code (e.g. "QC", "ON", "BC") postal_code: Postal/ZIP code (e.g. "H2X 1Y4") country: ISO 3166-1 alpha-2 country code (default: "CA") period: Registration period in years (1–10, default: 1) usage_mode: What the domain points at. "site" (default) links it to the billing subscription's site with automatic DNS + Nginx + SSL. "external_ns" delegates it to `nameservers` — the domain is registered here but hosted elsewhere; we manage no DNS. "dns_only" keeps it on our DNS with no site behind it. "forward" redirects visitors to `forward_url`. nameservers: Ordered list of 2–6 nameserver hostnames. Required when usage_mode="external_ns" (e.g. ["ns1.other.com", "ns2.other.com"]) forward_url: Redirect target, required when usage_mode="forward" (e.g. "https://example.org") forward_type: "301" permanent (default) or "302" temporary forward_include_path: Append the visitor's path to the target (default: True) ca_legal_type: Required for .ca domains. CIRA legal types: "CCO" (Canadian citizen), "RES" (permanent resident), "CCT" (corporation), "GOV" (government), "EDU" (education), "ASS" (association), "HOP" (hospital), "PRT" (partnership), "TDM" (tradem…

NameTypeReqDescription
address1stringyes
ca_legal_typestring
citystringyes
countrystring
domainstringyes
emailstringyes
first_namestringyes
forward_include_pathboolean
forward_typestring
forward_urlstring
last_namestringyes
nameserversarray
periodinteger
phonestringyes
postal_codestringyes
statestringyes
usage_modestring

No output schema declared.

No examples provided.

remove_firewall_rule ~86

Remove an IP firewall rule and reload Nginx. Requires: API key with write scope. Args: slug: Site identifier ip: IP address or CIDR to remove (must match exactly) Returns: {"removed": true, "ip": "1.2.3.4"}

NameTypeReqDescription
ipstringyes
slugstringyes

No output schema declared.

No examples provided.

remove_ftp_account ~74

Remove an SFTP account from a site. Requires: API key with write scope. Args: slug: Site identifier username: SFTP username to remove Returns: {"removed": true, "username": "sftpuser"}

NameTypeReqDescription
slugstringyes
usernamestringyes

No output schema declared.

No examples provided.

request_api_key ~235

Request an API key for a site you are running on (challenge-response). This starts a two-step verification flow: 1. A claim token is written to your container at ~/.borealhost/.claim_token (mode 600, owner admin — only readable if you're on the container) 2. Read that file and call claim_api_key(token) within 1 hour This proves you have access to the container without storing any secrets on disk permanently. The claim token is single-use and ephemeral. No authentication needed — the proof is reading the file from the container. Args: site_slug: The site identifier (your BorealHost site slug) Returns: {"status": "pending", "site_slug": "my-site", "expires_in_seconds": 3600, "claim_path": "~/.borealhost/.claim_token", "instructions": "Read the claim token and call claim_api_key()..."} Errors: VALIDATION_ERROR: Unknown site slug or no active subscription RATE_LIMITED: Too many pending claim tokens

NameTypeReqDescription
site_slugstringyes

No output schema declared.

No examples provided.

restore_backup ~116

Restore a site from a backup. WARNING: This is destructive. The current state of the site will be replaced. Runs asynchronously — may take several minutes. Requires: API key with admin scope. Args: slug: Site identifier backup_id: UUID of the backup to restore from Returns: {"success": true, "message": "Restore started..."} Errors: VALIDATION_ERROR: Backup not found or not in completed state

NameTypeReqDescription
backup_idstringyes
slugstringyes

No output schema declared.

No examples provided.

revoke_api_key ~91

Revoke (deactivate) an API key. The key stops working immediately. Requires: API key with write scope. Args: key_id: UUID of the key to revoke (from list_api_keys or whoami) Returns: {"success": true, "message": "API key revoked"} Errors: NOT_FOUND: Key not found or already revoked

NameTypeReqDescription
key_idstringyes

No output schema declared.

No examples provided.

rollback_snapshot ~116

Rollback a site to a previous snapshot. WARNING: This is destructive. The current state of the container will be replaced with the snapshot contents. Requires: API key with admin scope. Args: slug: Site identifier snapshot_id: UUID of the snapshot to rollback to Returns: {"success": true, "message": "Rolled back to snapshot ..."} Errors: NOT_FOUND: Snapshot not found or not in completed state

NameTypeReqDescription
slugstringyes
snapshot_idstringyes

No output schema declared.

No examples provided.

rotate_key ~150

Atomically rotate an API key. Old key is immediately invalidated. Creates a new key with the same name, scopes, and rate limits. The new key is returned once — store it immediately. Requires: API key with write scope. Args: key_id: UUID of the API key to rotate (get from whoami()) Returns: {"api_key": "bh_...", "key_id": "uuid", "prefix": "bh_...", "scopes": ["read", "write"], "message": "Key rotated. Store securely."} Note: The old key stops working immediately. Update BOREALHOST_API_KEY right away.

NameTypeReqDescription
key_idstringyes

No output schema declared.

No examples provided.

run_malware_scan ~180

Run a ClamAV malware scan on a site's container. Scans the web root (or specified path) for malware, viruses, and trojans. ClamAV is installed automatically if not present. Excludes node_modules, vendor, .git, and cache directories. May take up to 5 minutes for large sites. Requires: API key with write scope. Args: slug: Site identifier path: Directory to scan (default: /var/www/html) Returns: {"infected_files": [{"path": "/var/www/html/shell.php", "threat": "Php.Malware.Agent"}], "scanned_count": 1234, "infected_count": 1, "scan_time_s": 45.2}

NameTypeReqDescription
pathstring
slugstringyes

No output schema declared.

No examples provided.

scale ~146

Change a site's hosting plan (upgrade or downgrade). Requires: API key with admin scope. Best practice: create a snapshot before downgrading. Args: slug: Site identifier new_plan: Target plan slug (e.g. "site_pro", "site_managed"). Call list_plans() to see available plans. Returns: {"success": true, "old_plan": "site_starter", "new_plan": "site_pro", "message": "Plan changed successfully"} Errors: NOT_FOUND: Unknown slug VALIDATION_ERROR: Invalid plan slug or same plan

NameTypeReqDescription
new_planstringyes
slugstringyes

No output schema declared.

No examples provided.

schedule_snapshot ~131

Schedule a snapshot for future execution. Requires: API key with write scope. Max 3 pending schedules per site. Args: slug: Site identifier scheduled_at: ISO 8601 datetime (must be in the future) description: Optional description (max 200 chars) Returns: {"id": "uuid", "scheduled_at": "iso8601", "status": "scheduled"} Errors: VALIDATION_ERROR: Invalid datetime, not in future, or too many pending

NameTypeReqDescription
descriptionstring
scheduled_atstringyes
slugstringyes

No output schema declared.

No examples provided.

search_domain ~110

Check domain availability and get pricing. Requires: API key with read scope. Args: domain: Full domain name (e.g. "example.com", "mybiz.ca") Returns: {"domain": "example.com", "available": true, "price": {"amount": 15.99, "currency": "CAD", "period": "1 year"}, "premium": false} Note: .ca domains require ca_legal_type when registering.

NameTypeReqDescription
domainstringyes

No output schema declared.

No examples provided.

set_api_key ~131

Set your BorealHost API key for this session. Call this if you already have an API key (from a previous registration, checkout completion, or the BorealHost panel). All subsequent tool calls will use this key for authentication. No need to call this after register() — the key is set automatically. Args: api_key: Your BorealHost API key (format: bh_<48 hex chars>) Returns: {"success": true, "message": "API key set for this session", "key_prefix": "bh_..."}

NameTypeReqDescription
api_keystringyes

No output schema declared.

No examples provided.

set_domain_usage ~461

Set what a registered domain points at — a site, someone else's nameservers, our DNS with no site, or a redirect to another URL. Use this to park a domain, hand it to an external host, or forward it. Switching modes tears down the previous one (a forwarded domain that becomes a site domain loses its redirect, and vice versa). Requires: API key with write scope. Args: domain_name: Full domain name (e.g. "example.com") usage_mode: "site" — link it to a hosted site (needs site_slug); "external_ns" — delegate to the customer's own nameservers (needs nameservers), we stop managing its DNS entirely; "dns_only" — our nameservers, records edited by hand, nothing served; "forward" — our nameservers plus an HTTP redirect to forward_url (needs forward_url) site_slug: Site to link to, when usage_mode="site" nameservers: Ordered list of 2–6 nameserver hostnames, when usage_mode="external_ns" forward_url: Redirect target, when usage_mode="forward" forward_type: "301" permanent (default) or "302" temporary forward_include_path: Append the visitor's path to the target (default: True) Returns: {"domain": "example.com", "usage_mode": "forward", "forward_url": "https://example.org", "configuration": {"dns": true, "nginx": true, "ssl": false, ...}} For forward mode, ssl=false usually just means DNS has not propagated yet — call this tool again a few minutes later to finish the cert. Errors: NOT_FOUND: Domain or site not found VALIDATION_ERROR: Bad nameserver hostname, bad redirect URL, missing site_slug, or a self-referential redirect

NameTypeReqDescription
domain_namestringyes
forward_include_pathboolean
forward_typestring
forward_urlstring
nameserversarray
site_slugstring
usage_modestringyes

No output schema declared.

No examples provided.

snapshot_compute_volume ~186

Queue a checkpoint snapshot without detaching — before a risky change. ASYNCHRONOUS. Returns immediately with state "snapshotting"; poll get_compute_volume until it is back to "attached" (done) or "error". Named systemd units are stopped for the capture so the snapshot is application-consistent (a live database directory copied mid-write is not reliably restorable). The worker restarts nothing — reboot or start them yourself afterwards. Requires: API key with write scope. Args: volume_id: A volume in state "attached" quiesce_units: Services to stop during capture, e.g. ["ollama.service", "postgresql.service"] Returns: Volume dict with state "snapshotting". Poll for the outcome.

NameTypeReqDescription
quiesce_unitsarray
volume_idstringyes

No output schema declared.

No examples provided.

ssl_info ~90

Get SSL certificate information for a site. Returns certificate details, expiry date, and issuer. Requires: API key with read scope. Args: slug: Site identifier Returns: {"issuer": "Let's Encrypt", "domain": "example.com", "expires_at": "iso8601", "days_remaining": 60, "force_https": true}

NameTypeReqDescription
slugstringyes

No output schema declared.

No examples provided.