Every change Wellknown observed on this MCP server, newest first, with what it was before and what it became. Tool-surface changes carry the definition diff. Nothing here is edited after the fact.
Changed the definition of "create_mailbox_token" and "get_email_webmail_url"
Issue a temporary mail-services token with no OMA access. Requires email:signon.ReturnsUseprovider60,duration;120,fractional-hour...expiry1440requiresminutes.liveOpenSRSverification.rejects fractional hours; no rounding up.
Issuesingle-useawebmailone-useSSO,BorealHostrequestinglink60-secondexpiringredemption.in 60 seconds. Redemption mints provider SSO. Requires email:signon.
Added "add_mailbox_alias", "add_port_forward", "browse_backup" and 30 more; removed "register"; changed the definition of "add_domain_dns", "create_api_key", "decommission" and 9 more (152 tools before, 184 now)
⟨43 unchanged words⟩ , "mail"). Empty for apex domain.ttl: Time to live in seconds (default: 3600)priority: MX priority (required for MX records) The DNS provider manages the effective TTL and does not expose a per-record value through this service. Returns: {"success": true, "record" ⟨5 unchanged words⟩ ": "www", "value": "1.2.3.4", "ttl": 3600}} Errors: VALIDATION_ERROR: Missing value, invalid ⟨6 unchanged words⟩
⟨23 unchanged words⟩ ":"Subdomain","type":"string"},"ttl":{"default":3600,"title":"Ttl","type":"integer"},"value":{"title":"Value","type":
Certificate recorded, valid to 2026-12-02
Authorization not required
First tool surface recorded: 152 tools (server version 1.27.0)
Showing the latest 5 events. The API returns up to 500 and filters by kind: ?kind=tool_surface_changed
⟨18 unchanged words⟩ Site-scoped keys restrict access to a single site. email_domains restricts the key to email tools on the named domains; use email:read, email:write and optionally email:signon scopes. expires_at is an ISO timestamp; ip_allowlist accepts IP addresses and CIDR networks. Requires: API key with write scope. Args: ⟨81 unchanged words⟩
{"properties":{"email_domains":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"title":"Email Domains"},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Expires At"},"ip_allowlist":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"title":"Ip Allowlist"},"name":{"title":"Name","type": ⟨21 unchanged words⟩
⟨12 unchanged words⟩ This is destructive. The site will be inaccessibleimmediatelyimmediately.butAfter the grace period, its active service data isretaineddeleted. A final backup remains recoverable for730daysdays;beforeimmutablepermanentcopiesdeletion.may remain until their retention locks expire. Best practice: create a snapshot before decommissioning. ⟨24 unchanged words⟩
⟨24 unchanged words⟩ domain name (e.g. "example.com") auto_renew:Enable/disableOptional bool enabling/disabling automatic renewal whois_privacy:Enable/disableOptionalWHOISbool.privacyFalseprotectiondisables saved proxy service. Paid activation via True is refused; request an activation quote through Support. locked:Enable/disableOptional bool enabling/disabling registrar lock (prevents unauthorized transfers) Returns: ⟨20 unchanged words⟩
ExecuteRunaONESQLboundedqueryreadonagainst a site's database.SupportsOneSELECTstatement,INSERTbeginning with SELECT,UPDATESHOW,DELETEDESCRIBE or EXPLAIN, with no second statement andDDLnostatements.data-modifying clause anywhere in it. The containerResultsprovesarethelimitedstatementtois1000a 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 forSELECTthe job:queries.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 writescope.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:SQLOnequeryreadstringstatement Returns: {"columns": ["id", "titleuser_email"], "rows": [[1, "Helloa@example.com"], ...], "affected_rowsrow_count":01, "query_time_mstruncated":12false, "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.
⟨37 unchanged words⟩ laravel, nextjs, nodejs, nuxtjs, rails, static, wordpress app_name: Short name for the app (2-50 ⟨66 unchanged words⟩
⟨50 unchanged words⟩ ": "www", "value": "1.2.3.4", "ttl": 3600}] 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
⟨57 unchanged words⟩ ", TXT: "v=spf1 include:_spf.google.com ~all"ttl:TheTimeDNStoproviderlivemanagesinthesecondseffective(default:TTL3600)and does not expose a per-record value through this service. Returns: {"success": true, "record" ⟨3 unchanged words⟩ ": "www", "value": "1.2.3.4", "ttl": 3600}} Errors: VALIDATION_ERROR: Missing value for create ⟨6 unchanged words⟩
⟨20 unchanged words⟩ ":"Subdomain","type":"string"},"ttl":{"default":3600,"title":"Ttl","type":"integer"},"value":{"default":"","title":" ⟨11 unchanged words⟩
Register a new domain with WHOIS contact info and Stripe billing.TheFirstdomainrequestcostaisquotecharged(quote_only=True),topresent registration_cad, privacy_cad, total_cad, term and privacy choice, and obtain customer consent. Then repeat theuser'ssameactiveinputsubscription.with quote_only=False and the quote_token.FreeNeverdomainautomaticallyifacceptplanaincludesreplacementfree_domain_annualtoken+after a price change. Included annualbillingregistration+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, thendomain.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", ⟨158 unchanged words⟩ Required for .ca domains. CIRA legal types: "CCOCCT" (Canadian citizen), "RES" (permanent resident), "CCTCCO" (corporation), "GOV" (government), ⟨27 unchanged words⟩ ), "LGR" (legal representative) Returns: Quote request: {"domainquote": {"example.caregistration_cad": "...", "privacy_cad": "status...", "total_cad": "registered...","currency": "CAD", "period": 1, "whois_privacy": false, "expires_at": "iso8601"}, "quote_token": "message...", "privacy_explanation": "Domain..."} Purchase:registered{"name":successfully"example.ca", "status": "registered", "last_pricing_quote": {...}, ...} Errors: VALIDATION_ERROR: Missing required fields, invalid ⟨16 unchanged words⟩
⟨94 unchanged words⟩ "Postal Code","type":"string"},"quote_only":{"default":true,"title":"Quote Only","type":"boolean"},"quote_token":{"default":"","title":"Quote Token","type":"string"},"state":{"title":"State","type": ⟨4 unchanged words⟩ "title":"Usage Mode","type":"string"},"whois_privacy":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"title":"Whois Privacy"}},"required":["domain","first_name" ⟨11 unchanged words⟩
Atomically rotateRotate an APIkey.key,Oldoptionally keeping the old keyisvalidimmediatelyforinvalidated.up to 1,440 minutes. Creates a new key with the same name ⟨42 unchanged words⟩ "message": "Key rotated. Store securely."}Note:ExpiryTheandoldallkeyrestrictionsstopsareworkingpreserved.immediately.WithoutUpdateaBOREALHOST_API_KEYgrace period the oldrightkeyaway.stops working immediately.
{"properties":{"grace_minutes":{"default":0,"title":"Grace Minutes","type":"integer"},"key_id":{"title":"Key Id","type ⟨7 unchanged words⟩
⟨22 unchanged words⟩ : "example.com", "available": true, "priceregistration_estimate_cad":{"amount":15.99", "currency": "CAD","periodprice_cad_includes_privacy":"1false,year"}total_cad": null, "premiumquote_required":falsetrue} Note: .ca domains require ca_legal_type when registering.
⟨11 unchanged words⟩ you already have an API key (froma previouscheckoutregistrationcompletion,checkoutthecompletionBorealHost panel, ortheaBorealHostcontainerpanelclaim). 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 ( ⟨16 unchanged words⟩
Add an alias on the same domain, preserving existing aliases.
Publish a container port on the node's public IP (TCP or UDP). This is how inbound UDP reaches a container. There is no other way: the container's own address is private, and the IP allow/deny rules of add_firewall_rule cannot route anything. PORT PRESERVATION MATTERS. Leave external_port at 0 and a port is allocated from 10000-19999 — your service becomes reachable, but on a DIFFERENT number. That is fine for HTTP or ssh and broken for every protocol that carries its own port inside the payload: STUN, TURN, RTP/WebRTC, SIP, WireGuard, QUIC. For those, pass external_port equal to internal_p…
List one bounded page of immediate children in a backup directory. This returns names and metadata only, never file contents. Use ``next_cursor`` from the response as ``cursor`` to request the next page. Requires: API key with read scope. Args: slug: Site identifier backup_id: UUID of a completed backup path: Absolute directory path as it existed in the backup cursor: Resume after this entry name (optional) limit: Maximum entries, from 1 through 100 Errors: SNAPSHOT_SCOPE_CHANGED: The path is allowed by today's schedule but was not included when this backup…
Clear forwarding; when Sieve exists, requires explicit clear_all_filters=true.
Configure OpenSRS DKIM and merge email DNS, preserving other senders and subdomains.
Create a domain-addressed billable mailbox. Password returned once; retries omit it.
Issue a temporary mail-services token with no OMA access. Requires email:signon. Returns provider duration; fractional-hour expiry requires live verification.
Soft-delete a mailbox. confirm must equal email. Provider recovery window: 30 days.
Disable an empty email domain; refuses active or recoverable accounts.
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.
Look up mailbox/alias/forward/free in an authorized email domain.
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``
Read effective OpenSRS limits, counts, connections and public DNS health.
Issue single-use webmail SSO, requesting 60-second redemption. Requires email:signon.
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": "", ...}
Inspect usage, services, aliases count, forwarding/Sieve, autoresponder and label.
List email API mutation/credential issuance attempts, actor, reason and outcome.
List email domains visible to this key, with cluster connection settings.
List a mailbox's aliases with pagination.
Page through a domain's mailboxes, optionally filtering by organisation label.
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_rang…
Terminate established IMAP and POP sessions through OpenSRS logout_user.
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``
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"], ...}
Remove one alias, preserving the mailbox and other aliases.
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": "..."}
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 i…
Reset password and terminate IMAP/POP sessions. Requires email:signon.
Restore a uniquely identifiable soft-deleted mailbox under its original address.
Rotate the current email-only key with overlap, preserving scope and expiry.
Replace the complete alias list idempotently (maximum 2,000).
Set mailbox_limit, alias_limit, quota_gb, smtp_sent_limit, services or language.
Set display_name, quota_gb, smtp_sent_limit, label, services or suspended. Suspension disables client access and outbound SMTP while preserving receipt.
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 ema…