Skip to main content
Glama
README.md
# Hostkey MCP Server

MCP server for [Hostkey](https://hostkey.com/) (**.com** portal, InvAPI `invapi.hostkey.com`).
Runs locally over stdio — Cursor, VS Code, and other MCP clients.
Hosted remote: `https://mcp.hostkey.com/mcp` (cloud agents).

| | |
|---|---|
| **Endpoint** | `https://invapi.hostkey.com` (hardcoded) |
| **Auth** | `HOSTKEY_API_KEY` |
| **Tools** | 132 typed tools + `call_api_raw` |

Gives the model access to your Hostkey account: servers, catalog and ordering, power, OS reinstall,
network, DNS, snapshots, IPMI/console, ISO, S3, Remote Hands, billing, and API keys.

## 1. Get an API key

[InvAPI](https://invapi.hostkey.com) → API keys → create a key.

Prefer a dedicated key for MCP. Per-server keys limit access to one server.
DNS writes need the `pdns/edit` permission.

## 2. Install

### Cursor

[![Install in Cursor](https://cursor.com/deeplink/mcp-install-dark.svg)](https://cursor.com/install-mcp?name=hostkey-mcp-server&config=eyJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsImhvc3RrZXktbWNwLXNlcnZlciJdLCJlbnYiOnsiSE9TVEtFWV9BUElfS0VZIjoiWU9VUl9BUElfS0VZIn19)

Click the button, replace `YOUR_API_KEY` with your InvAPI key, then confirm.

Or add to `.cursor/mcp.json` manually:

```json
{
  "mcpServers": {
    "hostkey-mcp-server": {
      "command": "npx",
      "args": ["-y", "hostkey-mcp-server"],
      "env": {
        "HOSTKEY_API_KEY": "your-api-key"
      }
    }
  }
}
```

### Remote (cloud agents)

No local Node/`npx`. Point the client at the hosted endpoint and send your InvAPI key:

```json
{
  "mcpServers": {
    "hostkey": {
      "url": "https://mcp.hostkey.com/mcp",
      "headers": {
        "Authorization": "Bearer your-api-key"
      }
    }
  }
}
```

### VS Code

`.vscode/mcp.json`:

```json
{
  "servers": {
    "hostkey-mcp-server": {
      "command": "npx",
      "args": ["-y", "hostkey-mcp-server"],
      "env": {
        "HOSTKEY_API_KEY": "your-api-key"
      }
    }
  }
}
```

Optional: `HOSTKEY_TOKEN_TTL`, `HOSTKEY_HTTP_TIMEOUT`, `HOSTKEY_ALLOW_DESTRUCTIVE`
(see `.env.example`).

From source (Node.js ≥ 22.18): `npm install && npm run build`.

## 3. Confirming dangerous operations

Every write call needs `confirm=true`. Without it, nothing changes.

Also:

- `order_server` defaults to `dry_run` — a real order only after explicit consent;
- OS reinstall, PXE, and service cancellation require `HOSTKEY_ALLOW_DESTRUCTIVE=1`;
- passwords and tokens are masked in responses.

Long jobs (deploy, reinstall) return a callback key — poll with `check_task`.

## 4. Tools

Groups (full list via `tools/list`):

| Group | Examples |
|---|---|
| Servers | `get_servers`, `get_server`, `get_power_status` |
| Catalog | `list_presets`, `list_os`, `list_traffic_plans` |
| Power & order | `power_on`, `power_off`, `order_server`, `reinstall_server` |
| PXE | `create_reinstall_task` → … → `clear_pxe_config` |
| Network / DNS | ports, PTR, zones and records |
| Snapshots, ISO, S3 | VM snapshots, images, buckets |
| Remote Hands | duty-shift tickets (`request_rh_*`, `rhr_*`) |
| Billing | invoices, payments, contacts |
| Misc | `check_task`, `call_api_raw` |

## Prompts

| Prompt | Purpose |
|---|---|
| `order_server_prompt` | guided server order |
| `reinstall_server_prompt` | OS reinstall |
| `troubleshoot_server_prompt` | diagnostics |

Or just ask: “list my servers” / “order a VPS in NL”.

## Docs

- [Project status](docs/PROJECT.md)
- [Action log](docs/LOG.md)
- [QA: hosted URL](docs/QA-REMOTE.md)

TDQS

B3.1/5.0

Scored across 132 tools

Disambiguation3/5

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.

Naming Consistency4/5

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.

Tool Count1/5

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.

Completeness4/5

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.

Maintenance

ActivityMaintained
ResponsivenessNo issues