hostkey-mcp-server
OfficialServer Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| HOSTKEY_API_KEY | Yes | Your Hostkey API key. Get one from InvAPI (https://invapi.hostkey.com) → API keys → create a key. | |
| HOSTKEY_TOKEN_TTL | No | Optional: token TTL setting (see .env.example). | |
| HOSTKEY_HTTP_TIMEOUT | No | Optional: HTTP timeout setting (see .env.example). | |
| HOSTKEY_ALLOW_DESTRUCTIVE | No | Optional: set to '1' to allow OS reinstall, PXE, and service cancellation. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| prompts | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_serversA | List Hostkey account servers with filters. Before the first call, automatically refreshes inventory (eq/update_servers). Returns server IDs and brief data; use get_server for the full card. |
| get_serverA | Full server details by ID (eq/show): configuration, network, status, location. |
| get_power_statusB | Current server power status (on/off). |
| get_server_sensorsA | Hardware sensor readings (temperatures, voltages, fans). Bare-metal only. |
| get_server_tagsB | All server tags (tags/list). Tags store arbitrary key-value pairs. |
| search_servers_by_tagA | Search servers by tag name or value (tags/search_user). Returns server IDs. |
| list_presetsA | Current list of available instant servers (VM/BM/GPU/vGPU) with prices for a location. No token required. Use to pick a preset before ordering. |
| search_presetsB | Search free servers matching a preset name (e.g. vm.pico). Requires auth. |
| get_preset_pricingB | Prices for available presets in given currencies (presets/info). No token required. |
| list_preset_groupsB | Preset groups for catalog categories (presets/groups). No token required. |
| get_presetB | Details for one preset or all presets (presets/show). May require auth depending on permissions. |
| list_stock_serversA | Available stock servers (physical servers of standard configs; deploy within a business day). No token required. |
| get_stock_serverC | Details for a specific stock server (stocks/show). |
| list_osA | Operating systems available for a preset/server (os/list). Without instance_id returns OS for all presets. No token required. |
| list_softwareB | Software (marketplace apps) available for auto-install (software/list). No token required. |
| list_traffic_plansA | Available traffic plans for a preset in a location (traffic_plans/list). No token required. |
| get_account_infoA | Current API token and account info (auth/info): available calls, account type and role, linked server IDs. Useful to verify the connection. |
| logoutA | End the current API session (auth/logout): session token is removed from InvAPI. On the next call the client will sign in again with the API key. |
| list_api_keysB | List all account API keys (api_keys/list). |
| list_server_api_keysA | List API keys issued for a specific server (api_keys/list_for_server). |
| get_api_keyB | Details for a specific API key (api_keys/view). |
| get_api_key_historyB | API key usage history for a period (api_keys/history). |
| create_api_keyA | Create a new API key for the account or a specific server (api_keys/add). The key value is shown once in the response — save it. |
| update_api_keyB | Update API key settings (api_keys/edit): name, IP allowlist, notifications, active flag. |
| delete_api_keyA | Delete an API key (api_keys/delete). DESTRUCTIVE: apps using the key will lose access. |
| get_network_statusA | Server network interface status (net/get_status): port, switch, VLAN, speed, MAC, link status. Optional port limits the query to one interface (useful when another NIC has no upstream_id). |
| get_port_graphsB | Port utilization graphs for a period (net/show_cacti): day/month/year. |
| get_ip_infoC | Network interface information by IP address (ip/get_ip). |
| get_ptr_recordB | Current PTR record (reverse DNS) for an IP address (ip/get_ptr). |
| port_onC | Enable a server network port (net/port_on). |
| port_offA | Disable a server network port (net/port_off). DESTRUCTIVE: the server will lose network connectivity on this interface. |
| block_ipB | Block an IP address on the server at the Hostkey network level (net/block_ip). Useful for abuse requests. |
| unblock_ipC | Unblock an IP address on the server (net/unblock_ip). |
| update_ptr_recordB | Update the PTR record for an IP address (ip/update_ptr). Multiple records are passed separated by %0A. |
| set_main_ipB | Set the primary IP address of the server (ip/set_main) when there are multiple addresses. |
| list_dns_zonesA | List all DNS zones on the account on Hostkey PowerDNS servers (pdns/list_zones). |
| get_dns_zoneA | DNS zone contents: all records (A, AAAA, CNAME, MX, TXT, etc.) from the authoritative server (pdns/view_zone). |
| list_dns_domainsB | List all user domains from the domains table (pdns/list_domains). |
| list_dns_subdomainsC | List subdomains by server ID (pdns/list_subdomains). |
| add_dns_domainB | Create a DNS zone and add a domain to the domains table (pdns/add_domain). Requires pdns/edit permission. |
| delete_dns_domainA | Delete a domain by ID: DNS zone, the domain itself, and all its subdomains (pdns/delete_domain). DESTRUCTIVE. Requires pdns/edit permission. |
| add_dns_subdomainA | Add a subdomain to the subdomains table (pdns/add_subdomain). Requires pdns/edit permission. |
| edit_dns_subdomainB | Update a subdomain (pdns/edit_subdomain). Requires pdns/edit permission. |
| delete_dns_subdomainA | Delete a subdomain from the subdomains table (pdns/delete_subdomain). DESTRUCTIVE. Requires pdns/edit permission. |
| add_dns_zoneB | Create a DNS zone on the authoritative PowerDNS server (pdns/add_zone). Requires pdns/edit permission. |
| delete_dns_zoneA | Delete a DNS zone by name along with all records and metadata (pdns/delete_zone). DESTRUCTIVE. Requires pdns/edit permission. |
| add_dns_recordA | Add or update a DNS record in a zone (pdns/add_dns). Requires pdns/edit permission. For SRV records, fill in proto/priority/weight/port/target. Fields mname/rname are marked required for SOA checks in the docs — fill them in on error. |
| delete_dns_recordA | Delete a DNS record from a zone (pdns/delete_dns). DESTRUCTIVE. Requires pdns/edit permission. |
| get_snapshotsC | List virtual machine snapshots (vm/get_snapshot): name, snapshot_id, date. |
| get_vm_engineC | Virtualization engine information (vm/get_engine). |
| get_vm_statsC | Virtual machine statistics (vm/load_stats). |
| create_snapshotA | Create a virtual machine snapshot (vm/create_snapshot). Async operation. Track with check_task. |
| remove_snapshotA | Delete a snapshot (vm/remove_snapshot). DESTRUCTIVE: the snapshot is permanently deleted. Deletion is only possible on a powered-off VM. |
| restore_snapshotA | Restore a VM from a snapshot (vm/restore_snapshot). DESTRUCTIVE: the current VM disk state will be overwritten with the snapshot state. |
| get_vnc_consoleA | Access the server VNC console (eq/console): returns console.vv config in Base64 for virt-viewer. |
| start_novncB | Start a NoVNC (HTML5) server console session (eq/novnc): returns a link to open in the browser. |
| list_post_install_tasksA | Available post-install Ansible tasks (jenkins/get_tasks) with applicability tags: gpu, bm, vm, vgpu, default. Without a token — general list; with a token — tasks available to the specific user. |
| run_post_install_taskB | Run a Jenkins/Ansible task on a server (jenkins/call): task ID or name from list_post_install_tasks + extra params. E.g. installing GPU drivers after OS reinstall. |
| add_static_natA | Create a static DNAT to the server IPMI (nat/add_static_nat): public IP for classic IPMI access. Distinct from Secure IPMI Proxy in the panel — Proxy Active alone may not satisfy this call. Async; track with check_task. On server_ipmi_acl_required pass ip_acl. |
| remove_static_natC | Remove static DNAT to the server IPMI (nat/remove_static_nat). |
| clear_static_natB | Remove stale static NAT forwarding rules by internal IP (nat/clear_static_nat). |
| drop_natB | Delete a NAT record from the database (nat/drop_nat). DESTRUCTIVE, internal/ops action. |
| add_ipmi_userB | Create a temporary IPMI user for web access to IPMI (eq/add_ipmi_user). |
| remove_ipmi_userB | Remove a temporary IPMI user (eq/remove_ipmi_user). |
| reset_ipmiA | Reboot the server IPMI module (eq/unit_reset). Use when IPMI is unresponsive. |
| request_rh_power_onA | Remote Hands request: power on the server manually (jira/request_pon). Creates a Remote Hands ticket for the datacenter on-call shift; status and correspondence are in the ticket (link will be emailed). |
| request_rh_power_offA | Remote Hands request: power off the server manually (jira/request_poff). DESTRUCTIVE for running services. Creates a Remote Hands ticket for the datacenter on-call shift; status and correspondence are in the ticket (link will be emailed). |
| request_rh_rebootA | Remote Hands request: reboot the server manually (jira/request_reboot). Creates a Remote Hands ticket for the datacenter on-call shift; status and correspondence are in the ticket (link will be emailed). |
| request_rh_pxe_bootA | Remote Hands request: boot the server via PXE (jira/request_PXEboot). Needed when reinstalling OS on servers without a remote management module. Creates a Remote Hands ticket for the datacenter on-call shift; status and correspondence are in the ticket (link will be emailed). |
| request_rh_kvmA | Remote Hands request: attach IP KVM to the server (jira/request_kvm). Creates a Remote Hands ticket for the datacenter on-call shift; status and correspondence are in the ticket (link will be emailed). |
| request_rh_checkA | Remote Hands request: check the server and boot it into the OS (jira/request_check). Creates a Remote Hands ticket for the datacenter on-call shift; status and correspondence are in the ticket (link will be emailed). |
| request_sales_assistanceB | Ticket to the sales department (jira/request_assistance): cancellation or transfer of a service and similar requests. Describe details in message. |
| create_reinstall_taskA | PXE reinstall step 1: create an OS reinstall master key (eq/reinstall). Returns reinstall_key used by check_task to track install stages. DESTRUCTIVE: part of the process that wipes server disks. |
| create_pxe_configA | PXE reinstall step 2: create a PXE config for OS install (eq/create_pxe). DESTRUCTIVE. |
| set_boot_deviceA | Set server boot order (eq/boot_dev): pxe — network boot (reinstall step 3), disk — boot from disk (step 6), cd — mounted ISO. |
| clear_pxe_configA | PXE reinstall step 7: remove the PXE config (eq/clear_pxe). REQUIRED after completion — otherwise an unexpected reinstall may occur on the next reboot. |
| list_iso_imagesA | List available ISO images (iso/list_iso). InvAPI requires a server id (for client keys); images are matched to the server configuration. |
| get_uploaded_isosA | List ISO images uploaded by the client (iso/uploaded). |
| upload_isoB | Upload a new ISO image by URL (iso/upload). Available to clients. |
| add_iso_imageA | Add a new ISO image or update an existing one by name (iso/add). Requires special 'add' permission. |
| mount_isoA | Mount an ISO image on a server (iso/mount_iso). Async operation. Callback key returned — track with check_task. InvAPI expects |
| unmount_isoA | Unmount an ISO image from a server (iso/unmount_iso). Async operation. Callback key returned — track with check_task. |
| delete_iso_imageA | Delete an ISO image by ID (iso/delete). DESTRUCTIVE. Per docs, available only to Hostkey staff — clients will likely get a permission error. |
| s3_list_plansB | List available S3 storage plans (s3/list_plans). |
| s3_get_locationsB | List available locations for S3 (s3/get_available_locations). |
| s3_get_bucketsA | List S3 account buckets and usage (s3/get_buckets_rmq). Pass s3uid or account_id from s3_get_users. May return a task key — then track with check_task. |
| s3_get_buckets_via_queueA | Same as s3_get_buckets: list buckets via s3/get_buckets_rmq. Prefer s3_get_buckets. |
| s3_get_filesA | List files in a bucket with pagination and search (s3/get_files). |
| s3_get_usersA | List S3 users with service, traffic, and storage usage info (s3/get_users). Full filtering is available to administrators. Use returned s3uid/id with s3_get_buckets. |
| s3_show_keyA | Get a decrypted S3 access key (s3/show_key). SECRET: do not log or share with third parties. |
| s3_create_accountB | Create an S3 account: bind a plan and initial bucket (s3/create_account). Requires authentication. |
| s3_create_bucketB | Create a new bucket in an existing S3 account (s3/create_bucket). |
| s3_create_orderA | Create a paid S3 storage order linked to billing (s3/create_order). MONEY: creates a real order/invoice. |
| s3_delete_fileA | Delete a file from a bucket (s3/delete_file). DESTRUCTIVE: the file is permanently deleted. |
| s3_delete_bucketA | Delete a bucket from an S3 account (s3/delete_bucket). DESTRUCTIVE: all files in the bucket will be deleted. |
| s3_delete_accountA | Fully delete a user's S3 account (s3/delete_account). DESTRUCTIVE: all buckets and data will be deleted. Requires HOSTKEY_ALLOW_DESTRUCTIVE=1. |
| s3_delete_payment_accountA | Initiate S3 account deletion via service cancellation in billing (s3/delete_payment_account). DESTRUCTIVE: an end date will be set on the active service. Requires HOSTKEY_ALLOW_DESTRUCTIVE=1. |
| s3_cancel_account_deletionA | Cancel S3 service deletion initiated via billing and restore the account to active status (s3/cancel_payment_account_deletion). |
| s3_update_traffic_infoB | Update S3 account traffic information (s3/update_traffic_info). Available to administrators only. |
| list_rhr_requestsA | List Remote Hands requests with filtering by location and status (rhr/list). |
| create_rhr_requestA | Create a Remote Hands request (rhr/add): on-site datacenter shift work that cannot be done remotely. Describe the work in as much detail as possible in comment. Use only if the remote server management module is unavailable/not working. |
| add_rhr_commentB | Add a client-visible message to the request history (rhr/chat). |
| discard_rhr_requestB | Cancel/close a Remote Hands request (rhr/discard). DESTRUCTIVE: the request will be cancelled. |
| get_billing_clientB | Client data from billing (whmcs/get_client): contacts, currency, account status. |
| get_invoicesB | Full list of account invoices (whmcs/get_invoices). |
| get_invoiceC | Data for a specific invoice for payment (whmcs/get_invoice). |
| get_server_invoicesC | Invoices related to a specific server (whmcs/get_related_invoices). |
| get_server_billing_dataC | Billing information for a server rental (whmcs/get_billing_data). |
| get_transactionsB | List of transactions for the client account (whmcs/transactions). |
| get_credit_historyC | Credit balance movement: credit additions and deductions (whmcs/getcredits). |
| get_payment_gatewayC | Payment methods for a specific invoice (whmcs/getpaymentgw). |
| download_invoiceA | Download an invoice as PDF (whmcs/download_invoice). InvAPI returns binary PDF; MCP returns JSON with encoding=base64 and data — decode to a .pdf file. |
| get_cancellation_requestsB | List of active service cancellation requests (whmcs/get_cancellation_requests). |
| get_contactsB | List of additional account contacts (whmcs/get_contacts). |
| update_billing_clientB | Update client data in billing (whmcs/update_client): name, company, address, email, phone, etc. |
| reset_billing_passwordA | Reset the billing account password (whmcs/reset_password): a reset link is sent to the given email. Email must match the account email. |
| add_contactA | Add an additional contact to the account (whmcs/add_contact). WARNING: the contact is created with a random email — change it in Invapi. |
| update_contactB | Update an additional contact (whmcs/update_contact): email, password, phone. Providing a phone enables SMS 2FA. |
| delete_contactC | Delete an additional account contact (whmcs/delete_contact). DESTRUCTIVE. |
| generate_due_invoiceC | Create the next invoice for a server (whmcs/generate_due_invoice). |
| create_addfunds_invoiceB | Create an invoice to top up the credit balance (whmcs/create_addfunds). MONEY: creates a real invoice for the given amount. |
| apply_creditA | Pay an invoice in full or in part from the credit balance (whmcs/apply_credit). MONEY: deducts funds from the account. |
| mass_payC | Create a group invoice to pay multiple invoices at once (whmcs/mass_pay). MONEY. |
| request_cancellationA | Request service cancellation (whmcs/request_cancellation). DESTRUCTIVE: cancellation_type=1 — immediate cancel with partial refund (if possible), 0 — cancel at end of billing period. Requires HOSTKEY_ALLOW_DESTRUCTIVE=1. |
| delete_cancellation_requestC | Withdraw a service cancellation request (whmcs/delete_cancellation_request). |
| check_taskA | Check async job status by callback key (eq_callback/check). Many InvAPI operations (power on/off, order, reinstall, snapshots) return {"result":"OK","callback":""}. Pass that key here: result="Not ready" — still running; result="OK" — finished (key then expires). Server deploy can take 10–30 minutes. If the client sent progressToken, emits notifications/progress. |
| power_onA | Power on a server (eq/on). Async: response includes a callback key for check_task. |
| power_offA | Power off a server (eq/off). DESTRUCTIVE: interrupts all services on the server. Requires confirm=true. Async: response includes a callback key for check_task. |
| reboot_serverA | Reboot a server (eq/reboot). Interrupts services during reboot. Requires confirm=true. Async: response includes a callback key for check_task. |
| order_serverA | Order an instant or stock server (eq/order_instance). IMPORTANT: ordering charges the credit balance or creates an invoice. Defaults to dry_run=true — only checks preset/OS availability and returns a summary without placing an order. For a real order pass dry_run=false and confirm=true after explicit user consent on the cost. Deploy takes 10–30 minutes; status via check_task. |
| reinstall_serverA | Reinstall OS on an existing server (simplified path via eq/order_instance with id). DESTRUCTIVE: all disk data will be erased. Requires HOSTKEY_ALLOW_DESTRUCTIVE=1 in the server environment, confirm=true, and re-entering the server's current hostname. Async: status via check_task. |
| call_api_rawA | Universal direct InvAPI call by resource and action, for resources without typed tools (e.g.: iso — ISO image library, s3 — S3 Object Storage, rhr — Remote Hands new version; see action list in the docs: https://hostkey.com/documentation/apidocs/). ALWAYS requires confirm=true; destructive/paid actions additionally require HOSTKEY_ALLOW_DESTRUCTIVE=1. Prefer typed tools when they exist for the needed operation. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| order_server_prompt | Guided Hostkey server order: location → preset → OS → software → traffic plan → cost confirmation → order. |
| reinstall_server_prompt | Guided Hostkey OS reinstall with checks and progress tracking. |
| troubleshoot_server_prompt | Diagnose Hostkey server issues: power, sensors, network — with recommendations. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 132 tools
Most tools map to distinct resource/action pairs, but several areas overlap: s3_get_buckets and s3_get_buckets_via_queue are explicitly duplicative, preset listing/getting/searching is split across multiple tools, and Remote Hands power/reboot requests sit alongside direct power/reboot tools. call_api_raw also overlaps with nearly every typed tool, so misselection is plausible despite generally helpful descriptions.
The set is predominantly snake_case with recognizable resource prefixes such as s3_, request_rh_, and dns. There are minor inconsistencies in verb choice (get vs list vs show) and some bare or abbreviated names like mass_pay, logout, and rhr, but the convention remains readable overall.
132 tools is far beyond a manageable surface and exceeds the rubric's 50+ extreme-mismatch threshold. Even for a broad hosting platform, the presence of call_api_raw suggests the typed surface could have been kept much smaller.
Coverage is broad across server lifecycle, billing, DNS, S3, networking, IPMI, snapshots, ISO management, API keys, and Remote Hands. Some operations are permission-gated, staff-only, or only available through call_api_raw, but overall the domain has few dead ends.