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

BorealHost

REMOTE · BOREALHOST.AI · 2 COMPONENTS · SCANNED SEP 20

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

0 this week 75 Trust /100
Trust breakdown (7 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 → Why this is hard to score →

Endpoint Security57
Transport & Reachability100
Schema Quality & AI Usability79
  • 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
  • AI-judged instruction clarity (good).Pass
  • Context-footprint check failed: tool/resource definitions use about 27636 tokens (~146/item across 189 items; 184 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 Management99
  • Stability check failed: schema churn in the 30 days we've observed: 1 tool removals, 0 breaking changes, 0 auth/transport breaks, 41 additions. See how to fix → Fail
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
Tool Safety75
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • 0 of 27 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "delete_snapshot" implies "delete" and declares no destructiveHint at all, which the MCP spec reads as destructive by default. See how to fix → Fail
  • An AI judge read all 186 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Install

How do I install the BorealHost MCP server?

BorealHost is a hosted endpoint at https://borealhost.ai/mcp/, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

remote · borealhost.ai

# add to Claude Code
claude mcp add --transport http ai-borealhost-mcp 'https://borealhost.ai/mcp/'
// .cursor/mcp.json
{
  "mcpServers": {
    "ai-borealhost-mcp": {
      "url": "https://borealhost.ai/mcp/"
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "ai-borealhost-mcp": {
      "type": "http",
      "url": "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/"
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "ai-borealhost-mcp": {
      "Transport": "http",
      "Url": "https://borealhost.ai/mcp/"
    }
  }
}
# add to Vellum
assistant mcp add ai-borealhost-mcp -t streamable-http -u '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.

  • 20 Sept 26 0
    • Stability: pass → fail security
    • A breaking change shipped without a version bump: still 1.27.0 security
    • Tool “register” was removed security
    • The server rewrote its instructions, which are the text every model session reads security
    • Tool “search_domain” rewrote its description, which is the text the model reads security
    • Tool “add_domain_dns” rewrote its description, which is the text the model reads security
    • Tool “create_api_key” rewrote its description, which is the text the model reads security
    • Tool “decommission” rewrote its description, which is the text the model reads security
    • Tool “domain_settings” rewrote its description, which is the text the model reads security
    • Tool “execute_query” rewrote its description, which is the text the model reads security
    • Tool “install_app” rewrote its description, which is the text the model reads security
    • Tool “list_domain_dns” rewrote its description, which is the text the model reads security
    • Tool “manage_dns” rewrote its description, which is the text the model reads security
    • Tool “register_domain” rewrote its description, which is the text the model reads security
    • Tool “rotate_key” rewrote its description, which is the text the model reads security
    • Tool “set_api_key” rewrote its description, which is the text the model reads security
    • Schema quality: 24346 → 27636 functional
    • Schema quality: excellent → good functional
    • New tool “add_mailbox_alias” functional
    • New tool “add_port_forward” functional
    • New tool “browse_backup” functional
    • New tool “clear_mailbox_forwarding” functional
    • New tool “configure_email_dns” functional
    • New tool “create_mailbox_token” functional
    • New tool “delete_email_mailbox” functional
    • New tool “disable_email_domain” functional
    • New tool “enable_email_domain” functional
    • New tool “find_address” functional
    • New tool “get_database_recovery” functional
    • New tool “get_email_domain” functional
    • New tool “get_email_webmail_url” functional
    • New tool “get_file_recovery” functional
    • New tool “get_mailbox” functional
    • New tool “list_email_audit” functional
    • New tool “list_email_domains” functional
    • New tool “list_mailbox_aliases” functional
    • New tool “list_mailboxes” functional
    • New tool “list_port_forwards” functional
    • New tool “logout_mailbox_sessions” functional
    • New tool “recover_backup_database” functional
    • New tool “recover_backup_files” functional
    • New tool “remove_mailbox_alias” functional
    • New tool “remove_port_forward” functional
    • New tool “resend_registrant_verification” functional
    • New tool “reset_email_mailbox_password” functional
    • New tool “restore_mailbox” functional
    • New tool “rotate_email_key” functional
    • New tool “set_mailbox_aliases” functional
    • New tool “update_email_domain” functional
    • New tool “update_mailbox” functional
    • New tool “create_email_mailbox” functional
    • “create_api_key” added an optional parameter “email_domains” cosmetic
    • “create_api_key” added an optional parameter “expires_at” cosmetic
    • “create_api_key” added an optional parameter “ip_allowlist” cosmetic
    • “register_domain” added an optional parameter “quote_only” cosmetic
    • “register_domain” added an optional parameter “quote_token” cosmetic
    • “register_domain” added an optional parameter “whois_privacy” cosmetic
    • “rotate_key” added an optional parameter “grace_minutes” cosmetic
    • “add_domain_dns” dropped the optional parameter “ttl” cosmetic
    • “manage_dns” dropped the optional parameter “ttl” cosmetic
  • 4 Sept 26 0
    • Stability: fail → pass security
  • 29 Aug 26 0
    • Tool “complete_checkout” rewrote its description, which is the text the model reads security
    • Tool “list_plans” rewrote its description, which is the text the model reads security
    • Tool “request_api_key” rewrote its description, which is the text the model reads security
    • Tool “update_checkout” rewrote its description, which is the text the model reads security
    • Tool “claim_api_key” rewrote its description, which is the text the model reads security
    • New tool “add_site” functional
    • New tool “get_wallet” functional
    • New tool “set_site_type” functional
    • “update_checkout” added an optional parameter “site_type” cosmetic
  • 26 Aug 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
  • 25 Aug 26 +1
    • The server rewrote its instructions, which are the text every model session reads security
    • Tool “create_checkout” rewrote its description, which is the text the model reads security
    • Tool “get_checkout_status” rewrote its description, which is the text the model reads security
    • Tool “complete_checkout” rewrote its description, which is the text the model reads security
    • Tool “link_domain” rewrote its description, which is the text the model reads security
    • New tool “cancel_checkout” functional
    • New tool “delete_subdomain” functional
    • New tool “list_checkouts” functional
    • New tool “set_site_nginx_snippet” functional
    • New tool “get_site_nginx_snippet” functional
  • 23 Aug 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 89 to 92.

  • 11 Aug 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
  • 7 Aug 26 0
    • The server no longer declares the “experimental” capability functional
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 20 Sept 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 3 Sept 2026 2 Dec 2026 ECDSA 256 ECDSA-SHA384 5bc108d01b5e6db29a7f7c52e60fd4f2090
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

Background: What to check on a remote MCP endpoint →

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' https://challenges.cloudflare.com '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://con

Background: How OAuth 2.1 works in the 2026 MCP spec →

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 · 184 exposed · ~25,764 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. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
delete_redirect ~60

Delete a redirect rule by source path or id. Requires: API key with write scope. Returns: {"site", "deleted": true}

NameTypeReqDescription
redirect_idstring
slugstringyes
source_pathstring

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

NameTypeReqDescription
slugstringyes
snapshot_idstringyes

No output schema declared.

No examples provided.

delete_subdomain ~195

Remove a subdomain: its DNS record, nginx vhost and certificate. The inverse of add_subdomain. Removes the DNS record AND the server-side vhost and cert, so the name stops resolving and stops being served. Nothing else on the domain is touched. Requires: API key with write scope. Args: domain_name: Registrable domain linked to a site (e.g. "example.com") subdomain: Subdomain label only, no dots (e.g. "blog") Returns: {"fqdn": "blog.example.com", "domain": "example.com", "removed": ["dns", "vhost", "cert"], "message": "..."} Errors: NOT_FOUND: Domain or subdomain not found VALIDATION_ERROR: Domain not linked to a site, or invalid label

NameTypeReqDescription
domain_namestringyes
subdomainstringyes

No output schema declared.

No examples provided.

delete_webhook ~41

Remove a webhook endpoint. Requires: API key with write scope. Returns: {"id", "deleted": true}

NameTypeReqDescription
endpoint_idstringyes

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.

NameTypeReqDescription
volume_idstringyes

No output schema declared.

No examples provided.

disable_email_domain ~43

Disable an empty email domain; refuses active or recoverable accounts.

NameTypeReqDescription
actorstring
domainstringyes
reasonstring

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

NameTypeReqDescription
domain_namestringyes

No output schema declared.

No examples provided.

domain_settings ~202

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: Optional bool enabling/disabling automatic renewal whois_privacy: Optional bool. False disables saved proxy service. Paid activation via True is refused; request an activation quote through Support. locked: Optional bool enabling/disabling 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

NameTypeReqDescription
auto_renewboolean
domain_namestringyes
lockedboolean
whois_privacyboolean

No output schema declared.

No examples provided.

enable_email_domain ~118

Enable an independent email domain; preserve all other email domains. Requires a verified owned domain and email:write scope. site_slug selects billing when ambiguous. Defaults request 2,000 users and 50,000 aliases.

NameTypeReqDescription
actorstring
alias_limitinteger
configure_dnsboolean
dmarc_reporting_addressstring
domainstringyes
mailbox_limitinteger
reasonstring
site_slugstring

No output schema declared.

No examples provided.

enable_smtp_relay ~128

Enable an SMTP relay for a site's outbound transactional mail. Provisions a mail-send-only credential on the platform relay and configures SPF/DKIM DNS when the domain zone is hosted here. The SMTP password is returned ONCE. Use TLS on port 587, username "apikey". Requires: API key with write scope. Returns: {"relay_id", "domain", "smtp_host", "smtp_ports", "smtp_username", "smtp_password", "dns_auto_configured", "message"}

NameTypeReqDescription
domainstringyes
slugstringyes

No output schema declared.

No examples provided.

enable_wildcard ~118

Route *.domain (every subdomain) to the domain's linked site. Creates a wildcard DNS record and issues a wildcard certificate via ACME DNS-01. SLOW — DNS propagation is part of the challenge, expect 2-5 minutes. Requires the domain to be linked to a site and its DNS hosted by BorealHost. Requires: API key with write scope. Returns: {"domain", "wildcard", "site", "ssl_active", "not_after"}

NameTypeReqDescription
domain_namestringyes

No output schema declared.

No examples provided.

execute_query ~355

Run ONE bounded read against a site's database. One statement, beginning with SELECT, SHOW, DESCRIBE or EXPLAIN, with no second statement and no data-modifying clause anywhere in it. The container proves the statement is a read before running it and caps the result: 200 rows by default, 1000 maximum, 2 MB of cell data. `truncated` in the response says whether a cap was reached. ⚠ THIS TOOL CANNOT CHANGE ANYTHING, AND RETRYING WITH DIFFERENT WORDING WILL NOT MAKE IT. Anything that is not a single bounded read is refused with READ_ONLY and nothing runs. To change data or schema, use the tool for the job: optimize_database, database_search_replace, manage_db_user, list_databases, list_tables — and for creating, altering, dropping, importing or exporting tables, the database manager in the control panel, which has no tool here. Requires: API key with write scope (unchanged — the scope is the customer's published permission for this operation, not a claim about what it does). Args: slug: Site identifier database: Database name query: One read statement Returns: {"columns": ["id", "user_email"], "rows": [[1, "a@example.com"], ...], "row_count": 1, "truncated": false, "execution_time_ms": 12.0} Errors: READ_ONLY: Not a single bounded read. The error text carries the explanation and names the operation to use instead.

NameTypeReqDescription
databasestringyes
querystringyes
slugstringyes

No output schema declared.

No examples provided.

find_address ~29

Look up mailbox/alias/forward/free in an authorized email domain.

NameTypeReqDescription
addressstringyes

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"

NameTypeReqDescription
app_idstringyes
slugstringyes

No output schema declared.

No examples provided.

get_backup_retention ~60

Get the backup retention policy for a VPS site. Requires: API key with read scope. Returns: {"site", "retention": {"keep_daily", "keep_weekly", "keep_monthly"}}

NameTypeReqDescription
slugstringyes

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/..."}

NameTypeReqDescription
flowstring

No output schema declared.

No examples provided.

get_checkout_status ~362

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...", "api_key_pending": false, "subscription_id": "uuid", "subscription_status": "active", "site": {"slug": "my-site", "status": "active", "url": "https://my-site.borealhost.ai"}, "completed_at": "iso8601"} Immediately after payment `site` may be null with a `provisioning_message` — the site is being built. Poll again in a few seconds. Note: The api_key field appears ONCE in the first poll after completion, then is permanently cleared. `api_key_pending` tells you whether it is still waiting to be collected. Store it immediately.

NameTypeReqDescription
checkout_idstringyes

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", ...}

NameTypeReqDescription
instance_idstringyes

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.

NameTypeReqDescription
volume_idstringyes

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}

NameTypeReqDescription
slugstringyes

No output schema declared.

No examples provided.

get_database_recovery ~81

Poll one database recovery without waiting for completion. Requires: API key with read scope. Args: slug: Site identifier backup_id: UUID of the source backup recovery_id: UUID returned by ``recover_backup_database``

NameTypeReqDescription
backup_idstringyes
recovery_idstringyes
slugstringyes

No output schema declared.

No examples provided.

get_email_domain ~31

Read effective OpenSRS limits, counts, connections and public DNS health.

NameTypeReqDescription
domainstringyes

No output schema declared.

No examples provided.

get_email_status ~56

Email addon status and mailboxes for a site. Requires: API key with read scope. Returns: {"configured": bool, "domain", "mailboxes", "mailbox_list": [...]}

NameTypeReqDescription
slugstringyes

No output schema declared.

No examples provided.

get_email_webmail_url ~67

Issue a one-use BorealHost link expiring in 60 seconds. Redemption mints provider SSO. Requires email:signon.

NameTypeReqDescription
actorstring
emailstringyes
languagestring
reasonstring

No output schema declared.

No examples provided.

get_file_recovery ~125

Poll one selected-file recovery without waiting for it to finish. Requires: API key with read scope. Args: slug: Site identifier backup_id: UUID of the source backup recovery_id: UUID returned by ``recover_backup_files`` Returns: {"id": "uuid", "backup_id": "uuid", "status": "running"|"completed"|"failed", "paths": [...], "error": "", ...}

NameTypeReqDescription
backup_idstringyes
recovery_idstringyes
slugstringyes

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

NameTypeReqDescription
linesinteger
log_typestring
searchstring
slugstringyes

No output schema declared.

No examples provided.

get_mailbox ~33

Inspect usage, services, aliases count, forwarding/Sieve, autoresponder and label.

NameTypeReqDescription
emailstringyes

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

NameTypeReqDescription
daysinteger
slugstringyes

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}

NameTypeReqDescription
slugstringyes

No output schema declared.

No examples provided.

get_site_nginx_snippet ~151

Read the custom nginx config for a domain on the BorealHost host proxy. Your site sits behind a BorealHost reverse proxy that terminates TLS and forwards to your container. This returns the custom nginx block applied to that proxy for this domain (empty if you have not set one). Requires: API key with read scope. Args: domain_name: Full domain name (e.g. "example.com") Returns: {"domain": "example.com", "content": "location ...", "exists": true} Errors: NOT_FOUND: Domain not found VALIDATION_ERROR: Domain is not linked to a site

NameTypeReqDescription
domain_namestringyes

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

NameTypeReqDescription
slugstringyes

No output schema declared.

No examples provided.

get_smtp_relay ~64

List SMTP relay credentials for a site, with domain-auth status. Requires: API key with read scope. Returns: {"relays": [{"relay_id", "domain", "status", "domain_authenticated"}, ...]}

NameTypeReqDescription
slugstringyes

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}

