BorealHost
REMOTE · BOREALHOST.AI · 2 COMPONENTS · SCANNED SEP 20
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 → Why this is hard to 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 184 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 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
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
claude mcp add --transport http ai-borealhost-mcp 'https://borealhost.ai/mcp/'
{
"mcpServers": {
"ai-borealhost-mcp": {
"url": "https://borealhost.ai/mcp/"
}
}
} {
"servers": {
"ai-borealhost-mcp": {
"type": "http",
"url": "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": {
"Transport": "http",
"Url": "https://borealhost.ai/mcp/"
}
}
} assistant mcp add ai-borealhost-mcp -t streamable-http -u '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.
- 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
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/ |
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 →
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"}, ...]}
| Name | Type | Req | Description |
|---|---|---|---|
| slug | string | yes | – |
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", ...]}
| Name | Type | Req | Description |
|---|---|---|---|
| slug | string | yes | – |
No output schema declared.
No examples provided.
list_db_users ~58
List database users for a site. Requires: API key with read scope. Returns: {"engine", "users": [{"user", "host", ...}, ...]}
| Name | Type | Req | Description |
|---|---|---|---|
| engine | string | – | – |
| slug | string | yes | – |
No output schema declared.
No examples provided.
list_domain_dns ~152
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"}] The DNS provider manages the effective TTL and does not expose a per-record value through this service. Errors: NOT_FOUND: Domain not found or not owned by account
| Name | Type | Req | Description |
|---|---|---|---|
| domain_name | string | yes | – |
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_email_audit ~60
List email API mutation/credential issuance attempts, actor, reason and outcome.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | – |
| domain | string | yes | – |
| string | – | – | |
| limit | integer | – | – |
| since | string | – | – |
No output schema declared.
No examples provided.
list_email_domains ~36
List email domains visible to this key, with cluster connection settings.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | – |
| limit | integer | – | – |
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
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | – | – |
| slug | string | yes | – |
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"}]}
| Name | Type | Req | Description |
|---|---|---|---|
| slug | string | yes | – |
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"}}
| Name | Type | Req | Description |
|---|---|---|---|
| slug | string | yes | – |
No output schema declared.
No examples provided.
list_mailbox_aliases ~40
List a mailbox's aliases with pagination.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | – |
| string | yes | – | |
| limit | integer | – | – |
No output schema declared.
No examples provided.
list_mailboxes ~49
Page through a domain's mailboxes, optionally filtering by organisation label.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | – |
| domain | string | yes | – |
| label | – | – | – |
| limit | integer | – | – |
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
| Name | Type | Req | Description |
|---|---|---|---|
| slug | string | yes | – |
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}]}
| Name | Type | Req | Description |
|---|---|---|---|
| slug | string | yes | – |
No output schema declared.
No examples provided.
list_plans ~227
List available hosting plans with pricing and resources. No authentication needed. Args: track: Filter by plan track. Valid values: "single_site", "agency". ⚠ The track is not the site count — most plans on BOTH tracks include several sites (site_starter 5, site_plus 8, site_pro 12). Read `max_sites` on the plan, and use add_site() to fill a slot. 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}}, ...]
| Name | Type | Req | Description |
|---|---|---|---|
| include_deprecated | boolean | – | – |
| track | string | – | – |
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}, ...]}
| Name | Type | Req | Description |
|---|---|---|---|
| slug | string | yes | – |
No output schema declared.
No examples provided.
list_port_forwards ~198
List ports published from this site's container to the public internet. These are iptables DNAT rules on the node, NOT the IP allow/deny rules that add_firewall_rule manages — those two tools do unrelated things and neither substitutes for the other. Requires: API key with read scope. Args: slug: Site identifier Returns: {"port_forwards": [{"id": "...", "external_port": 3478, "internal_port": 3478, "protocol": "udp", "status": "active", "public_address": "203.0.113.5:3478", "port_preserved": true}], "limit": 15, "port_budget": 7680, "ports_used": 1, "max_range_ports": 1024, "public_ip": "203.0.113.5"}
| Name | Type | Req | Description |
|---|---|---|---|
| slug | string | yes | – |
No output schema declared.
No examples provided.
list_redirects ~51
List HTTP redirect rules for a site. Requires: API key with read scope. Returns: [{"id", "source_path", "target_url", "redirect_type"}, ...]
| Name | Type | Req | Description |
|---|---|---|---|
| slug | string | yes | – |
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": [...]}
| Name | Type | Req | Description |
|---|---|---|---|
| slug | string | yes | – |
No output schema declared.
No examples provided.
list_subdomains ~109
List subdomain DNS records for a domain you own. Requires: API key with read scope. Args: domain_name: Registrable domain (e.g. "example.com") Returns: [{"fqdn": "blog.example.com", "subdomain": "blog", "record_type": "A", "value": "1.2.3.4", "is_auto": true}, ...] Errors: NOT_FOUND: Domain not found
| Name | Type | Req | Description |
|---|---|---|---|
| domain_name | string | yes | – |
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_support_tickets ~71
List the account's support tickets. Requires: API key with read scope. Args: status: Optional filter (e.g. "open", "closed") Returns: [{"id", "subject", "status", "category", "created_at", ...}, ...]
| Name | Type | Req | Description |
|---|---|---|---|
| status | string | – | – |
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}, ...]}
| Name | Type | Req | Description |
|---|---|---|---|
| database | string | yes | – |
| slug | string | yes | – |
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}, ...]}
| Name | Type | Req | Description |
|---|---|---|---|
| slug | string | yes | – |
No output schema declared.
No examples provided.
list_webhooks ~51
List webhook endpoints registered on the account. Requires: API key with read scope. Returns: [{"id", "url", "events", "is_active", "last_status", "failure_count"}, ...]
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
logout_mailbox_sessions ~46
Terminate established IMAP and POP sessions through OpenSRS logout_user.
| Name | Type | Req | Description |
|---|---|---|---|
| actor | string | – | – |
| string | yes | – | |
| reason | string | – | – |
No output schema declared.
No examples provided.
manage_db_user ~157
Manage a database user on a site. Actions: "create" (user+password), "drop" (user), "set_password" (user+password), "grants" (list a user's grants), "grant" / "revoke" (user+database, optional privileges e.g. "ALL" or "SELECT,INSERT"). Requires: API key with write scope. Returns: {"engine", "action", "result": {...}}
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | – |
| database | string | – | – |
| engine | string | – | – |
| host | string | – | – |
| password | string | – | – |
| privileges | string | – | – |
| slug | string | yes | – |
| user | string | – | – |
No output schema declared.
No examples provided.
manage_dns ~270
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" The DNS provider manages the effective TTL and does not expose a per-record value through this service. Returns: {"success": true, "record": {"type": "A", "subdomain": "www", "value": "1.2.3.4"}} Errors: VALIDATION_ERROR: Missing value for create, invalid record type NOT_FOUND: Unknown slug
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | – |
| record_type | string | yes | – |
| slug | string | yes | – |
| subdomain | string | – | – |
| value | string | – | – |
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": {...}}
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | – |
| plugin | string | yes | – |
| slug | string | yes | – |
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": {...}}
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | – |
| slug | string | yes | – |
| theme | string | yes | – |
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}
| Name | Type | Req | Description |
|---|---|---|---|
| slug | string | yes | – |
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
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | – |
| slug | string | yes | – |
No output schema declared.
No examples provided.
reboot_compute_instance ~32
Reboot a running compute instance. Requires: API key with write scope.
| Name | Type | Req | Description |
|---|---|---|---|
| instance_id | string | yes | – |
No output schema declared.
No examples provided.
recover_backup_database ~109
Recover exactly one absent database from a completed backup. The operation refuses an existing database and can never select ``all``. It returns immediately; poll ``get_database_recovery`` with its durable ID. Requires: API key with write scope. Args: slug: Site identifier backup_id: UUID of a completed backup database: One database name, never ``all``
| Name | Type | Req | Description |
|---|---|---|---|
| backup_id | string | yes | – |
| database | string | yes | – |
| slug | string | yes | – |
No output schema declared.
No examples provided.
recover_backup_files ~140
Start a selected-file recovery and return its durable ID immediately. Existing destination paths are never replaced. The operation is asynchronous; poll ``get_file_recovery`` with the returned ID. Requires: API key with write scope. Args: slug: Site identifier backup_id: UUID of a completed backup paths: One or more absolute paths from that backup Returns: {"id": "uuid", "backup_id": "uuid", "status": "running", "paths": ["/absolute/path"], ...}
| Name | Type | Req | Description |
|---|---|---|---|
| backup_id | string | yes | – |
| paths | array | yes | – |
| slug | string | yes | – |
No output schema declared.
No examples provided.
register_domain ~1,008
Register a new domain with WHOIS contact info and Stripe billing. First request a quote (quote_only=True), present registration_cad, privacy_cad, total_cad, term and privacy choice, and obtain customer consent. Then repeat the same input with quote_only=False and the quote_token. Never automatically accept a replacement token after a price change. Included annual registration covers registration only; selected privacy uses the same BoC daily USD/CAD rate, rounded to CAD cents, no markup. Registration/renewal convert their actual operation-specific USD cost first, then apply 10% and round up to CAD .95. Rates older than four days refuse. Requires: API key with write scope. Args: whois_privacy: Explicit privacy choice; defaults selected only for supported paid TLDs. quote_only: True returns a quote without registration or payment. quote_token: Signed five-minute quote accepted by the customer. 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…
| Name | Type | Req | Description |
|---|---|---|---|
| address1 | string | yes | – |
| ca_legal_type | string | – | – |
| city | string | yes | – |
| country | string | – | – |
| domain | string | yes | – |
| string | yes | – | |
| first_name | string | yes | – |
| forward_include_path | boolean | – | – |
| forward_type | string | – | – |
| forward_url | string | – | – |
| last_name | string | yes | – |
| nameservers | array | – | – |
| period | integer | – | – |
| phone | string | yes | – |
| postal_code | string | yes | – |
| quote_only | boolean | – | – |
| quote_token | string | – | – |
| state | string | yes | – |
| usage_mode | string | – | – |
| whois_privacy | – | – | – |
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"}
| Name | Type | Req | Description |
|---|---|---|---|
| ip | string | yes | – |
| slug | string | yes | – |
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"}
| Name | Type | Req | Description |
|---|---|---|---|
| slug | string | yes | – |
| username | string | yes | – |
No output schema declared.
No examples provided.
remove_mailbox_alias ~49
Remove one alias, preserving the mailbox and other aliases.
| Name | Type | Req | Description |
|---|---|---|---|
| actor | string | – | – |
| alias | string | yes | – |
| string | yes | – | |
| reason | string | – | – |
No output schema declared.
No examples provided.
remove_port_forward ~85
Stop publishing a port, by the rule id from list_port_forwards. Requires: API key with write scope. Args: slug: Site identifier forward_id: Rule id (uuid) from list_port_forwards Returns: {"removed": true, "forward_id": "..."}
| Name | Type | Req | Description |
|---|---|---|---|
| forward_id | string | yes | – |
| slug | string | yes | – |
No output schema declared.
No examples provided.
reply_support_ticket ~67
Add a message to an existing support ticket. Requires: API key with write scope. Args: ticket_id: Ticket UUID message: Reply text Returns: {"id", "status", ...}
| Name | Type | Req | Description |
|---|---|---|---|
| message | string | yes | – |
| ticket_id | string | yes | – |
No output schema declared.
No examples provided.
request_api_key ~452
Request an API key for a site YOU ARE RUNNING ON (challenge-response). ⚠ ONLY USE THIS IF YOU ARE EXECUTING INSIDE THAT SITE'S OWN CONTAINER. If you bought or ordered the site from somewhere else, this is the wrong tool: it returns "pending" and the pending never resolves, because the proof it asks for is a file you cannot reach. Use `get_checkout_status(checkout_id)` on the checkout that paid for the site — that hands over the site-scoped key over plain HTTP with no container access. The refusal and the pending response both name it under `alternative` when one is available. Two-step verification flow: 1. A claim token is written into that site's container, at the per-site path the response gives you in `claim_path` (mode 600, owner admin — readable only from on the container). Do not hardcode the path. 2. Read that file and call claim_api_key(token) within 1 hour Refused for sites on SHARED containers. One container there serves up to 40 customers behind one agent, so reading a file proves you are on the machine, not which customer you are — the token would authenticate the wrong thing. 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": "/home/admin/.borealhost/.claim_token_my-site", "requires_container_access": true, "instructions": "Read the claim token and call claim_api_key()...", "alternative": {"checkout_id": "...", "command": "bh checkout status ..."}} Errors: VALIDATION_ERROR: Unknown site slug, no active subscription, shared container, or a key already exists (rotate it, never revoke it to reach this route). Carries `alternative` when another route works. RATE_LIMITED: Too many pending claim tokens
| Name | Type | Req | Description |
|---|---|---|---|
| site_slug | string | yes | – |
No output schema declared.
No examples provided.
resend_registrant_verification ~163
Request OpenSRS verification email to its existing owner contact. Requires a write-scope API key and an owned registered/transferred domain. Call only when the customer requests a resend. No recipient override. Returns domain, send_acknowledged, inbox_delivery_confirmed (always false), registrant_verified, and the refreshed registrant_verification snapshot. A send acknowledgement confirms neither inbox delivery nor verification; status can remain unknown if the subsequent status refresh fails. PROVIDER_REFUSED (502) means no email should be assumed sent. CONFLICT (409) means another resend is in progress; RATE_LIMITED (429) has Retry-After 3600. Never automatically retry a refused, busy or throttled resend.
| Name | Type | Req | Description |
|---|---|---|---|
| domain_name | string | yes | – |
No output schema declared.
No examples provided.
reset_email_mailbox_password ~56
Reset password and terminate IMAP/POP sessions. Requires email:signon.
| Name | Type | Req | Description |
|---|---|---|---|
| actor | string | – | – |
| string | yes | – | |
| new_password | string | – | – |
| reason | string | – | – |
No output schema declared.
No examples provided.
reset_mailbox_password ~65
Reset a mailbox password (generated when omitted, returned ONCE). Requires: API key with write scope. Returns: {"email", "password", "message"}
| Name | Type | Req | Description |
|---|---|---|---|
| string | yes | – | |
| new_password | string | – | – |
| slug | string | yes | – |
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
| Name | Type | Req | Description |
|---|---|---|---|
| backup_id | string | yes | – |
| slug | string | yes | – |
No output schema declared.
No examples provided.
restore_mailbox ~43
Restore a uniquely identifiable soft-deleted mailbox under its original address.
| Name | Type | Req | Description |
|---|---|---|---|
| actor | string | – | – |
| string | yes | – | |
| reason | string | – | – |
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
| Name | Type | Req | Description |
|---|---|---|---|
| key_id | string | yes | – |
No output schema declared.
No examples provided.
revoke_smtp_relay ~60
Revoke an SMTP relay credential (immediate at the relay). Requires: API key with write scope. Returns: {"relay_id", "revoked": true}
| Name | Type | Req | Description |
|---|---|---|---|
| relay_id | string | yes | – |
| slug | string | yes | – |
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
| Name | Type | Req | Description |
|---|---|---|---|
| slug | string | yes | – |
| snapshot_id | string | yes | – |
No output schema declared.
No examples provided.
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.