NameTypeReqDescription
slugstringyes

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 admin@184.107.x.x"} Errors: NOT_FOUND: Unknown slug FORBIDDEN: Plan does not support SSH (shared plans)

NameTypeReqDescription
slugstringyes

No output schema declared.

No examples provided.

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.

get_support_ticket ~66

Get a support ticket with its full message thread. Requires: API key with read scope. Args: ticket_id: Ticket UUID from list_support_tickets Returns: {"id", "subject", "status", "messages": [...]}

NameTypeReqDescription
ticket_idstringyes

No output schema declared.

No examples provided.

get_wallet ~275

The account's prepaid balance, and what THIS key may spend from it. Two ceilings, and both apply: the balance bounds the ACCOUNT, the allowance bounds this KEY within it. Plan against `spendable_cents`, which is the lower of the two — a $50 balance behind a $5 allowance means $5, and planning against the balance is planning a purchase that gets refused. `can_spend: false` with a non-zero balance is normal and means this key has no budget allocated. That is not a bug: a key with no allowance may not spend the account's money, which is the whole reason allowances exist. Ask the human to allocate one in the panel (Compte → Clés API). Read-only. Money goes in through a human — an agent able to top up its own budget does not have one. Requires: API key with read scope. Returns: {"currency": "CAD", "balance_cents": 5000, "spendable_cents": 500, "can_spend": true, "key_allowance": {"limit_cents": 2000, "spent_cents": 1500, "remaining_cents": 500}} To spend it: complete_checkout(..., payment_method="wallet").

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

get_webmail_url ~53

One-time webmail single-sign-on URL for a mailbox. Requires: API key with write scope. Returns: {"email", "url"}

NameTypeReqDescription
emailstringyes
slugstringyes

No output schema declared.

No examples provided.

install_app ~288

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, wordpress 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 ~218

Link a domain to a hosted site. Attaches the domain to the specified site and triggers automatic DNS configuration and SSL provisioning. WARNING: Regenerates this site's nginx vhost on the host from scratch. Any config applied to that vhost by hand is lost, silently — the site keeps serving and only the hand-added behaviour disappears. Config set via the nginx-snippet endpoint is NOT affected: it lives in a separate file the regenerated vhost re-includes, which is what that endpoint is for. 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_checkouts ~132

List checkouts belonging to the authenticated account. Requires: API key. Only checkouts with a recorded owner appear — every checkout created while authenticated, plus every checkout that reached payment. An anonymous checkout whose one-shot secret was lost cannot be listed; create checkouts authenticated to keep them addressable. Args: status: Optional filter — "not_ready", "ready", "awaiting_payment", "completed", "canceled", "failed". Returns: {"checkouts": [{...same shape as get_checkout_status...}], "note": "..."}

NameTypeReqDescription
statusstring

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.

Common questions

What is the BorealHost MCP server?

BorealHost is an MCP server listed in the public MCP registry as ai.borealhost/mcp. Agent-native web hosting, deploy sites, manage DNS, register domains, scale infrastructure. This page covers its hosted endpoint (https://borealhost.ai/mcp/).

Is the BorealHost MCP server safe to use?

BorealHost scores 75 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the BorealHost MCP server expose?

BorealHost exposes 184 tools: set_api_key, whoami, request_api_key, claim_api_key, list_plans, and 179 more. Their descriptions and schemas cost roughly 25,764 tokens of context every time the server is loaded.

Does the BorealHost MCP server require authentication?

No. We connected to BorealHost without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

Is the BorealHost MCP server still maintained?

BorealHost is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.